diff --git a/README.md b/README.md index be61070..a1321fb 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,27 @@ +- [About](#about) +- [Audience](#audience) +- [Status](#status) +- [Installation](#installation) + - [Install via git](#install-via-git) +- [Overview](#overview) +- [API](#api) + - [Repository](#repository) + - [Creating a repository](#creating-a-repository) + - [Check if path is a repository](#check-if-path-is-a-repository) + - [Find objects in a repository - THIS IS AN EVENT EMITTER](#find-objects-in-a-repository---this-is-an-event-emitter) + - [OCFL Object](#ocfl-object) + - [Create an object with an ID - ingest a folder](#create-an-object-with-an-id---ingest-a-folder) + - [Create an object with a path](#create-an-object-with-a-path) + - [Create an object with an ID - pass in a callback that will write to deposit path](#create-an-object-with-an-id---pass-in-a-callback-that-will-write-to-deposit-path) + - [Check if object exists at path](#check-if-object-exists-at-path) + - [Check if object can be created in the repo at path](#check-if-object-can-be-created-in-the-repo-at-path) + - [Load an object and getLatestInventory](#load-an-object-and-getlatestinventory) + - [Get object versions](#get-object-versions) + - [Load object and get information from it](#load-object-and-get-information-from-it) + - [Resolve file path relative to object root](#resolve-file-path-relative-to-object-root) + - [Export an object](#export-an-object) + - [Remove an object](#remove-an-object) + # About This is a pre-alpha nodejs library implement the (emerging) Oxford Common File Layout specification. @@ -13,40 +37,227 @@ and [demo](./demo.js) script show how to use the library. This is pre-alpha code which works but is not a complete implementation of the spec. What's working: -- Initialising a new (in an exsiting empty directory) or existing OCFL repository of version 1.0. -- Adding content from a directory to the the repository with an ID - the repository can store OCFL objects using Pairtree. -- Adding a new version of an object be inporting a new directory with the same ID. -- List all objects + +- Initialising a new (in an exsiting empty directory) or existing OCFL repository of version 1.0. +- Adding content from a directory to the the repository with an ID - the repository can store OCFL objects using Pairtree. +- Adding a new version of an object be inporting a new directory with the same ID. +- List all objects # Installation ## Install via git 1. Get the code: - ```git clone https://github.com/UTS-eResearch/ocfl-js.git``` + `git clone https://github.com/UTS-eResearch/ocfl-js.git` 2. Install it - ``` - cd ocfl-js - npm install . - ``` -3. Check that it works, but running the the tests - ``` - mocha - ``` + ``` + cd ocfl-js + npm install . + ``` +3. Check that it works, by running the tests + ``` + npm run tests + ``` Running the tests will create an example repository in ./test-data called `ocfl1` with a single item in it with 4 versions. +# Overview + +There are two main entry points - Repository and OcflObject. Repository is used to create a repository and +find objects within a repository whilst OcflObject encapsulates all operations of an object such that it can be used +standalone to the Repository (if you have an object in a path somewhere but there is no actual repo). + +# API + +## Repository + +### Creating a repository + +``` +// ensure the target folder for the repo exists +if (!await fs.exists(ocflRoot)) await fs.mkdirp(ocflRoot); + +// define the repo +repository = new Repository({ ocflRoot: 'some path' }); + +// create it +await repository.create()) +``` + +### Check if path is a repository + +``` +// define the repo +repository = new Repository({ ocflRoot: 'some path' }); + +// check for namaste file and return true or false +await repository.isRepository() +``` + +### Find objects in a repository - THIS IS AN EVENT EMITTER + +``` +// define the repo +repository = new Repository({ ocflRoot: 'some path' }); + +// find objects + repository.findObjects({}); + +// register with the 'object' event +repository.on("object", object=> { + console.log(object) + // returns an object that can be used in the constructor for OcflObject +}); +``` + +## OCFL Object + +General note: `update` will load the object and latest version state and return that +on successful update so you will automatically have the current internal file state +available. + +### Create an object with an ID - ingest a folder + +``` +// define the object +let object = new OcflObject({ ocflRoot: 'some-path', id: 'some-id }); + +// create (v1) or update object with content at `source` +await object.update({ source: '/path/to/some/content' }); + +// add some data to content at `source` + +// update object with content at `source` - v2 +await object.update({ source: '/path/to/some/content' }); + +``` + +### Create an object with a path + +``` +// define the object +let object = new OcflObject({ ocflRoot: 'some-path', objectPath: '/path/to/object' }); + +``` + +### Create an object with an ID - pass in a callback that will write to deposit path + +``` +// define the object +let object = new OcflObject({ ocflRoot: 'some-path', id: 'some-id }); + +// create (v1) or update object with content at `source` +await object.update({ writer: writeContent }); + +async function writeContent({ target }) { + for (let file of files ) { + await // write file to target (DEPOSIT PATH) + } +} + +``` + +### Check if object exists at path + +``` +// define the object +let object = new OcflObject({ ocflRoot: 'some-path', id: 'some-id }); + +await object.isObject() +``` + +### Check if object can be created in the repo at path + +``` +// define the object +let object = new OcflObject({ ocflRoot: 'some-path', id: 'some-id }); + +await object.isAvailable() +``` + +### Load an object and getLatestInventory + +``` +// define the object +let object = new OcflObject({ ocflRoot: 'some-path', id: 'some-id }); + +// load the object +await object.load(); + +// get the latestInventory +const inventory = await object.getLatestInventory(); +``` + +### Get object versions + +``` +// define the object +let object = new OcflObject({ ocflRoot: 'some-path', id: 'some-id }); + +// load the object +await object.load() + +// get the versions of the object +let versions = object.getVersions() +``` + +### Load object and get information from it + +``` +// define the object +let object = new OcflObject({ ocflRoot: 'some-path', id: 'some-id }); + +// load the object +await object.load() + +// get latest inventory +let r = await object.getLatestInventory() + +// get latest version state (the manifest of files for that version) +let r = await object.getLatestVersion() + +// get specific version inventory +let r = await object.getInventory({version: 'v2'}) + +// get specific version state +let r = await object.getVersion({version: 'v2'}) + +// load all version states in one hit - COULD BE VERY EXPENSIVE +await object.getAllVersions() +``` + +### Resolve file path relative to object root + +``` +// define the object +let object = new OcflObject({ ocflRoot: 'some-path', id: 'some-id }); + +// resolve a path relative to the object root +file = object.resolveFilePath({ filePath: 'relative/path/to/file}) + +// returns a full path to the object relative to ocflRoot +``` + +### Export an object + +``` +// define the object +let object = new OcflObject({ ocflRoot: 'some-path', id: 'some-id }); + +// export it +await object.export({target: '/path/to/export/folder' }) -## What we've got so far +// OR export a specific version of the object +await object.export({target: '/path/to/export/folder', version: 'v2' }) -Some tests. Run them with: - mocha +``` -A [demo](./demo.js) script that shows usage - how to intialise a repository (in -an empty directory) and add some simple file based content, then export all (two -of) the objects in the repository in all their versions. +### Remove an object -Run the demo by typing: - node demo.js +``` +// define the object +let object = new OcflObject({ ocflRoot: 'some-path', id: 'some-id }); -Inspect the output in `demo/export` +// remove it +await object.remove() +``` diff --git a/lib/ocflObject.js b/lib/ocflObject.js index 48f893f..32a486c 100644 --- a/lib/ocflObject.js +++ b/lib/ocflObject.js @@ -1,188 +1,618 @@ -const fs = require('fs-extra'); -const path = require('path'); -const hasha = require('hasha'); -const uuidv5 = require('uuid/v5'); -const _ = require('lodash'); -const DIGEST_ALGORITHM = 'sha512'; +const fs = require("fs-extra"); +const path = require("path"); +const hasha = require("hasha"); +const uuidv5 = require("uuid/v5"); +const pairtree = require("pairtree"); +const { + compact, + flatten, + flattenDeep, + orderBy, + groupBy, + cloneDeep +} = require("lodash"); + +const Repository = require("./repository"); + +const DIGEST_ALGORITHM = "sha512"; class OcflObject { - - - constructor(path) { - this.path = path; - this.ocflVersion = '1.0'; + constructor({ id, objectPath, ocflRoot }) { + this.ocflRoot = ocflRoot; + this.ocflVersion = "1.0"; + this.namaste = `0=${this.__nameVersion(this.ocflVersion)}`; this.contentVersion = null; // No content yet + this.versions = null; this.id = null; // Not set yet this.DIGEST_ALGORITHM = DIGEST_ALGORITHM; + if (objectPath) { + this.id = objectPath; + this.depositPath = path.join( + ocflRoot, + "deposit", + objectPath.replace("/", "") + ); + this.repositoryPath = path.join(ocflRoot, objectPath); + this.backupPath = path.join( + ocflRoot, + "backup", + objectPath.replace("/", "") + ); + } else if (id && !objectPath) { + const r = new Repository({ ocflRoot }); + this.id = r.objectIdToPath(id); + this.depositPath = path.join(ocflRoot, "deposit", id); + this.repositoryPath = path.join(ocflRoot, r.objectIdToPath(id)); + this.backupPath = path.join(ocflRoot, "backup", id); + } else { + // this is where we would auto generate id's if we want to support this... + } } - async writeInventories(inv, version) { - const main_inv = await fs.writeJson(path.join(this.path, 'inventory.json'), inv, { spaces: 2 }); - const version_inv = await fs.writeJson(path.join(this.path, version, 'inventory.json'), inv, { spaces: 2 }); - const inv_hash = await this.hash_file(path.join(this.path, 'inventory.json')) - const digest_file_v1 = await fs.writeFile(path.join(this.path, version, 'inventory.json.' + DIGEST_ALGORITHM), inv_hash + " inventory.json"); - const digest_file = await fs.writeFile(path.join(this.path, 'inventory.json.' + DIGEST_ALGORITHM), inv_hash + " inventory.json"); + // + // PUBLIC API + // + async update({ source = undefined, writer = undefined }) { + // only source OR writer (a callback) can be defined + // enforce this! + if (source && writer) + throw new Error("Specify only one of source or writer - not both."); + + // if neither - object to that too! + if (!source && !writer) + throw new Error("Specify at least one of source or writer."); + + // target will ALWAYS be the content folder relative to the deposit path + // it will either be v1 or the new version after the original + // object has been copied back in + + // version is the new version + let version, target; + ({ version, target } = await this.__initObject()); + + // either invoke the callers writer method + if (writer) { + await writer({ target }); + } else if (source) { + // or copy the content of source to the target folder + await fs.copy(source, target); + } - } + // get last inventory + let lastVersionInventory = await this.getLatestInventory(); + + // initialiase the current inventory off the new version + let currentVersionInventory = await this.__initialiseInventory({ + version, + target + }); + + // if there's a last inventory - ie this isn't a version 1 + if (lastVersionInventory) { + // generate a current version inventory relative to the previous + // inventory - that is, remove new files that haven't changed and map + // those back in to the previous version. + currentVersionInventory = await this.__generateCurrentInventory({ + lastVersionInventory, + currentVersionInventory, + target + }); + + // if null - no change - resolve() + if (!currentVersionInventory) { + return; + } - // addContent is passed an id and a callback - this takes one argument, the - // directory into which content is to be written. - // This is called for both new and merged versions: the incoming version is - // written as v1 of a new object in the deposit directory, and if it's not the - // first version it's then merged with the existing most recent version + // version n - write away! + await this.__writeVersion({ + inventory: currentVersionInventory + }); + } else { + // version 1 - write away! + await this.__writeVersion1({ + inventory: currentVersionInventory + }); + } - async addContent(id, writeContent) { - // Copy files into v1 + // load the new set of versions + await this.load(); - const version = "v1" // Always a fresh start as we're not touching an existing repo object - const versionPath = path.join(this.path, version, "content"); - await fs.ensureDir(versionPath); - await writeContent(versionPath); + // load the latest version state + await this.getLatestVersion(); - // Make an inventory - const inv = await this.inventory(id, versionPath); + // return the object + return this; + } - // Put the inventory in the root AND version dir - await this.writeInventories(inv, version) - this.contentVersion = await this.determineVersion(); - this.id = id; + async export({ target, version = null }) { + // can we use the target? does the folder exist and is it empty? + if (!(await fs.pathExists(target))) { + throw new Error(`Export target folder doesn't exist.`); + } + if ((await fs.readdir(target)).length) { + throw new Error(`Export target folder isn't empty.`); + } + await this.load(); + + // if version not defined - get the head version + if (!version) version = [...this.versions].pop().version; + const inventory = await this.getInventory({ version }); + if (!inventory.versions[version]) { + throw new Error("Can't export a version that doesn't exist."); + } + const state = inventory.versions[version].state; + for (const hash of Object.keys(state)) { + // Hashes point to arrays of paths + for (const f of state[hash]) { + const fileExportTo = path.join(target, f); + const fileExportFrom = path.join( + this.repositoryPath, + inventory.manifest[hash][0] + ); + await fs.copy(fileExportFrom, fileExportTo); + } + } } - // preserving the old interface here + // TODO: not yet implemented + async verify() {} - async importDir(id, sourceDir) { - await this.addContent(id, async (targetDir) => { - await fs.copy(sourceDir, targetDir); - }) + async isObject() { + // TODO: Check if this content root with NAMASTE and returns ocfl version + // 0=ocfl_object_1.0 + // looks at path and see if the content of the file is + // TODO: Make this look for a namaste file beginning with 0=ocfl_object_ and extract the version + return await fs.pathExists(path.join(this.repositoryPath, this.namaste)); } + async isAvailable() { + // return true if the objectPath is available to be used + // for an object + if (!(await fs.pathExists(this.repositoryPath))) return true; + let stats = await fs.stat(this.repositoryPath); + if (stats.isDirectory()) { + const ocflVersion = await this.isObject(this.repositoryPath); + const content = await fs.readdir(this.repositoryPath); + if (ocflVersion || content.length) return false; + } else { + return false; + } + return true; + } - async create(path) { - // Creates a blank object with a content dir but no content at - if (this.path) { - throw new Error("This object has already been initialized at: " + this.path) + async load() { + // Tries to load an existing object residing at this.repositoryPath + let stats; + try { + stats = await fs.stat(this.repositoryPath); + } catch (error) { + throw new Error( + `${this.repositoryPath} does not exist or is not a directory` + ); } - this.path = path; - const stats = await fs.stat(this.path); - if (await fs.pathExists(this.path) && stats.isDirectory()) { - const readDir = await fs.readdir(this.path); - if (readDir.length <= 0) { // empty so initialise an object here - const generateNamaste = await this.generateNamaste(this.path, this.ocflVersion); - } else { - throw new Error('can\'t initialise an object here as there are already files') - } + if ((await fs.pathExists(this.repositoryPath)) && stats.isDirectory()) { + const ocflVersion = await this.isObject(this.repositoryPath); + if (!ocflVersion) { + throw new Error(`This path doesn't look like an OCFL object`); + } + let inventory = path.join(this.repositoryPath, "inventory.json"); + inventory = await fs.readJson(inventory); + + const versions = Object.keys(inventory.versions).map(version => { + return { + version, + created: inventory.versions[version].created + }; + }); + this.versions = orderBy(versions, v => + parseInt(v.version.replace("v", "")) + ); } else { - //else if it doesnt it dies - throw new Error('directory does not exist'); + throw new Error(`${this.path} does not exist or is not a directory`); + } + } + + async remove() { + await fs.remove(this.repositoryPath); + return null; + } + + getVersions() { + return this.versions; + } + + async getAllVersions() { + for (let version of this.versions) { + for (let v of this.versions) { + await this.getVersion({ version: v.version }); + } } + return this.versions; } - async load(path) { - // Tries to load an existing object residing at - if (this.path) { - throw new Error("This object has already been initialized at: " + this.path) + async getVersion({ version }) { + if (version === "latest") { + version = [...this.versions].pop().version; } - this.path = path; - const stats = await fs.stat(this.path); - if (await fs.pathExists(this.path) && stats.isDirectory()) { - - const ocflVersion = await this.isObject(this.path); - if (!ocflVersion) { - throw new Error('can\'t initialise an object here as there are already files') - } - } else { - throw new Error(path + ' does not exist or is not a directory'); + let inventory = path.join(this.repositoryPath, version, "inventory.json"); + try { + inventory = await fs.readJson(inventory); + } catch (error) { + throw new Error("Unable to load version inventory."); } + let files = []; + for (let hash of Object.keys(inventory.manifest)) { + let items = inventory.manifest[hash]; + files.push( + items.map(item => { + return { + name: item.split("/").pop(), + path: item, + hash, + version: parseInt( + item + .split("/") + .shift() + .replace("v", "") + ) + }; + }) + ); + } + files = flattenDeep(files); + files = groupBy(files, "name"); + for (let file of Object.keys(files)) { + files[file] = orderBy(files[file], "version"); + } + + this.versions = this.versions.map(v => { + if (v.version === version) v.state = files; + return v; + }); + return this.versions.filter(v => v.version === version)[0]; } - getVersionString(i) { - // Make a version name as per the SHOULD in the spec v1..vn - // TODO have an option for zero padding - return "v" + i + getLatestVersion() { + let latestVersion = cloneDeep(this.versions).pop(); + if (latestVersion.state) return latestVersion; + return this.getVersion({ version: latestVersion.version }); } - async getInventory() { - const inventoryPath = path.join(this.path, "inventory.json"); + async getInventory({ version }) { + const inventoryPath = path.join( + this.repositoryPath, + version, + "inventory.json" + ); if (await fs.exists(inventoryPath)) { - return await JSON.parse(fs.readFileSync(inventoryPath)); + return await fs.readJSON(inventoryPath); + } else { + return null; } - else { + } + + async getLatestInventory() { + const inventoryPath = path.join(this.repositoryPath, "inventory.json"); + if (await fs.exists(inventoryPath)) { + return await fs.readJSON(inventoryPath); + } else { return null; } } - async determineVersion() { - const inv = await this.getInventory(); - if (inv) { - return inv.head; + resolveFilePath({ filePath }) { + return path.join(this.repositoryPath, filePath); + } + + // + // PRIVATE METHODS + // + + async __initObject() { + // check deposit to see if this object is already being operated on + if (await fs.pathExists(this.depositPath)) + throw new Error( + `An object with that ID is already in the deposit path: ${this.depositPath}` + ); + + // ensure the object is not the child of another object + if (await this.__isChildOfAnotherObject()) + throw new Error( + `This object is a child of an existing object and that's not allowed.` + ); + + // if not - init the deposit path + await fs.mkdirp(this.depositPath); + + // check if this object is in the repo and sync the content back to deposit + if (await fs.pathExists(this.repositoryPath)) { + // copy the current object back to deposit + await fs.copy(this.repositoryPath, this.depositPath); + + // add the next version path + const latestInventory = await this.getLatestInventory(); + const nextVersion = + "v" + (parseInt(latestInventory.head.replace("v", "")) + 1); + const versionPath = path.join(this.depositPath, nextVersion, "/content"); + await fs.ensureDir(versionPath); + + return { version: nextVersion, target: versionPath }; + } else { + // init deposit with a version 1 + await this.__generateNamaste(); + const versionPath = path.join(this.depositPath, "v1/content"); + await fs.ensureDir(versionPath); + return { version: "v1", target: versionPath }; } - else { - return null; + } + + async __isChildOfAnotherObject() { + // this path cannot be the child of another object + // we can determine that by walking back up the path and looking + // for an "0=" + this.nameVersion(this.ocflVersion) file + const pathComponents = compact(this.repositoryPath.split("/")); + + // ditch the final path element - we're only checking parents + // so by definition, the final path element is the one we're on + pathComponents.pop(); + if (pathComponents.length === 1) { + // we must be at the ocflRoot so we're ok to continue + return false; } - // Here's not how to do it: - /* var version = 0; - const dirContents = await fs.readdir(this.path); - for (let f of dirContents.filter(function(d){return d.match(/^v\d+$/)})){ - const v = parseInt(f.replace("v","")); - if (v > version) { - version = v; - } + let parentIsOcflObject = []; + let objectPath = pathComponents.shift(); + for (let p of pathComponents) { + objectPath = path.join(objectPath, p); + parentIsOcflObject.push( + await fs.pathExists(path.join(objectPath, this.namaste)) + ); + } + return parentIsOcflObject.includes(true); + } + + async __initialiseInventory({ version, target }) { + const inv = { + id: this.id, + type: "https://ocfl.io/1.0/spec/#inventory", + digestAlgorithm: this.DIGEST_ALGORITHM, + head: version, + versions: {} + }; + inv.versions[version] = { + created: new Date().toISOString(), + state: {} + }; + // TODO Message and state keys in version + var hashpairs = await this.__digest_dir(target); + var versionState = inv.versions[version].state; + inv["manifest"] = {}; + for (let i = 0; i < hashpairs.length; i += 2) { + const thisHash = hashpairs[i + 1]; + const thisPath = path.relative(this.depositPath, hashpairs[i]); + const versionPath = path.relative( + path.join(version, "content"), + thisPath + ); + if (!inv.manifest[thisHash]) { + inv.manifest[thisHash] = [thisPath]; + } else { + inv.manifest[thisHash].push(thisPath); + } + + if (!versionState[thisHash]) { + versionState[thisHash] = [versionPath]; + } else { + versionState[thisHash].push(versionPath); + } } - return version;10. */ - // Look at each dir that matches v\d+ + return inv; + } + async __writeInventories({ inventory }) { + // write root inventory and inventory hash file + let inventoryFile = path.join(this.depositPath, "inventory.json"); + await fs.writeJson(inventoryFile, inventory, { spaces: 2 }); + const inventoryHash = await this.__hash_file(inventoryFile); + await fs.writeFile( + `${inventoryFile}.${this.DIGEST_ALGORITHM}`, + `${inventoryHash} inventory.json` + ); + + // write version inventory and inventory hash file + inventoryFile = path.join( + this.depositPath, + inventory.head, + "inventory.json" + ); + await fs.writeJson(inventoryFile, inventory, { spaces: 2 }); + await fs.writeFile( + `${inventoryFile}.${this.DIGEST_ALGORITHM}`, + `${inventoryHash} inventory.json` + ); } - async isObject(aPath) { - // TODO: Check if this content root with NAMASTE and returns ocfl version - // 0=ocfl_object_1.0 - // looks at path and see if the content of the file is - // TODO: Make this look for a namaste file beginning with 0=ocfl_object_ and extract the version - const theFile = path.join(aPath, "0=" + this.nameVersion(this.ocflVersion)); - return await fs.pathExists(theFile); + async __writeVersion1({ inventory }) { + try { + // Put the inventory in the root AND version folder + await this.__writeInventories({ inventory }); + this.contentVersion = inventory.head; + + // move the deposit object to the repository + await fs.move(this.depositPath, this.repositoryPath); + await fs.remove(this.depositPath); + } catch (error) { + throw new Error("Error moving deposit object to repository."); + } + } + + async __writeVersion({ inventory }) { + // put the inventory in the root AND version folder + await this.__writeInventories({ inventory }); + this.contentVersion = inventory.head; + + try { + // temporarily move the original object if it exists + if (await fs.pathExists(this.repositoryPath)) + await fs.move(this.repositoryPath, this.backupPath); + + // move the deposit object to the repository + await fs.move(this.depositPath, this.repositoryPath); + + // cleanup - remove deposit object and backed up original + await fs.remove(this.depositPath); + await fs.remove(this.backupPath); + } catch (error) { + throw new Error("Error moving deposit object to repository."); + } } - nameVersion(version) { - return 'ocfl_object_' + version; + async __generateCurrentInventory({ + lastVersionInventory, + currentVersionInventory, + target + }) { + let manifest = {}; + + // iterate over currentVersionInventory manifest entries + for (let entry of Object.entries(currentVersionInventory.manifest)) { + let hash = entry[0]; + const currentVersionFiles = entry[1]; + const lastVersionFiles = lastVersionInventory.manifest[hash] || []; + + // figure out whether the files are the same, new or deleted. + let files = await this.__processFiles({ + currentVersion: currentVersionInventory.head, + depositPath: this.depositPath, + currentVersionFiles, + lastVersionFiles + }); + manifest[hash] = files; + } + + // udpate the currentVersionInventory manifest + currentVersionInventory.manifest = manifest; + + // remove empty version folders + await this.__removeEmptyDirectories({ + folder: target + }); + + // return if there's no change to the object + const lastVersionManifestHash = hasha( + JSON.stringify(lastVersionInventory.manifest) + ); + const currentVersionManifestHash = hasha( + JSON.stringify(currentVersionInventory.manifest) + ); + if (lastVersionManifestHash === currentVersionManifestHash) { + await fs.remove(this.depositPath); + return null; + } + + // otherwise - map the old versions in to the current inventory + currentVersionInventory.versions = { + ...lastVersionInventory.versions, + ...currentVersionInventory.versions + }; + + // return the verified currentVersionInventory + return currentVersionInventory; + } + + async __processFiles({ + currentVersion, + depositPath, + currentVersionFiles, + lastVersionFiles + }) { + let files = [...currentVersionFiles, ...lastVersionFiles]; + + // group files by their relative paths with version stripped off + files = groupBy(files, file => + file + .split("/") + .slice(1) + .join("/") + ); + + // expect to see something like + /* + { + 'content/file1.txt': [ 'v5/content/file1.txt', 'v4/content/file1.txt' ], + 'content/file2.txt': [ 'v3/content/file2.txt' ] + } + */ + + // iterate over the file list and remove anything that doesn't have a current version + // that's a file that has been removed so we don't want to return that to the manifest + for (let file of Object.keys(files)) { + let hasCurrentVersion = files[file].filter(f => f.match(currentVersion)); + if (!hasCurrentVersion.length) delete files[file]; + } + + // expect to see something like - note file2 is not there + /* + { + 'content/file1.txt': [ 'v5/content/file1.txt', 'v4/content/file1.txt' ], + } + */ + + // iterate over the remaining file list and pick out the earliest version + // of each file and return that. + // + // if there's only one version - then return that as it's a new file + let remappedFiles = []; + for (let file of Object.keys(files)) { + // two versions - remove the first (newest - remember, the hash is the same) + if (files[file].length === 2) { + await fs.remove(path.join(depositPath, files[file].shift())); + } + // return whatever is left - this could be either the older of two versions + // or a single version if it's a new file + remappedFiles.push(...files[file]); + } + return remappedFiles; } - async generateNamaste(aPath, version) { - const fileName = '0=' + this.nameVersion(version); - const thePath = path.join(aPath, fileName); - const writeFile = await fs.writeFile(thePath, this.nameVersion(version)); - const contentDir = await fs.mkdir(path.join(aPath, "v1")); + __nameVersion() { + return `ocfl_object_${this.ocflVersion}`; } + async __generateNamaste() { + const namasteFile = path.join(this.depositPath, this.namaste); + await fs.writeFile(namasteFile, this.__nameVersion()); + } - async digest_dir(dir) { + async __digest_dir(dir) { var items = {}; const contents = await fs.readdir(dir); - items = _.flatten(await Promise.all(contents.map(async (p1) => { - const p = path.join(dir, p1); - const stats = await fs.stat(p); - if (stats.isDirectory()) { - return await this.digest_dir(p); - } else { - const h = await this.hash_file(p); - return [p, h]; - } - }))); + items = flatten( + await Promise.all( + contents.map(async p1 => { + const p = path.join(dir, p1); + const stats = await fs.stat(p); + if (stats.isDirectory()) { + return await this.__digest_dir(p); + } else { + const h = await this.__hash_file(p); + return [p, h]; + } + }) + ) + ); return items; } - async hash_file(p) { - const hash = await hasha.fromFile(p, { algorithm: DIGEST_ALGORITHM }) + async __hash_file(p) { + const hash = await hasha.fromFile(p, { algorithm: DIGEST_ALGORITHM }); return hash; } - - async removeEmptyDirectories(folder) { + async __removeEmptyDirectories({ folder }) { // Remove empty directories // Adapted (nade async) from: https://gist.github.com/jakub-g/5903dc7e4028133704a4 - if (!folder) { - folder = this.path; - } + if (!folder) folder = this.depositPath; const stats = await fs.stat(folder); var isDir = await stats.isDirectory(); if (isDir) { @@ -190,76 +620,156 @@ class OcflObject { if (files.length > 0) { for (let f of files) { var fullPath = path.join(folder, f); - await this.removeEmptyDirectories(fullPath); + await this.__removeEmptyDirectories({ folder: fullPath }); } files = await fs.readdir(folder); } - if (files.length == 0) { - const rm = await fs.rmdir(folder); - return; - } + if (!files.length) await fs.rmdir(folder); } } - async inventory(id, dir) { - const versionId = "v1"; - const inv = { - 'id': id, - 'type': 'https://ocfl.io/1.0/spec/#inventory', - 'digestAlgorithm': DIGEST_ALGORITHM, - 'head': versionId, - 'versions': { - - } - }; - inv.versions[versionId] = { - "created": new Date().toISOString(), - "state": {} - } - // TODO Message and state keys in version - var hashpairs = await this.digest_dir(dir); - var versionState = inv.versions[versionId].state; - inv['manifest'] = {}; - for (let i = 0; i < hashpairs.length; i += 2) { - const thisHash = hashpairs[i + 1] - const thisPath = path.relative(this.path, hashpairs[i]) - const versionPath = path.relative(path.join("v1", "content"), thisPath) - if (!inv['manifest'][thisHash]) { - //Store only ONE path - inv['manifest'][thisHash] = [thisPath] - } - else { - // TODO DELETE THIS FILE FROM THE OBJECT BEFORE WE STORE IT - } - - if (versionState[thisHash]) { - // Store all - versionState[thisHash].push(versionPath) - } - else { - versionState[thisHash] = [versionPath] - - } - - } - return inv - } - - async getFilePath(filePath, version) { - const inv = await this.getInventory(); - if (!version) { - version = inv.head; - } - const state = inv.versions[version].state; - for (let hash of Object.keys(state)) { - const aPath = state[hash]; - const findPath = _.find(aPath, (p) => p === filePath); - if (findPath) { - return inv.manifest[hash][0]; - } - } - throw new Error('cannot find file'); - } + // addContent is passed an id and a callback - this takes one argument, the + // directory into which content is to be written. + // This is called for both new and merged versions: the incoming version is + // written as v1 of a new object in the deposit directory, and if it's not the + // first version it's then merged with the existing most recent version + // async addContent({ id, writeContent }) { + // // Copy files into v1 + // const version = "v1"; // Always a fresh start as we're not touching an existing repo object + // const versionPath = path.join(this.path, version, "content"); + // await fs.ensureDir(versionPath); + // await writeContent(versionPath); + + // // Make an inventory + // const inv = await this.inventory(id, versionPath); + + // // Put the inventory in the root AND version dir + // await this.writeInventories({ inventory: inv, newVersion: version }); + // this.contentVersion = await this.determineVersion(); + // this.id = id; + // } + + // // preserving the old interface here + // async importDir({ id, source }) { + // await this.addContent({ + // id, + // writeContent: async target => { + // await fs.copy(source, target); + // } + // }); + // } + + // async create() { + // // Creates a blank object with a content dir but no content at + // // if (this.path) { + // // throw new Error( + // // "This object has already been initialized at: " + this.path + // // ); + // // } + // // this.path = path; + // try { + // const stats = await fs.stat(this.path); + // if ((await fs.pathExists(this.path)) && stats.isDirectory()) { + // const readDir = await fs.readdir(this.path); + // if (readDir.length <= 0) { + // // empty so initialise an object here + // await this.generateNamaste(); + // } else { + // throw new Error( + // "can't initialise an object here as there are already files" + // ); + // } + // } + // } catch (error) { + // // path doesn't exist - create and initialise object there + // await fs.mkdirp(this.path); + // await this.generateNamaste(); + // } + // } + + // getVersions() { + // return cloneDeep(this.versions); + // } + + // getVersionString(i) { + // // Make a version name as per the SHOULD in the spec v1..vn + // // TODO have an option for zero padding + // return "v" + i; + // } + + // async determineVersion() { + // const inv = await this.getLatestInventory(); + // if (inv) { + // return inv.head; + // } else { + // return null; + // } + // // Here's not how to do it: + // /* var version = 0; + // const dirContents = await fs.readdir(this.path); + // for (let f of dirContents.filter(function(d){return d.match(/^v\d+$/)})){ + // const v = parseInt(f.replace("v","")); + // if (v > version) { + // version = v; + // } + // } + // return version;10. */ + // // Look at each dir that matches v\d+ + // } + + // async inventory(id, dir) { + // const versionId = "v1"; + // const inv = { + // id: id, + // type: "https://ocfl.io/1.0/spec/#inventory", + // digestAlgorithm: DIGEST_ALGORITHM, + // head: versionId, + // versions: {} + // }; + // inv.versions[versionId] = { + // created: new Date().toISOString(), + // state: {} + // }; + // // TODO Message and state keys in version + // var hashpairs = await this.digest_dir(dir); + // var versionState = inv.versions[versionId].state; + // inv["manifest"] = {}; + // for (let i = 0; i < hashpairs.length; i += 2) { + // const thisHash = hashpairs[i + 1]; + // const thisPath = path.relative(this.path, hashpairs[i]); + // const versionPath = path.relative(path.join("v1", "content"), thisPath); + // if (!inv["manifest"][thisHash]) { + // //Store only ONE path + // inv["manifest"][thisHash] = [thisPath]; + // } else { + // // TODO DELETE THIS FILE FROM THE OBJECT BEFORE WE STORE IT + // } + + // if (versionState[thisHash]) { + // // Store all + // versionState[thisHash].push(versionPath); + // } else { + // versionState[thisHash] = [versionPath]; + // } + // } + // return inv; + // } + + // async getFilePath(filePath, version) { + // const inv = await this.getInventory(); + // if (!version) { + // version = inv.head; + // } + // const state = inv.versions[version].state; + // for (let hash of Object.keys(state)) { + // const aPath = state[hash]; + // const findPath = _.find(aPath, p => p === filePath); + // if (findPath) { + // return inv.manifest[hash][0]; + // } + // } + // throw new Error("cannot find file"); + // } } module.exports = OcflObject; diff --git a/lib/repository.js b/lib/repository.js index 3908ff5..1c09c2b 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -1,333 +1,369 @@ -const fs = require('fs-extra'); -const path = require('path'); -const pairtree = require('pairtree') -const OcflObject = require('./ocflObject'); -const uuidv4 = require("uuidv4") +const fs = require("fs-extra"); +const path = require("path"); +const pairtree = require("pairtree"); +const EventEmitter = require("events"); const DEPOSIT_DIR = "deposit"; -class Repository { - constructor() { - this.ocflVersion = '1.0'; +class Repository extends EventEmitter { + constructor({ ocflRoot }) { + super(); + this.ocflVersion = "1.0"; + this.ocflRoot = ocflRoot; + this.namaste = path.join(this.ocflRoot, `0=ocfl_${this.ocflVersion}`); // For now we only put things on pairtree paths this.objectIdToPath = pairtree.path; } - async create(path) { - if (this.path) { - throw new Error("This repository has already been initialized.") - } - this.path = path; - - // Sets up an empty repository minus the requisite /v1 directory - //checks if the dir exists else dies - const stats = await fs.stat(this.path); - if (await fs.pathExists(this.path) && stats.isDirectory()) { - const readDir = await fs.readdir(this.path); - if (readDir.length <= 0) { // empty so initialise a repo here - const generateNamaste = await this.generateNamaste(this.path, this.ocflVersion); - } - else { - throw new Error('can\'t initialise a repository as there are already files.' ) + // + // PUBLIC API + // + + async create() { + // Sets up an empty repository + if (await fs.pathExists(this.ocflRoot)) { + const stats = await fs.stat(this.ocflRoot); + if (stats.isDirectory()) { + if (await fs.pathExists(this.namaste)) { + throw new Error("This repository has already been initialized."); } - } - else { - //else if dir doesn't exist it dies - throw new Error('directory does not exist'); - } - } - async load(path) { - // Connects to an existing repo residing at - if (this.path) { - throw new Error("This repository has already been initialized.") - } - this.path = path; - const stats = await fs.stat(this.path); - if (await fs.pathExists(this.path) && stats.isDirectory()) { - const version = await this.isContentRoot(this.path); - if (!version) { - throw new Error('Not an OCFL repository.'); + const readDir = await fs.readdir(this.ocflRoot); + if (readDir.length <= 0) { + // empty so initialise a repo here + await this.__generateNamaste(); + } else { + throw new Error( + "Can't initialise a repository as there are already files." + ); } - } - else { - throw new Error('Directory does not exist.'); - } -} - - async export(id, exportPath, options) { - // Exports a directory to exportPath - // TODO consider moving this to the object class - if (!await fs.pathExists(exportPath)) { - throw new Error("Can't export as the directory does not exist."); - } - - const stats = await fs.stat(exportPath); - - if (stats.isDirectory()) { - const readDir = await fs.readdir(exportPath); - if (readDir.length > 0) { // NOt empty so complain - throw new Error("Can't export as the directory has stuff in it."); } } else { - throw new Error("Can't export to an existing file."); - } - - // TODO handle versions look in options.version - - - // TODO handle options link - // TODO make a new method objectIdToAbsolute path - const objectPath = path.join(this.path, this.objectIdToPath(id)); - const objToExport = new OcflObject(); - objToExport.load(objectPath); - const inv = await objToExport.getInventory(); - var ver = inv.head; - if (options && options.version) { - ver = options.version; - } - if (!inv.versions[ver]) { - throw new Error("Can't export a version that doesn't exist.") - } - const state = inv.versions[ver].state; - for (const hash of Object.keys(state)) { - // Hashes point to arrays of paths - for (const f of state[hash]) { - const fileExportTo = path.join(exportPath, f); - const fileExportFrom = path.join(objToExport.path, inv.manifest[hash][0]); - const copied = await fs.copy(fileExportFrom, fileExportTo); - } + //else if dir doesn't exist it dies + throw new Error("Directory does not exist"); } } - async objects() { - var objects = []; - const o = await this.findObjects(this.path, objects); - return objects; + async isRepository() { + return await fs.pathExists(this.namaste); } - incrementVersion(ver) { - return "v" + (parseInt(ver.replace("v", "")) + 1) - } + async findObjects({ root }) { + if (!root) root = this.ocflRoot; - async findObjects(dir, objects) { // Recursive function to find OCFL objects - const dirs = await fs.readdir(dir); + const dirs = await fs.readdir(root); for (let d of dirs) { - const potential_dir = path.join(dir, d); - const stats = await fs.stat(potential_dir); - if (d != DEPOSIT_DIR && await fs.pathExists(potential_dir) && stats.isDirectory()) { - + const potentialObject = path.join(root, d); + const stats = await fs.stat(potentialObject); + if (stats.isDirectory()) { // Looks like an an object - const object = new OcflObject() - const objectNamastePath = path.join(potential_dir, "0=" + object.nameVersion(this.ocflVersion)); - - if (await fs.exists(objectNamastePath)) { - const o = await object.load(potential_dir) - objects.push(object) - } - else { - objects.concat(await this.findObjects(potential_dir, objects)); + if (potentialObject.match(DEPOSIT_DIR)) continue; + if ( + await fs.pathExists( + path.join(potentialObject, `0=ocfl_object_${this.ocflVersion}`) + ) + ) { + const objectConstructer = { + ocflRoot: this.ocflRoot, + objectPath: potentialObject.replace(this.ocflRoot, "") + }; + this.emit("object", objectConstructer); + } else { + this.findObjects({ root: potentialObject }); } } - } - return objects; } + // + // PRIVATE API + // - async makeDepositPath(id) { - // Make sure we have a working directory - const depositPath = path.join(this.path, DEPOSIT_DIR); - if (!await fs.pathExists(depositPath)) { - const depositDir = await fs.mkdir(depositPath); - } - - // Make a temp directory under STORAGE_ROOT/deposit/ - // Use pairtree to escape path but get rid of long path - const objectDepositPath = path.join(this.path, "deposit", this.objectIdToPath(id).replace(/\//g, "")); - if (await fs.pathExists(objectDepositPath)) { - throw new Error('There is already an object with this ID being deposited or left behind after a crash. Cannot proceed.') - } - await fs.mkdirp(objectDepositPath); - return objectDepositPath; + __nameVersion(version) { + return `ocfl__${version}`; } - - async importNewObjectDir(id, sourceDir) { - - // Add an object to the repository given a source directory - // id = an optional id String - // dir = a directory somewhere on disk - - return await this.createNewObjectContent(id, async (targetDir) => { - await fs.copy(sourceDir, targetDir); - }); - - } - - - - - - async createNewObjectContent(id, writeContent) { - - // Add an object to the repository with a callback that provides the content. - // This is called by importNewObject under the hood - // writeContent = a callback that takes one argument, the directory to - // which content is to be written (in the repo's deposit directory) - // id = an optional id String - - - // Make a temp random ID used for deposit - - // If no ID supplied use the random one - gets returned later - // TODO: Make this a URI - if (!id) { id = uuidv4() }; - - - const objectDepositPath = await this.makeDepositPath(id); - - // Make a temp object in the /deposit dir in our repo - const object = new OcflObject(); - const oi = await object.create(objectDepositPath); - - // Add content by initialising object with the calllback - const initialized = await object.addContent(id, writeContent); - const objectRepoPath = path.join(this.path, this.objectIdToPath(id)); - - // Move (not copy) the new object to the repository - if (!await fs.pathExists(objectRepoPath)) { - var subPath = objectRepoPath - do { - subPath = path.join(subPath, ".."); - if (await object.isObject(subPath)) { - throw new Error("Cannot make an object. There is already an object in a higher level directory.") - } - } while (subPath.startsWith(this.path)); - await object.removeEmptyDirectories(); - await fs.move(objectDepositPath, objectRepoPath); - } else { - // Directory exists, it might be our object but it might be on a path of an existing one (which is bad) - if (!await object.isObject(objectRepoPath)) { - throw new Error("There is no object here but the path already exists is this ID a subset of a longer one?") - } - // Merge object - const added = await this.mergeObjectWith(object, objectRepoPath); - } - const newObj = new OcflObject(); - await newObj.load(objectRepoPath); - return newObj; - } - - - - - async mergeObjectWith(newObject, prevObjectPath) { - // Merge an object that's being submitted with one from the repositopry - // We'll call this objec the NEW object and the one in the repo the prev object - - // Get the inventory from the existing object - const prevObject = new OcflObject(); - const o = await prevObject.load(prevObjectPath); - - const prevInventory = await prevObject.getInventory(); - const newInventory = await newObject.getInventory(); - - // Get latest state - const prevVersion = prevInventory.head; - const prevState = prevInventory.versions[prevVersion].state - const newState = newInventory.versions["v1"].state - - // Check whether this is just the same thing exactly as the last one - if (Object.keys(newState).length === Object.keys(prevState).length) { - // Same length, so may be the same - var same = true; - for (let hash of Object.keys(newState)) { - if (!prevState[hash]) { - same = false; - break; - } - } - if (same) { - // First, do no harm - // ie do nothing - return prevObject; - } - } - - // Increment version number from existing object - const newVersion = this.incrementVersion(prevVersion) - - // Move our v1 stuff to the new version number (we may delete some of it) - const moved = await fs.move(path.join(newObject.path, "v1"), path.join(newObject.path, newVersion)); - const newVersionPath = path.join(newObject.path, newVersion) - - // Go thru latest state one hash at a time - for (let hash of Object.keys(newState)) { - // Inheritance: Files inherited from the previous version unchanged are - //referenced in the state block of the new version. These entries will be - // identical to the corresponding entries in the previous version's state - // block. - - // THAT IS: If there's already a manifest entry for this then remove the file and leave the entry here - - // Now that we've checked agains the latest version, check against the all-time store of hashes we know about - //for (let file of newState[hash]) { - for (var i = 0; i < newState[hash].length; i += 1) { - const file = newState[hash][i]; - if (!prevInventory.manifest[hash]) { - // We don't have a copy of this anywhere - // Addition: Newly added files appear as new entries in the state block of - // the new version. The file should be stored and an entry for the new - // content must be made in the manifest block of the object's inventory. - prevInventory.manifest[hash] = [path.join(newVersion, "content", file)]; - // now we have at least one copy - subsequent copies in incoming objects can be deleted - } - else { - // We have a copy of this file so delete the physical file - // the file we have could be inhereted or re-instated - const filePath = path.join(newVersionPath, "content", file); - const del = await fs.remove(filePath); - } - - } - } - // Spec says: - // Deletion: Files deleted from the previous version are simply removed - // from the state block of the new version - // BUT: We never added them so nothing to do! - prevInventory.versions[newVersion] = newInventory.versions["v1"] // As updated - prevInventory.head = newVersion; - // Copy in the new version dir - const invs = await newObject.writeInventories(prevInventory, newVersion) - const rm = await newObject.removeEmptyDirectories(); - const vmoved = await fs.move(newVersionPath, path.join(prevObject.path, newVersion)); - const invs_new = await prevObject.writeInventories(prevInventory, newVersion); - // Clean up temp deposit dir - const rm1 = await fs.remove(newObject.path); - + async __generateNamaste() { + await fs.writeFile(this.namaste, this.ocflVersion); } - async isContentRoot(aPath) { - // 0=ocfl_1.0 - // looks at path and see if the content of the file is - const namastePath = path.join(aPath, "0=" + this.nameVersion(this.ocflVersion)); - return await fs.pathExists(namastePath); - } - async containsContentRoot(aPath) { - // TODO - } - - nameVersion(version) { - return 'ocfl_' + version; - } - - async generateNamaste(aPath, version) { - const fileName = '0=' + this.nameVersion(version); - const thePath = path.join(aPath, fileName); - const writeFile = await fs.writeFile(thePath, this.nameVersion(version)); - } + // incrementVersion(ver) { + // return "v" + (parseInt(ver.replace("v", "")) + 1); + // } + // async objects() { + // var objects = []; + // const o = await this.findObjects({ dir: this.ocflRoot, objects }); + // return objects; + // } + + // async export({ id, target, options }) { + // const sourceObject = new OcflObject({ + // ocflRoot: this.ocflRoot, + // objectPath: this.objectIdToPath(id) + // }); + + // let targetUseable = false; + // if (await fs.pathExists(target)) { + // let stats = await fs.stat(target); + // if (stats.isDirectory()) { + // const content = await fs.readdir(target); + // if (!content.length) targetUseable = true; + // } + // } else { + // targetUseable = true; + // } + // if (!targetUseable) + // throw new Error( + // "That target is not useable. A non existent path or an empty folder is required." + // ); + + // // TODO handle versions look in options.version + + // // TODO handle options link + // // TODO make a new method objectIdToAbsolute path + + // await fs.mkdir(target); + + // sourceObject.load(); + // const inv = await sourceObject.getLatestInventory(); + // var ver = inv.head; + // if (options && options.version) { + // ver = options.version; + // } + // if (!inv.versions[ver]) { + // throw new Error("Can't export a version that doesn't exist."); + // } + // const state = inv.versions[ver].state; + // for (const hash of Object.keys(state)) { + // // Hashes point to arrays of paths + // for (const f of state[hash]) { + // const fileExportTo = path.join(target, f); + // const fileExportFrom = path.join( + // sourceObject.path, + // inv.manifest[hash][0] + // ); + // const copied = await fs.copy(fileExportFrom, fileExportTo); + // } + // } + + // async isContentRoot(aPath) { + // // 0=ocfl_1.0 + // // looks at path and see if the content of the file is + // return await fs.pathExists(this.namaste); + // } + // async containsContentRoot(aPath) { + // // TODO + // } + // async makeDepositPath({ id }) { + // // Make sure we have a working directory + // const depositPath = path.join(this.path, DEPOSIT_DIR); + // if (!(await fs.pathExists(depositPath))) { + // const depositDir = await fs.mkdir(depositPath); + // } + + // // Make a temp directory under STORAGE_ROOT/deposit/ + // // Use pairtree to escape path but get rid of long path + // const objectDepositPath = path.join( + // this.path, + // "deposit", + // this.objectIdToPath(id).replace(/\//g, "") + // ); + // if (await fs.pathExists(objectDepositPath)) { + // throw new Error( + // "There is already an object with this ID being deposited or left behind after a crash. Cannot proceed." + // ); + // } + // await fs.mkdirp(objectDepositPath); + // return objectDepositPath; + // } + + // async importNewObjectDir({ id, sourceDir }) { + // // Add an object to the repository given a source directory + // // id = an optional id String + // // dir = a directory somewhere on disk + // return await this.createNewObjectContent({ + // id, + // writeContent: async targetDir => { + // await fs.copy(sourceDir, targetDir); + // } + // }); + // } + + // async createNewObjectContent({ id, writeContent }) { + // // Add an object to the repository with a callback that provides the content. + // // This is called by importNewObject under the hood + // // writeContent = a callback that takes one argument, the directory to + // // which content is to be written (in the repo's deposit directory) + // // id = an optional id String + + // // Make a temp random ID used for deposit + + // // If no ID supplied use the random one - gets returned later + // // TODO: Make this a URI + // if (!id) { + // id = uuidv4(); + // } + + // const repositoryObject = new OcflObject({ + // ocflRoot: this.ocflRoot, + // id + // }); + // // await repositoryObject.create(); + + // // const objectDepositPath = await this.makeDepositPath({ id }); + + // // console.log("(((", objectDepositPath); + // const depositObject = new OcflObject({ + // ocflRoot: path.join(this.ocflRoot, "deposit"), + // id + // }); + // await depositObject.create(); + + // // Check that no parent path is an OCFL object + // if (await this.isChildOfAnotherObject({ id })) { + // throw new Error( + // `A parent of this path seems to be an OCFL object and that's not allowed` + // ); + // } + + // // Add content by initialising object with the calllback + // const initialized = await depositObject.addContent(id, writeContent); + + // if (!(await repositoryObject.getLatestInventory())) { + // await fs.move(`${depositObject.path}/`, `${repositoryObject.path}/`); + // } else { + // // Merge object + // await this.mergeObjectWith(depositObject, repositoryObject); + // } + // depositObject.remove(); + + // const newObj = new OcflObject({ ocflRoot: this.ocflRoot, id }); + // await newObj.load(); + // return newObj; + // } + + // async isChildOfAnotherObject({ id, aPath }) { + // if (id) aPath = pairtree.path(id); + + // // this path cannot be the child of another object + // // we can determine that by walking back up the path and looking + // // for an "0=" + this.nameVersion(this.ocflVersion) file + // const pathComponents = compact(aPath.split("/")); + + // // ditch the final path element - we're only checking parents + // // so by definition, the final path element is the one we're on + // pathComponents.pop(); + // let parentIsOcflObject = []; + // aPath = this.ocflRoot; + // for (let p of pathComponents) { + // aPath = path.join(aPath, "/", p); + // const theFile = path.join( + // aPath, + // "0=" + this.nameVersion(this.ocflVersion) + // ); + // parentIsOcflObject.push(await fs.pathExists(theFile)); + // } + // return parentIsOcflObject.includes(true); + // } + + // async mergeObjectWith(newObject, prevObject) { + // // Merge an object that's being submitted with one from the repositopry + // // We'll call this object the NEW object and the one in the repo the prev object + + // const prevInventory = await prevObject.getLatestInventory(); + // const newInventory = await newObject.getLatestInventory(); + + // if (!prevInventory) { + // await fs.move(`${newObject.path}/`, `${prevObject.path}/`); + // return; + // } + + // // Get latest state + // const prevVersion = prevInventory.head; + // const prevState = prevInventory.versions[prevVersion].state; + // const newState = newInventory.versions["v1"].state; + + // // Check whether this is just the same thing exactly as the last one + // if (Object.keys(newState).length === Object.keys(prevState).length) { + // // Same length, so may be the same + // var same = true; + // for (let hash of Object.keys(newState)) { + // if (!prevState[hash]) { + // same = false; + // break; + // } + // } + // if (same) { + // // First, do no harm + // // ie do nothing + // return prevObject; + // } + // } + + // // Increment version number from existing object + // const newVersion = this.incrementVersion(prevVersion); + + // // Move our v1 stuff to the new version number (we may delete some of it) + // const moved = await fs.move( + // path.join(newObject.path, "v1"), + // path.join(newObject.path, newVersion) + // ); + // const newVersionPath = path.join(newObject.path, newVersion); + + // // Go thru latest state one hash at a time + // for (let hash of Object.keys(newState)) { + // // Inheritance: Files inherited from the previous version unchanged are + // //referenced in the state block of the new version. These entries will be + // // identical to the corresponding entries in the previous version's state + // // block. + + // // THAT IS: If there's already a manifest entry for this then remove the file and leave the entry here + + // // Now that we've checked agains the latest version, check against the all-time store of hashes we know about + // //for (let file of newState[hash]) { + // for (var i = 0; i < newState[hash].length; i += 1) { + // const file = newState[hash][i]; + // if (!prevInventory.manifest[hash]) { + // // We don't have a copy of this anywhere + // // Addition: Newly added files appear as new entries in the state block of + // // the new version. The file should be stored and an entry for the new + // // content must be made in the manifest block of the object's inventory. + // prevInventory.manifest[hash] = [ + // path.join(newVersion, "content", file) + // ]; + // // now we have at least one copy - subsequent copies in incoming objects can be deleted + // } else { + // // We have a copy of this file so delete the physical file + // // the file we have could be inhereted or re-instated + // const filePath = path.join(newVersionPath, "content", file); + // const del = await fs.remove(filePath); + // } + // } + // } + // // Spec says: + // // Deletion: Files deleted from the previous version are simply removed + // // from the state block of the new version + // // BUT: We never added them so nothing to do! + // prevInventory.versions[newVersion] = newInventory.versions["v1"]; // As updated + // prevInventory.head = newVersion; + // // Copy in the new version dir + // const invs = await newObject.writeInventories({ + // inventory: prevInventory, + // newVersion + // }); + // const rm = await newObject.removeEmptyDirectories(); + // const vmoved = await fs.move( + // newVersionPath, + // path.join(prevObject.path, newVersion) + // ); + // const invs_new = await prevObject.writeInventories({ + // inventory: prevInventory, + // newVersion + // }); + // // Clean up temp deposit dir + // const rm1 = await fs.remove(newObject.path); + // } } module.exports = Repository; diff --git a/package.json b/package.json index f7e1dc3..3281e99 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Oxford Common File Layout", "main": "index.js", "scripts": { - "test": "mocha --require esm" + "tests": "./node_modules/.bin/mocha --require esm" }, "keywords": [ "ocfl", diff --git a/test-data/notocfl/iexist.txt b/test-data/notocfl/iexist.txt deleted file mode 100644 index e69de29..0000000 diff --git a/test-data/ocfl-object/0=ocfl_object_1.0 b/test-data/ocfl-object/0=ocfl_object_1.0 new file mode 100644 index 0000000..c5a550c --- /dev/null +++ b/test-data/ocfl-object/0=ocfl_object_1.0 @@ -0,0 +1 @@ +ocfl_object_1.0 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_0-copy1.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_0-copy1.txt deleted file mode 100644 index c227083..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_0-copy1.txt +++ /dev/null @@ -1 +0,0 @@ -0 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_0-copy2.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_0-copy2.txt deleted file mode 100644 index c227083..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_0-copy2.txt +++ /dev/null @@ -1 +0,0 @@ -0 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_0-copy3.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_0-copy3.txt deleted file mode 100644 index c227083..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_0-copy3.txt +++ /dev/null @@ -1 +0,0 @@ -0 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_1.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_1.txt deleted file mode 100644 index 56a6051..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_1.txt +++ /dev/null @@ -1 +0,0 @@ -1 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_10.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_10.txt deleted file mode 100644 index 9a03714..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_10.txt +++ /dev/null @@ -1 +0,0 @@ -10 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_100.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_100.txt deleted file mode 100644 index 105d7d9..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_100.txt +++ /dev/null @@ -1 +0,0 @@ -100 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_101.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_101.txt deleted file mode 100644 index 97a55e1..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_101.txt +++ /dev/null @@ -1 +0,0 @@ -101 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_102.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_102.txt deleted file mode 100644 index 0aede4a..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_102.txt +++ /dev/null @@ -1 +0,0 @@ -102 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_103.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_103.txt deleted file mode 100644 index 0fd0714..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_103.txt +++ /dev/null @@ -1 +0,0 @@ -103 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_104.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_104.txt deleted file mode 100644 index dec4c59..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_104.txt +++ /dev/null @@ -1 +0,0 @@ -104 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_105.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_105.txt deleted file mode 100644 index ffda4e7..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_105.txt +++ /dev/null @@ -1 +0,0 @@ -105 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_106.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_106.txt deleted file mode 100644 index 3fbd193..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_106.txt +++ /dev/null @@ -1 +0,0 @@ -106 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_107.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_107.txt deleted file mode 100644 index e3b5acb..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_107.txt +++ /dev/null @@ -1 +0,0 @@ -107 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_108.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_108.txt deleted file mode 100644 index 615088b..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_108.txt +++ /dev/null @@ -1 +0,0 @@ -108 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_109.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_109.txt deleted file mode 100644 index 6d58c4e..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_109.txt +++ /dev/null @@ -1 +0,0 @@ -109 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_11.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_11.txt deleted file mode 100644 index 9d60796..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_11.txt +++ /dev/null @@ -1 +0,0 @@ -11 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_110.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_110.txt deleted file mode 100644 index 97e3504..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_110.txt +++ /dev/null @@ -1 +0,0 @@ -110 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_111.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_111.txt deleted file mode 100644 index 9d07aa0..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_111.txt +++ /dev/null @@ -1 +0,0 @@ -111 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_112.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_112.txt deleted file mode 100644 index d257208..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_112.txt +++ /dev/null @@ -1 +0,0 @@ -112 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_113.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_113.txt deleted file mode 100644 index 95c8a67..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_113.txt +++ /dev/null @@ -1 +0,0 @@ -113 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_114.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_114.txt deleted file mode 100644 index c9c4108..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_114.txt +++ /dev/null @@ -1 +0,0 @@ -114 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_115.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_115.txt deleted file mode 100644 index 2702ba3..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_115.txt +++ /dev/null @@ -1 +0,0 @@ -115 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_116.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_116.txt deleted file mode 100644 index d2c5ed2..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_116.txt +++ /dev/null @@ -1 +0,0 @@ -116 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_117.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_117.txt deleted file mode 100644 index 1bda760..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_117.txt +++ /dev/null @@ -1 +0,0 @@ -117 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_118.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_118.txt deleted file mode 100644 index 8d9f781..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_118.txt +++ /dev/null @@ -1 +0,0 @@ -118 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_119.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_119.txt deleted file mode 100644 index 176fdeb..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_119.txt +++ /dev/null @@ -1 +0,0 @@ -119 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_12.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_12.txt deleted file mode 100644 index 3cacc0b..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_12.txt +++ /dev/null @@ -1 +0,0 @@ -12 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_120.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_120.txt deleted file mode 100644 index 8bc6583..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_120.txt +++ /dev/null @@ -1 +0,0 @@ -120 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_121.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_121.txt deleted file mode 100644 index 5a396e2..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_121.txt +++ /dev/null @@ -1 +0,0 @@ -121 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_122.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_122.txt deleted file mode 100644 index 3fdc173..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_122.txt +++ /dev/null @@ -1 +0,0 @@ -122 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_123.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_123.txt deleted file mode 100644 index d800886..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_123.txt +++ /dev/null @@ -1 +0,0 @@ -123 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_124.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_124.txt deleted file mode 100644 index a09fd8a..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_124.txt +++ /dev/null @@ -1 +0,0 @@ -124 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_125.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_125.txt deleted file mode 100644 index 00c98bb..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_125.txt +++ /dev/null @@ -1 +0,0 @@ -125 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_126.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_126.txt deleted file mode 100644 index afbe847..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_126.txt +++ /dev/null @@ -1 +0,0 @@ -126 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_127.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_127.txt deleted file mode 100644 index 405e057..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_127.txt +++ /dev/null @@ -1 +0,0 @@ -127 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_128.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_128.txt deleted file mode 100644 index b854a29..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_128.txt +++ /dev/null @@ -1 +0,0 @@ -128 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_129.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_129.txt deleted file mode 100644 index 6d3e9dc..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_129.txt +++ /dev/null @@ -1 +0,0 @@ -129 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_13.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_13.txt deleted file mode 100644 index ca7bf83..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_13.txt +++ /dev/null @@ -1 +0,0 @@ -13 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_130.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_130.txt deleted file mode 100644 index 8306ec1..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_130.txt +++ /dev/null @@ -1 +0,0 @@ -130 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_131.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_131.txt deleted file mode 100644 index b9c6c00..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_131.txt +++ /dev/null @@ -1 +0,0 @@ -131 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_132.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_132.txt deleted file mode 100644 index dd1ec20..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_132.txt +++ /dev/null @@ -1 +0,0 @@ -132 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_133.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_133.txt deleted file mode 100644 index af21323..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_133.txt +++ /dev/null @@ -1 +0,0 @@ -133 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_134.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_134.txt deleted file mode 100644 index fa59ff2..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_134.txt +++ /dev/null @@ -1 +0,0 @@ -134 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_135.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_135.txt deleted file mode 100644 index 50f0bcd..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_135.txt +++ /dev/null @@ -1 +0,0 @@ -135 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_136.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_136.txt deleted file mode 100644 index d55f9f7..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_136.txt +++ /dev/null @@ -1 +0,0 @@ -136 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_137.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_137.txt deleted file mode 100644 index 0973804..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_137.txt +++ /dev/null @@ -1 +0,0 @@ -137 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_138.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_138.txt deleted file mode 100644 index eafdfb0..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_138.txt +++ /dev/null @@ -1 +0,0 @@ -138 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_139.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_139.txt deleted file mode 100644 index b5db9c4..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_139.txt +++ /dev/null @@ -1 +0,0 @@ -139 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_14.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_14.txt deleted file mode 100644 index da2d398..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_14.txt +++ /dev/null @@ -1 +0,0 @@ -14 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_140.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_140.txt deleted file mode 100644 index c2807f7..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_140.txt +++ /dev/null @@ -1 +0,0 @@ -140 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_141.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_141.txt deleted file mode 100644 index acfba60..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_141.txt +++ /dev/null @@ -1 +0,0 @@ -141 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_142.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_142.txt deleted file mode 100644 index 83248fb..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_142.txt +++ /dev/null @@ -1 +0,0 @@ -142 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_143.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_143.txt deleted file mode 100644 index aa59885..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_143.txt +++ /dev/null @@ -1 +0,0 @@ -143 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_144.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_144.txt deleted file mode 100644 index 70e1a64..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_144.txt +++ /dev/null @@ -1 +0,0 @@ -144 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_145.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_145.txt deleted file mode 100644 index aca544d..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_145.txt +++ /dev/null @@ -1 +0,0 @@ -145 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_146.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_146.txt deleted file mode 100644 index bc768da..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_146.txt +++ /dev/null @@ -1 +0,0 @@ -146 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_147.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_147.txt deleted file mode 100644 index 5d1277e..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_147.txt +++ /dev/null @@ -1 +0,0 @@ -147 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_148.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_148.txt deleted file mode 100644 index 4b9bce4..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_148.txt +++ /dev/null @@ -1 +0,0 @@ -148 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_149.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_149.txt deleted file mode 100644 index d7019ae..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_149.txt +++ /dev/null @@ -1 +0,0 @@ -149 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_15.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_15.txt deleted file mode 100644 index 3f10ffe..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_15.txt +++ /dev/null @@ -1 +0,0 @@ -15 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_150.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_150.txt deleted file mode 100644 index 4701cc7..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_150.txt +++ /dev/null @@ -1 +0,0 @@ -150 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_151.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_151.txt deleted file mode 100644 index c663e4d..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_151.txt +++ /dev/null @@ -1 +0,0 @@ -151 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_152.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_152.txt deleted file mode 100644 index 2d73b5e..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_152.txt +++ /dev/null @@ -1 +0,0 @@ -152 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_153.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_153.txt deleted file mode 100644 index f79f5e3..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_153.txt +++ /dev/null @@ -1 +0,0 @@ -153 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_154.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_154.txt deleted file mode 100644 index dc9414b..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_154.txt +++ /dev/null @@ -1 +0,0 @@ -154 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_155.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_155.txt deleted file mode 100644 index b912dc1..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_155.txt +++ /dev/null @@ -1 +0,0 @@ -155 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_156.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_156.txt deleted file mode 100644 index 34bba94..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_156.txt +++ /dev/null @@ -1 +0,0 @@ -156 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_157.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_157.txt deleted file mode 100644 index 2bab422..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_157.txt +++ /dev/null @@ -1 +0,0 @@ -157 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_158.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_158.txt deleted file mode 100644 index 147ea53..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_158.txt +++ /dev/null @@ -1 +0,0 @@ -158 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_159.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_159.txt deleted file mode 100644 index b000479..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_159.txt +++ /dev/null @@ -1 +0,0 @@ -159 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_16.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_16.txt deleted file mode 100644 index 19c7bdb..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_16.txt +++ /dev/null @@ -1 +0,0 @@ -16 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_160.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_160.txt deleted file mode 100644 index 9da06a1..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_160.txt +++ /dev/null @@ -1 +0,0 @@ -160 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_161.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_161.txt deleted file mode 100644 index 7f3a7cc..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_161.txt +++ /dev/null @@ -1 +0,0 @@ -161 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_162.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_162.txt deleted file mode 100644 index 05b9b66..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_162.txt +++ /dev/null @@ -1 +0,0 @@ -162 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_163.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_163.txt deleted file mode 100644 index 5755659..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_163.txt +++ /dev/null @@ -1 +0,0 @@ -163 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_164.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_164.txt deleted file mode 100644 index a8f6a25..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_164.txt +++ /dev/null @@ -1 +0,0 @@ -164 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_165.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_165.txt deleted file mode 100644 index 59f3135..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_165.txt +++ /dev/null @@ -1 +0,0 @@ -165 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_166.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_166.txt deleted file mode 100644 index 09df927..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_166.txt +++ /dev/null @@ -1 +0,0 @@ -166 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_167.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_167.txt deleted file mode 100644 index 2efea51..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_167.txt +++ /dev/null @@ -1 +0,0 @@ -167 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_168.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_168.txt deleted file mode 100644 index a3090d2..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_168.txt +++ /dev/null @@ -1 +0,0 @@ -168 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_169.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_169.txt deleted file mode 100644 index 9a13717..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_169.txt +++ /dev/null @@ -1 +0,0 @@ -169 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_17.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_17.txt deleted file mode 100644 index 8e2afd3..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_17.txt +++ /dev/null @@ -1 +0,0 @@ -17 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_170.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_170.txt deleted file mode 100644 index 3968aef..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_170.txt +++ /dev/null @@ -1 +0,0 @@ -170 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_171.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_171.txt deleted file mode 100644 index 6547e41..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_171.txt +++ /dev/null @@ -1 +0,0 @@ -171 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_172.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_172.txt deleted file mode 100644 index 89a16a7..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_172.txt +++ /dev/null @@ -1 +0,0 @@ -172 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_173.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_173.txt deleted file mode 100644 index 7b27b25..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_173.txt +++ /dev/null @@ -1 +0,0 @@ -173 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_174.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_174.txt deleted file mode 100644 index 4a8d924..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_174.txt +++ /dev/null @@ -1 +0,0 @@ -174 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_175.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_175.txt deleted file mode 100644 index 83981c0..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_175.txt +++ /dev/null @@ -1 +0,0 @@ -175 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_176.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_176.txt deleted file mode 100644 index a6b4ce8..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_176.txt +++ /dev/null @@ -1 +0,0 @@ -176 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_177.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_177.txt deleted file mode 100644 index 12e2555..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_177.txt +++ /dev/null @@ -1 +0,0 @@ -177 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_178.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_178.txt deleted file mode 100644 index 6fc1e6e..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_178.txt +++ /dev/null @@ -1 +0,0 @@ -178 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_179.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_179.txt deleted file mode 100644 index cde50ca..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_179.txt +++ /dev/null @@ -1 +0,0 @@ -179 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_18.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_18.txt deleted file mode 100644 index 25bf17f..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_18.txt +++ /dev/null @@ -1 +0,0 @@ -18 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_180.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_180.txt deleted file mode 100644 index a14c1ee..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_180.txt +++ /dev/null @@ -1 +0,0 @@ -180 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_181.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_181.txt deleted file mode 100644 index a5b5e0f..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_181.txt +++ /dev/null @@ -1 +0,0 @@ -181 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_182.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_182.txt deleted file mode 100644 index cd00472..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_182.txt +++ /dev/null @@ -1 +0,0 @@ -182 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_183.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_183.txt deleted file mode 100644 index 80945bc..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_183.txt +++ /dev/null @@ -1 +0,0 @@ -183 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_184.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_184.txt deleted file mode 100644 index 3021b56..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_184.txt +++ /dev/null @@ -1 +0,0 @@ -184 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_185.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_185.txt deleted file mode 100644 index 1edbdba..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_185.txt +++ /dev/null @@ -1 +0,0 @@ -185 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_186.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_186.txt deleted file mode 100644 index cb37cb5..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_186.txt +++ /dev/null @@ -1 +0,0 @@ -186 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_187.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_187.txt deleted file mode 100644 index e3e1916..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_187.txt +++ /dev/null @@ -1 +0,0 @@ -187 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_188.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_188.txt deleted file mode 100644 index 0947c33..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_188.txt +++ /dev/null @@ -1 +0,0 @@ -188 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_189.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_189.txt deleted file mode 100644 index 66321c0..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_189.txt +++ /dev/null @@ -1 +0,0 @@ -189 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_19.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_19.txt deleted file mode 100644 index dec2bf5..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_19.txt +++ /dev/null @@ -1 +0,0 @@ -19 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_190.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_190.txt deleted file mode 100644 index 1a1f7f8..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_190.txt +++ /dev/null @@ -1 +0,0 @@ -190 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_191.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_191.txt deleted file mode 100644 index 946b551..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_191.txt +++ /dev/null @@ -1 +0,0 @@ -191 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_192.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_192.txt deleted file mode 100644 index 681cf04..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_192.txt +++ /dev/null @@ -1 +0,0 @@ -192 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_193.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_193.txt deleted file mode 100644 index 725cdcd..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_193.txt +++ /dev/null @@ -1 +0,0 @@ -193 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_194.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_194.txt deleted file mode 100644 index 4be28fd..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_194.txt +++ /dev/null @@ -1 +0,0 @@ -194 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_195.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_195.txt deleted file mode 100644 index a0b994e..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_195.txt +++ /dev/null @@ -1 +0,0 @@ -195 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_196.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_196.txt deleted file mode 100644 index 4129657..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_196.txt +++ /dev/null @@ -1 +0,0 @@ -196 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_197.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_197.txt deleted file mode 100644 index fb35181..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_197.txt +++ /dev/null @@ -1 +0,0 @@ -197 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_198.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_198.txt deleted file mode 100644 index 8e24a69..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_198.txt +++ /dev/null @@ -1 +0,0 @@ -198 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_199.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_199.txt deleted file mode 100644 index 7318142..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_199.txt +++ /dev/null @@ -1 +0,0 @@ -199 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_2.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_2.txt deleted file mode 100644 index d8263ee..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_2.txt +++ /dev/null @@ -1 +0,0 @@ -2 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_20.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_20.txt deleted file mode 100644 index 2edeafb..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_20.txt +++ /dev/null @@ -1 +0,0 @@ -20 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_21.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_21.txt deleted file mode 100644 index b5045cc..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_21.txt +++ /dev/null @@ -1 +0,0 @@ -21 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_22.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_22.txt deleted file mode 100644 index 8fdd954..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_22.txt +++ /dev/null @@ -1 +0,0 @@ -22 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_23.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_23.txt deleted file mode 100644 index b393560..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_23.txt +++ /dev/null @@ -1 +0,0 @@ -23 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_24.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_24.txt deleted file mode 100644 index cabf43b..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_24.txt +++ /dev/null @@ -1 +0,0 @@ -24 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_25.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_25.txt deleted file mode 100644 index 410b14d..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_25.txt +++ /dev/null @@ -1 +0,0 @@ -25 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_26.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_26.txt deleted file mode 100644 index 978b4e8..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_26.txt +++ /dev/null @@ -1 +0,0 @@ -26 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_27.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_27.txt deleted file mode 100644 index a5c750f..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_27.txt +++ /dev/null @@ -1 +0,0 @@ -27 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_28.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_28.txt deleted file mode 100644 index 368f89c..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_28.txt +++ /dev/null @@ -1 +0,0 @@ -28 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_29.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_29.txt deleted file mode 100644 index d99e90e..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_29.txt +++ /dev/null @@ -1 +0,0 @@ -29 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_3.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_3.txt deleted file mode 100644 index e440e5c..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_3.txt +++ /dev/null @@ -1 +0,0 @@ -3 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_30.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_30.txt deleted file mode 100644 index 8580e7b..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_30.txt +++ /dev/null @@ -1 +0,0 @@ -30 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_31.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_31.txt deleted file mode 100644 index b74e882..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_31.txt +++ /dev/null @@ -1 +0,0 @@ -31 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_32.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_32.txt deleted file mode 100644 index 1758ddd..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_32.txt +++ /dev/null @@ -1 +0,0 @@ -32 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_33.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_33.txt deleted file mode 100644 index dc7b54a..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_33.txt +++ /dev/null @@ -1 +0,0 @@ -33 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_34.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_34.txt deleted file mode 100644 index 3e932fe..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_34.txt +++ /dev/null @@ -1 +0,0 @@ -34 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_35.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_35.txt deleted file mode 100644 index 597975b..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_35.txt +++ /dev/null @@ -1 +0,0 @@ -35 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_36.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_36.txt deleted file mode 100644 index dce6588..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_36.txt +++ /dev/null @@ -1 +0,0 @@ -36 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_37.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_37.txt deleted file mode 100644 index 7c09198..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_37.txt +++ /dev/null @@ -1 +0,0 @@ -37 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_38.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_38.txt deleted file mode 100644 index c24b6ae..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_38.txt +++ /dev/null @@ -1 +0,0 @@ -38 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_39.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_39.txt deleted file mode 100644 index 72f523f..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_39.txt +++ /dev/null @@ -1 +0,0 @@ -39 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_4.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_4.txt deleted file mode 100644 index bf0d87a..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_4.txt +++ /dev/null @@ -1 +0,0 @@ -4 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_40.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_40.txt deleted file mode 100644 index 86ee83a..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_40.txt +++ /dev/null @@ -1 +0,0 @@ -40 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_41.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_41.txt deleted file mode 100644 index aaa6442..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_41.txt +++ /dev/null @@ -1 +0,0 @@ -41 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_42.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_42.txt deleted file mode 100644 index f70d7bb..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_42.txt +++ /dev/null @@ -1 +0,0 @@ -42 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_43.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_43.txt deleted file mode 100644 index ac4213d..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_43.txt +++ /dev/null @@ -1 +0,0 @@ -43 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_44.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_44.txt deleted file mode 100644 index d2e1cef..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_44.txt +++ /dev/null @@ -1 +0,0 @@ -44 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_45.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_45.txt deleted file mode 100644 index 7d37386..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_45.txt +++ /dev/null @@ -1 +0,0 @@ -45 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_46.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_46.txt deleted file mode 100644 index abc4eff..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_46.txt +++ /dev/null @@ -1 +0,0 @@ -46 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_47.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_47.txt deleted file mode 100644 index 801f180..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_47.txt +++ /dev/null @@ -1 +0,0 @@ -47 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_48.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_48.txt deleted file mode 100644 index 31ff414..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_48.txt +++ /dev/null @@ -1 +0,0 @@ -48 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_49.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_49.txt deleted file mode 100644 index 2e66562..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_49.txt +++ /dev/null @@ -1 +0,0 @@ -49 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_5.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_5.txt deleted file mode 100644 index 7813681..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_5.txt +++ /dev/null @@ -1 +0,0 @@ -5 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_50.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_50.txt deleted file mode 100644 index c5b431b..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_50.txt +++ /dev/null @@ -1 +0,0 @@ -50 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_51.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_51.txt deleted file mode 100644 index 7003e7f..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_51.txt +++ /dev/null @@ -1 +0,0 @@ -51 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_52.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_52.txt deleted file mode 100644 index 6139554..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_52.txt +++ /dev/null @@ -1 +0,0 @@ -52 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_53.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_53.txt deleted file mode 100644 index 8783e30..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_53.txt +++ /dev/null @@ -1 +0,0 @@ -53 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_54.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_54.txt deleted file mode 100644 index 43c451e..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_54.txt +++ /dev/null @@ -1 +0,0 @@ -54 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_55.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_55.txt deleted file mode 100644 index 7c6ba0f..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_55.txt +++ /dev/null @@ -1 +0,0 @@ -55 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_56.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_56.txt deleted file mode 100644 index 2ebc651..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_56.txt +++ /dev/null @@ -1 +0,0 @@ -56 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_57.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_57.txt deleted file mode 100644 index f0b5c72..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_57.txt +++ /dev/null @@ -1 +0,0 @@ -57 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_58.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_58.txt deleted file mode 100644 index 4800c7d..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_58.txt +++ /dev/null @@ -1 +0,0 @@ -58 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_59.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_59.txt deleted file mode 100644 index fc9afb4..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_59.txt +++ /dev/null @@ -1 +0,0 @@ -59 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_6.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_6.txt deleted file mode 100644 index 62f9457..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_6.txt +++ /dev/null @@ -1 +0,0 @@ -6 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_60.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_60.txt deleted file mode 100644 index 2b82dfe..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_60.txt +++ /dev/null @@ -1 +0,0 @@ -60 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_61.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_61.txt deleted file mode 100644 index eebd1d1..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_61.txt +++ /dev/null @@ -1 +0,0 @@ -61 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_62.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_62.txt deleted file mode 100644 index b2412e3..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_62.txt +++ /dev/null @@ -1 +0,0 @@ -62 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_63.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_63.txt deleted file mode 100644 index 4e9e288..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_63.txt +++ /dev/null @@ -1 +0,0 @@ -63 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_64.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_64.txt deleted file mode 100644 index 4b6f9c3..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_64.txt +++ /dev/null @@ -1 +0,0 @@ -64 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_65.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_65.txt deleted file mode 100644 index b44fe09..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_65.txt +++ /dev/null @@ -1 +0,0 @@ -65 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_66.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_66.txt deleted file mode 100644 index d1cbcfa..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_66.txt +++ /dev/null @@ -1 +0,0 @@ -66 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_67.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_67.txt deleted file mode 100644 index 8323328..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_67.txt +++ /dev/null @@ -1 +0,0 @@ -67 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_68.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_68.txt deleted file mode 100644 index 3d9aebb..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_68.txt +++ /dev/null @@ -1 +0,0 @@ -68 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_69.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_69.txt deleted file mode 100644 index 8c0474e..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_69.txt +++ /dev/null @@ -1 +0,0 @@ -69 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_7.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_7.txt deleted file mode 100644 index c793025..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_7.txt +++ /dev/null @@ -1 +0,0 @@ -7 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_70.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_70.txt deleted file mode 100644 index d7765fe..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_70.txt +++ /dev/null @@ -1 +0,0 @@ -70 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_71.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_71.txt deleted file mode 100644 index 2fb681e..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_71.txt +++ /dev/null @@ -1 +0,0 @@ -71 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_72.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_72.txt deleted file mode 100644 index 9cd72aa..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_72.txt +++ /dev/null @@ -1 +0,0 @@ -72 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_73.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_73.txt deleted file mode 100644 index e77a963..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_73.txt +++ /dev/null @@ -1 +0,0 @@ -73 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_74.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_74.txt deleted file mode 100644 index 0aeb548..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_74.txt +++ /dev/null @@ -1 +0,0 @@ -74 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_75.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_75.txt deleted file mode 100644 index a76c74d..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_75.txt +++ /dev/null @@ -1 +0,0 @@ -75 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_76.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_76.txt deleted file mode 100644 index aa92725..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_76.txt +++ /dev/null @@ -1 +0,0 @@ -76 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_77.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_77.txt deleted file mode 100644 index 780fea9..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_77.txt +++ /dev/null @@ -1 +0,0 @@ -77 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_78.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_78.txt deleted file mode 100644 index efee1f8..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_78.txt +++ /dev/null @@ -1 +0,0 @@ -78 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_79.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_79.txt deleted file mode 100644 index eb13855..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_79.txt +++ /dev/null @@ -1 +0,0 @@ -79 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_8.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_8.txt deleted file mode 100644 index 301160a..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_8.txt +++ /dev/null @@ -1 +0,0 @@ -8 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_80.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_80.txt deleted file mode 100644 index e3f1e9b..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_80.txt +++ /dev/null @@ -1 +0,0 @@ -80 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_81.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_81.txt deleted file mode 100644 index c147342..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_81.txt +++ /dev/null @@ -1 +0,0 @@ -81 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_82.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_82.txt deleted file mode 100644 index 9d1ce53..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_82.txt +++ /dev/null @@ -1 +0,0 @@ -82 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_83.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_83.txt deleted file mode 100644 index 24af08a..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_83.txt +++ /dev/null @@ -1 +0,0 @@ -83 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_84.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_84.txt deleted file mode 100644 index 3ca9062..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_84.txt +++ /dev/null @@ -1 +0,0 @@ -84 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_85.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_85.txt deleted file mode 100644 index 615be70..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_85.txt +++ /dev/null @@ -1 +0,0 @@ -85 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_86.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_86.txt deleted file mode 100644 index 8bfa2f5..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_86.txt +++ /dev/null @@ -1 +0,0 @@ -86 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_87.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_87.txt deleted file mode 100644 index eaf7a13..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_87.txt +++ /dev/null @@ -1 +0,0 @@ -87 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_88.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_88.txt deleted file mode 100644 index 9f72858..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_88.txt +++ /dev/null @@ -1 +0,0 @@ -88 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_89.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_89.txt deleted file mode 100644 index 7730ef7..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_89.txt +++ /dev/null @@ -1 +0,0 @@ -89 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_9.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_9.txt deleted file mode 100644 index f11c82a..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_9.txt +++ /dev/null @@ -1 +0,0 @@ -9 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_90.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_90.txt deleted file mode 100644 index 0fa6a7b..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_90.txt +++ /dev/null @@ -1 +0,0 @@ -90 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_91.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_91.txt deleted file mode 100644 index a46c9d2..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_91.txt +++ /dev/null @@ -1 +0,0 @@ -91 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_92.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_92.txt deleted file mode 100644 index 69226f7..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_92.txt +++ /dev/null @@ -1 +0,0 @@ -92 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_93.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_93.txt deleted file mode 100644 index 27a37eb..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_93.txt +++ /dev/null @@ -1 +0,0 @@ -93 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_94.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_94.txt deleted file mode 100644 index bd753cc..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_94.txt +++ /dev/null @@ -1 +0,0 @@ -94 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_95.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_95.txt deleted file mode 100644 index 90be1cd..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_95.txt +++ /dev/null @@ -1 +0,0 @@ -95 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_96.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_96.txt deleted file mode 100644 index 56749c8..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_96.txt +++ /dev/null @@ -1 +0,0 @@ -96 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_97.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_97.txt deleted file mode 100644 index c4fbb1c..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_97.txt +++ /dev/null @@ -1 +0,0 @@ -97 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_98.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_98.txt deleted file mode 100644 index d7f3668..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_98.txt +++ /dev/null @@ -1 +0,0 @@ -98 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_99.txt b/test-data/ocfl-object1-source/sample/lots_of_little_files/file_99.txt deleted file mode 100644 index d97edbb..0000000 --- a/test-data/ocfl-object1-source/sample/lots_of_little_files/file_99.txt +++ /dev/null @@ -1 +0,0 @@ -99 \ No newline at end of file diff --git a/test-data/ocfl-object1-source/sample/pics/sepia_fence.jpg b/test-data/ocfl-object1-source/sample/pics/sepia_fence.jpg deleted file mode 100644 index a9edfe7..0000000 Binary files a/test-data/ocfl-object1-source/sample/pics/sepia_fence.jpg and /dev/null differ diff --git a/test-data/ocfl-object1-source/sample/pics/thumbs/2017-06-11 12.56.14.png b/test-data/ocfl-object1-source/sample/pics/thumbs/2017-06-11 12.56.14.png deleted file mode 100644 index 53b47b8..0000000 Binary files a/test-data/ocfl-object1-source/sample/pics/thumbs/2017-06-11 12.56.14.png and /dev/null differ diff --git a/test-data/ocfl-object1-source_additional_files/sample/CATALOG.json b/test-data/ocfl-object1-source_additional_files/sample/CATALOG.json deleted file mode 100644 index cf6f2da..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/CATALOG.json +++ /dev/null @@ -1,4050 +0,0 @@ -{ - "@context": { - "latitude": "http://schema.org/latitude", - "longitude": "http://schema.org/longitude", - "name": "http://schema.org/name", - "URL": "http://schema.org/URL", - "description": "http://schema.org/description", - "identifier": "http://schema.org/identifier", - "manufacturer": "http://schema.org/manufacturer", - "model": "http://schema.org/model", - "serialNumber": "http://schema.org/serialNumber", - "agent": "http://schema.org/agent", - "endTime": "http://schema.org/endTime", - "instrument": "http://schema.org/instrument", - "object": "http://schema.org/object", - "result": "http://schema.org/result", - "value": "http://schema.org/value", - "creator": "http://schema.org/creator", - "datePublished": "http://schema.org/datePublished", - "funder": "http://schema.org/funder", - "affiliation": "http://schema.org/affiliation", - "contactPoint": "http://schema.org/contactPoint", - "email": "http://schema.org/email", - "familyName": "http://schema.org/familyName", - "givenName": "http://schema.org/givenName", - "address": "http://schema.org/address", - "geo": "http://schema.org/geo", - "contentLocation": "http://schema.org/contentLocation", - "path": "http://schema.org/contentUrl", - "hasPart": "http://schema.org/hasPart", - "keywords": "http://schema.org/keywords", - "publisher": "http://schema.org/publisher", - "relatedLink": "http://schema.org/relatedLink", - "temporalCoverage": "http://schema.org/temporalCoverage", - "version": "http://schema.org/version", - "contactType": "http://schema.org/contactType", - "contentSize": "http://schema.org/contentSize", - "encodingFormat": "http://schema.org/encodingFormat", - "exifData": "http://schema.org/exifData", - "fileFormat": "http://schema.org/fileFormat", - "thumbnail": "http://schema.org/thumbnail", - "GeoCoordinates": "http://schema.org/GeoCoordinates", - "IndividualProduct": "http://schema.org/IndividualProduct", - "CreateAction": "http://schema.org/CreateAction", - "PropertyValue": "http://schema.org/PropertyValue", - "Organization": "http://schema.org/Organization", - "ScholarlyArticle": "http://schema.org/ScholarlyArticle", - "Person": "http://schema.org/Person", - "Place": "http://schema.org/Place", - "CreativeWork": "http://schema.org/CreativeWork", - "Dataset": "http://schema.org/Dataset", - "SoftwareApplication": "http://schema.org/SoftwareApplication", - "ContactPoint": "http://schema.org/ContactPoint", - "ImageObject": "http://schema.org/ImageObject", - "File": "http://schema.org/MediaObject" - }, - "@graph": [ - { - "@id": "98e56ecb-176f-4a09-8367-126e34f9d137", - "@type": "GeoCoordinates", - "latitude": "-33.7152", - "longitude": "150.30119", - "name": "Latitude: -33.7152, Longitude: 150.30119" - }, - { - "@id": "EPL1", - "@type": "IndividualProduct", - "URL": "https://en.wikipedia.org/wiki/Olympus_PEN_E-PL1", - "description": "Olympus camera with Panasonic 20mm lens", - "identifier": "EPL1", - "manufacturer": "Olympus", - "model": "EPL 1", - "name": "EPL1 Camera", - "serialNumber": "B3B505338" - }, - { - "@id": "Panny20mm", - "@type": "IndividualProduct", - "URL": "https://en.wikipedia.org/wiki/Panasonic_Lumix_20mm_lens", - "description": "Panasonic lens", - "identifier": "Panny20mm", - "manufacturer": "Panasonic", - "model": "Lumix G 20mm F1.7 Asph.", - "name": "Lumix G 20/F1.7 lens", - "serialNumber": "01FG3033651" - }, - { - "@id": "Photo1", - "@type": "CreateAction", - "agent": { - "@id": "http://orcid.org/0000-0002-3545-944X" - }, - "description": "Photo snapped on a photo walk on a misty day", - "endTime": "2017:06:11T12:56:14+10:00", - "identifier": "Photo1", - "instrument": [ - { - "@id": "EPL1" - }, - { - "@id": "Panny20mm" - } - ], - "name": "Took dog picture", - "object": { - "@id": "http://www.geonames.org/8152662/catalina-park.html" - }, - "result": { - "@id": "pics/2017-06-11 12.56.14.jpg" - } - }, - { - "@id": "SepiaConversion", - "@type": "CreateAction", - "agent": { - "@id": "http://orcid.org/0000-0002-3545-944X" - }, - "description": "convert -sepia-tone 80% test_data/sample/pics/2017-06-11\\ 12.56.14.jpg test_data/sample/pics/sepia_fence.jpg", - "endTime": "2018:09:19T17:01:07+10:00", - "identifier": "SepiaConversion", - "instrument": { - "@id": "https://www.imagemagick.org/" - }, - "name": "Converted dog picture to sepia", - "object": { - "@id": "pics/2017-06-11 12.56.14.jpg" - }, - "result": { - "@id": "pics/sepia_fence.jpg" - } - }, - { - "@id": "_:b0", - "@type": "PropertyValue", - "name": "AELock", - "value": "Off" - }, - { - "@id": "_:b1", - "@type": "PropertyValue", - "name": "AFAreas", - "value": "(111,106)-(144,149)" - }, - { - "@id": "_:b10", - "@type": "PropertyValue", - "name": "AspectRatio", - "value": "3:2" - }, - { - "@id": "_:b100", - "@type": "PropertyValue", - "name": "ISO", - "value": 400 - }, - { - "@id": "_:b101", - "@type": "PropertyValue", - "name": "ImageDescription", - "value": "OLYMPUS DIGITAL CAMERA " - }, - { - "@id": "_:b102", - "@type": "PropertyValue", - "name": "ImageHeight", - "value": 2688 - }, - { - "@id": "_:b103", - "@type": "PropertyValue", - "name": "ImageProcessingVersion", - "value": "0112" - }, - { - "@id": "_:b104", - "@type": "PropertyValue", - "name": "ImageSize", - "value": "4032x2688" - }, - { - "@id": "_:b105", - "@type": "PropertyValue", - "name": "ImageStabilization", - "value": "On, Mode 1" - }, - { - "@id": "_:b106", - "@type": "PropertyValue", - "name": "ImageWidth", - "value": 4032 - }, - { - "@id": "_:b107", - "@type": "PropertyValue", - "name": "InternalFlash", - "value": "Off" - }, - { - "@id": "_:b108", - "@type": "PropertyValue", - "name": "InternalSerialNumber", - "value": "4102011002108002 " - }, - { - "@id": "_:b109", - "@type": "PropertyValue", - "name": "InteropIndex", - "value": "R98 - DCF basic file (sRGB)" - }, - { - "@id": "_:b11", - "@type": "PropertyValue", - "name": "BitsPerSample", - "value": 8 - }, - { - "@id": "_:b110", - "@type": "PropertyValue", - "name": "InteropVersion", - "value": "0100" - }, - { - "@id": "_:b111", - "@type": "PropertyValue", - "name": "LensFirmwareVersion", - "value": 1.1 - }, - { - "@id": "_:b112", - "@type": "PropertyValue", - "name": "LensID", - "value": "Lumix G 20mm F1.7 Asph." - }, - { - "@id": "_:b113", - "@type": "PropertyValue", - "name": "LensModel", - "value": "LUMIX G 20/F1.7" - }, - { - "@id": "_:b114", - "@type": "PropertyValue", - "name": "LensProperties", - "value": "0x4110" - }, - { - "@id": "_:b115", - "@type": "PropertyValue", - "name": "LensSerialNumber", - "value": "01FG3033651" - }, - { - "@id": "_:b116", - "@type": "PropertyValue", - "name": "LensType", - "value": "Lumix G 20mm F1.7 Asph." - }, - { - "@id": "_:b117", - "@type": "PropertyValue", - "name": "LightSource", - "value": "Unknown" - }, - { - "@id": "_:b118", - "@type": "PropertyValue", - "name": "LightValue", - "value": 9.6 - }, - { - "@id": "_:b119", - "@type": "PropertyValue", - "name": "MIMEType", - "value": "image/jpeg" - }, - { - "@id": "_:b12", - "@type": "PropertyValue", - "name": "BlackLevel2", - "value": "64 64 64 64" - }, - { - "@id": "_:b120", - "@type": "PropertyValue", - "name": "MacroLED", - "value": "Off" - }, - { - "@id": "_:b121", - "@type": "PropertyValue", - "name": "MacroMode", - "value": "Off" - }, - { - "@id": "_:b122", - "@type": "PropertyValue", - "name": "Make", - "value": "OLYMPUS IMAGING CORP." - }, - { - "@id": "_:b123", - "@type": "PropertyValue", - "name": "ManometerPressure", - "value": "0 kPa" - }, - { - "@id": "_:b124", - "@type": "PropertyValue", - "name": "ManometerReading", - "value": "0 m, 0 ft" - }, - { - "@id": "_:b125", - "@type": "PropertyValue", - "name": "ManualFlash", - "value": "Off" - }, - { - "@id": "_:b126", - "@type": "PropertyValue", - "name": "ManualFlashStrength", - "value": "n/a" - }, - { - "@id": "_:b127", - "@type": "PropertyValue", - "name": "MaxAperture", - "value": 1.8 - }, - { - "@id": "_:b128", - "@type": "PropertyValue", - "name": "MaxApertureAtMaxFocal", - "value": 1.7 - }, - { - "@id": "_:b129", - "@type": "PropertyValue", - "name": "MaxApertureAtMinFocal", - "value": 1.7 - }, - { - "@id": "_:b13", - "@type": "PropertyValue", - "name": "BlueBalance", - "value": 1.367188 - }, - { - "@id": "_:b130", - "@type": "PropertyValue", - "name": "MaxApertureValue", - "value": 1.7 - }, - { - "@id": "_:b131", - "@type": "PropertyValue", - "name": "MaxFaces", - "value": "8 8 0" - }, - { - "@id": "_:b132", - "@type": "PropertyValue", - "name": "MaxFocalLength", - "value": 20 - }, - { - "@id": "_:b133", - "@type": "PropertyValue", - "name": "Megapixels", - "value": 10.8 - }, - { - "@id": "_:b134", - "@type": "PropertyValue", - "name": "MeteringMode", - "value": "ESP" - }, - { - "@id": "_:b135", - "@type": "PropertyValue", - "name": "MinFocalLength", - "value": 20 - }, - { - "@id": "_:b136", - "@type": "PropertyValue", - "name": "Model", - "value": "E-PL1" - }, - { - "@id": "_:b137", - "@type": "PropertyValue", - "name": "ModifiedSaturation", - "value": "Off" - }, - { - "@id": "_:b138", - "@type": "PropertyValue", - "name": "ModifyDate", - "value": "2017:06:11 12:56:14" - }, - { - "@id": "_:b139", - "@type": "PropertyValue", - "name": "MultipleExposureMode", - "value": "Off; 1" - }, - { - "@id": "_:b14", - "@type": "PropertyValue", - "name": "BodyFirmwareVersion", - "value": 1.103 - }, - { - "@id": "_:b140", - "@type": "PropertyValue", - "name": "NoiseFilter", - "value": "Standard" - }, - { - "@id": "_:b141", - "@type": "PropertyValue", - "name": "NoiseReduction", - "value": "Auto" - }, - { - "@id": "_:b142", - "@type": "PropertyValue", - "name": "NoiseReduction2", - "value": "(none)" - }, - { - "@id": "_:b143", - "@type": "PropertyValue", - "name": "Orientation", - "value": "Horizontal (normal)" - }, - { - "@id": "_:b144", - "@type": "PropertyValue", - "name": "PanoramaMode", - "value": "Off" - }, - { - "@id": "_:b145", - "@type": "PropertyValue", - "name": "PictureMode", - "value": "Vivid; 2" - }, - { - "@id": "_:b146", - "@type": "PropertyValue", - "name": "PictureModeBWFilter", - "value": "n/a" - }, - { - "@id": "_:b147", - "@type": "PropertyValue", - "name": "PictureModeContrast", - "value": "0 (min -2, max 2)" - }, - { - "@id": "_:b148", - "@type": "PropertyValue", - "name": "PictureModeEffect", - "value": "Standard" - }, - { - "@id": "_:b149", - "@type": "PropertyValue", - "name": "PictureModeSaturation", - "value": "0 (min -2, max 2)" - }, - { - "@id": "_:b15", - "@type": "PropertyValue", - "name": "CameraID", - "value": "OLYMPUS DIGITAL CAMERA " - }, - { - "@id": "_:b150", - "@type": "PropertyValue", - "name": "PictureModeSharpness", - "value": "0 (min -2, max 2)" - }, - { - "@id": "_:b151", - "@type": "PropertyValue", - "name": "PictureModeTone", - "value": "n/a" - }, - { - "@id": "_:b152", - "@type": "PropertyValue", - "name": "PreviewImage", - "value": "(Binary data 514170 bytes, use -b option to extract)" - }, - { - "@id": "_:b153", - "@type": "PropertyValue", - "name": "PreviewImageLength", - "value": 514170 - }, - { - "@id": "_:b154", - "@type": "PropertyValue", - "name": "PreviewImageStart", - "value": 4600608 - }, - { - "@id": "_:b155", - "@type": "PropertyValue", - "name": "PreviewImageValid", - "value": "Yes" - }, - { - "@id": "_:b156", - "@type": "PropertyValue", - "name": "PrintIMVersion", - "value": "0300" - }, - { - "@id": "_:b157", - "@type": "PropertyValue", - "name": "RawDevColorSpace", - "value": "sRGB" - }, - { - "@id": "_:b158", - "@type": "PropertyValue", - "name": "RawDevContrastValue", - "value": "0 0 0" - }, - { - "@id": "_:b159", - "@type": "PropertyValue", - "name": "RawDevEditStatus", - "value": "Original" - }, - { - "@id": "_:b16", - "@type": "PropertyValue", - "name": "CameraSettingsVersion", - "value": "0100" - }, - { - "@id": "_:b160", - "@type": "PropertyValue", - "name": "RawDevEngine", - "value": "High Speed" - }, - { - "@id": "_:b161", - "@type": "PropertyValue", - "name": "RawDevExposureBiasValue", - "value": 0 - }, - { - "@id": "_:b162", - "@type": "PropertyValue", - "name": "RawDevGrayPoint", - "value": "0 0 0" - }, - { - "@id": "_:b163", - "@type": "PropertyValue", - "name": "RawDevMemoryColorEmphasis", - "value": 0 - }, - { - "@id": "_:b164", - "@type": "PropertyValue", - "name": "RawDevNoiseReduction", - "value": "(none)" - }, - { - "@id": "_:b165", - "@type": "PropertyValue", - "name": "RawDevSaturationEmphasis", - "value": "0 0 0" - }, - { - "@id": "_:b166", - "@type": "PropertyValue", - "name": "RawDevSettings", - "value": "(none)" - }, - { - "@id": "_:b167", - "@type": "PropertyValue", - "name": "RawDevSharpnessValue", - "value": "0 0 0" - }, - { - "@id": "_:b168", - "@type": "PropertyValue", - "name": "RawDevVersion", - "value": "0100" - }, - { - "@id": "_:b169", - "@type": "PropertyValue", - "name": "RawDevWBFineAdjustment", - "value": 0 - }, - { - "@id": "_:b17", - "@type": "PropertyValue", - "name": "CameraType2", - "value": "E-PL1" - }, - { - "@id": "_:b170", - "@type": "PropertyValue", - "name": "RawDevWhiteBalanceValue", - "value": 0 - }, - { - "@id": "_:b171", - "@type": "PropertyValue", - "name": "RedBalance", - "value": 1.78125 - }, - { - "@id": "_:b172", - "@type": "PropertyValue", - "name": "ResolutionUnit", - "value": "inches" - }, - { - "@id": "_:b173", - "@type": "PropertyValue", - "name": "Saturation", - "value": "High" - }, - { - "@id": "_:b174", - "@type": "PropertyValue", - "name": "ScaleFactor35efl", - "value": 2 - }, - { - "@id": "_:b175", - "@type": "PropertyValue", - "name": "SceneCaptureType", - "value": "Standard" - }, - { - "@id": "_:b176", - "@type": "PropertyValue", - "name": "SceneDetect", - "value": 0 - }, - { - "@id": "_:b177", - "@type": "PropertyValue", - "name": "SceneMode", - "value": "Standard" - }, - { - "@id": "_:b178", - "@type": "PropertyValue", - "name": "SensorCalibration", - "value": "0 0" - }, - { - "@id": "_:b179", - "@type": "PropertyValue", - "name": "SensorTemperature", - "value": "48.0 C" - }, - { - "@id": "_:b18", - "@type": "PropertyValue", - "name": "CircleOfConfusion", - "value": "0.015 mm" - }, - { - "@id": "_:b180", - "@type": "PropertyValue", - "name": "SerialNumber", - "value": "B3B505338" - }, - { - "@id": "_:b181", - "@type": "PropertyValue", - "name": "ShadingCompensation", - "value": "Off" - }, - { - "@id": "_:b182", - "@type": "PropertyValue", - "name": "ShadingCompensation2", - "value": "Off" - }, - { - "@id": "_:b183", - "@type": "PropertyValue", - "name": "Sharpness", - "value": "Hard" - }, - { - "@id": "_:b184", - "@type": "PropertyValue", - "name": "SharpnessSetting", - "value": "1 (min -5, max 5)" - }, - { - "@id": "_:b185", - "@type": "PropertyValue", - "name": "ShutterSpeed", - "value": "1/80" - }, - { - "@id": "_:b186", - "@type": "PropertyValue", - "name": "Software", - "value": "Version 1.1" - }, - { - "@id": "_:b187", - "@type": "PropertyValue", - "name": "SourceFile", - "value": "test_data/sample/pics/2017-06-11 12.56.14.jpg" - }, - { - "@id": "_:b188", - "@type": "PropertyValue", - "name": "SpecialMode", - "value": "Normal, Sequence: 0, Panorama: (none)" - }, - { - "@id": "_:b189", - "@type": "PropertyValue", - "name": "ThumbnailImage", - "value": "(Binary data 7738 bytes, use -b option to extract)" - }, - { - "@id": "_:b19", - "@type": "PropertyValue", - "name": "ColorComponents", - "value": 3 - }, - { - "@id": "_:b190", - "@type": "PropertyValue", - "name": "ThumbnailLength", - "value": 7738 - }, - { - "@id": "_:b191", - "@type": "PropertyValue", - "name": "ThumbnailOffset", - "value": 14464 - }, - { - "@id": "_:b192", - "@type": "PropertyValue", - "name": "ToneLevel", - "value": "0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0" - }, - { - "@id": "_:b193", - "@type": "PropertyValue", - "name": "UserComment", - "value": "" - }, - { - "@id": "_:b194", - "@type": "PropertyValue", - "name": "WB_RBLevels", - "value": "456 350 256 260" - }, - { - "@id": "_:b195", - "@type": "PropertyValue", - "name": "WhiteBalance", - "value": "Auto" - }, - { - "@id": "_:b196", - "@type": "PropertyValue", - "name": "WhiteBalance2", - "value": "Auto" - }, - { - "@id": "_:b197", - "@type": "PropertyValue", - "name": "WhiteBalanceBracket", - "value": "0 0" - }, - { - "@id": "_:b198", - "@type": "PropertyValue", - "name": "WhiteBalanceTemperature", - "value": "Auto" - }, - { - "@id": "_:b199", - "@type": "PropertyValue", - "name": "XResolution", - "value": 314 - }, - { - "@id": "_:b2", - "@type": "PropertyValue", - "name": "AFFineTune", - "value": "Off" - }, - { - "@id": "_:b20", - "@type": "PropertyValue", - "name": "ColorMatrix", - "value": "322 -40 -26 -32 332 -44 -2 -72 330" - }, - { - "@id": "_:b200", - "@type": "PropertyValue", - "name": "YCbCrPositioning", - "value": "Co-sited" - }, - { - "@id": "_:b201", - "@type": "PropertyValue", - "name": "YCbCrSubSampling", - "value": "YCbCr4:2:2 (2 1)" - }, - { - "@id": "_:b202", - "@type": "PropertyValue", - "name": "YResolution", - "value": 314 - }, - { - "@id": "_:b203", - "@type": "PropertyValue", - "name": "ZoomStepCount", - "value": 0 - }, - { - "@id": "_:b204", - "@type": "PropertyValue", - "name": "AELock", - "value": "Off" - }, - { - "@id": "_:b205", - "@type": "PropertyValue", - "name": "AFAreas", - "value": "(111,106)-(144,149)" - }, - { - "@id": "_:b206", - "@type": "PropertyValue", - "name": "AFFineTune", - "value": "Off" - }, - { - "@id": "_:b207", - "@type": "PropertyValue", - "name": "AFFineTuneAdj", - "value": "0 0 0" - }, - { - "@id": "_:b208", - "@type": "PropertyValue", - "name": "AFPoint", - "value": "Left (or n/a)" - }, - { - "@id": "_:b209", - "@type": "PropertyValue", - "name": "AFPointSelected", - "value": "(49%,69%) (49%,69%)" - }, - { - "@id": "_:b21", - "@type": "PropertyValue", - "name": "ColorSpace", - "value": "sRGB" - }, - { - "@id": "_:b210", - "@type": "PropertyValue", - "name": "AFSearch", - "value": "Ready" - }, - { - "@id": "_:b211", - "@type": "PropertyValue", - "name": "Aperture", - "value": 6.3 - }, - { - "@id": "_:b212", - "@type": "PropertyValue", - "name": "ArtFilter", - "value": "Off; 0; 0; 0" - }, - { - "@id": "_:b213", - "@type": "PropertyValue", - "name": "AspectFrame", - "value": "0 0 4031 2687" - }, - { - "@id": "_:b214", - "@type": "PropertyValue", - "name": "AspectRatio", - "value": "3:2" - }, - { - "@id": "_:b215", - "@type": "PropertyValue", - "name": "BitsPerSample", - "value": 8 - }, - { - "@id": "_:b216", - "@type": "PropertyValue", - "name": "BlackLevel2", - "value": "64 64 64 64" - }, - { - "@id": "_:b217", - "@type": "PropertyValue", - "name": "BlueBalance", - "value": 1.367188 - }, - { - "@id": "_:b218", - "@type": "PropertyValue", - "name": "BodyFirmwareVersion", - "value": 1.103 - }, - { - "@id": "_:b219", - "@type": "PropertyValue", - "name": "CameraID", - "value": "OLYMPUS DIGITAL CAMERA " - }, - { - "@id": "_:b22", - "@type": "PropertyValue", - "name": "ComponentsConfiguration", - "value": "Y, Cb, Cr, -" - }, - { - "@id": "_:b220", - "@type": "PropertyValue", - "name": "CameraSettingsVersion", - "value": "0100" - }, - { - "@id": "_:b221", - "@type": "PropertyValue", - "name": "CameraType2", - "value": "E-PL1" - }, - { - "@id": "_:b222", - "@type": "PropertyValue", - "name": "CircleOfConfusion", - "value": "0.015 mm" - }, - { - "@id": "_:b223", - "@type": "PropertyValue", - "name": "ColorComponents", - "value": 3 - }, - { - "@id": "_:b224", - "@type": "PropertyValue", - "name": "ColorMatrix", - "value": "322 -40 -26 -32 332 -44 -2 -72 330" - }, - { - "@id": "_:b225", - "@type": "PropertyValue", - "name": "ColorSpace", - "value": "sRGB" - }, - { - "@id": "_:b226", - "@type": "PropertyValue", - "name": "ComponentsConfiguration", - "value": "Y, Cb, Cr, -" - }, - { - "@id": "_:b227", - "@type": "PropertyValue", - "name": "Compression", - "value": "JPEG (old-style)" - }, - { - "@id": "_:b228", - "@type": "PropertyValue", - "name": "CompressionFactor", - "value": 4 - }, - { - "@id": "_:b229", - "@type": "PropertyValue", - "name": "Contrast", - "value": "Normal" - }, - { - "@id": "_:b23", - "@type": "PropertyValue", - "name": "Compression", - "value": "JPEG (old-style)" - }, - { - "@id": "_:b230", - "@type": "PropertyValue", - "name": "ContrastSetting", - "value": "0 (min -5, max 5)" - }, - { - "@id": "_:b231", - "@type": "PropertyValue", - "name": "CreateDate", - "value": "2017:06:11 12:56:14" - }, - { - "@id": "_:b232", - "@type": "PropertyValue", - "name": "CropHeight", - "value": 3024 - }, - { - "@id": "_:b233", - "@type": "PropertyValue", - "name": "CropLeft", - "value": "28 0" - }, - { - "@id": "_:b234", - "@type": "PropertyValue", - "name": "CropTop", - "value": "30 0" - }, - { - "@id": "_:b235", - "@type": "PropertyValue", - "name": "CropWidth", - "value": 4032 - }, - { - "@id": "_:b236", - "@type": "PropertyValue", - "name": "CustomRendered", - "value": "Normal" - }, - { - "@id": "_:b237", - "@type": "PropertyValue", - "name": "CustomSaturation", - "value": "1 (min -5, max 5)" - }, - { - "@id": "_:b238", - "@type": "PropertyValue", - "name": "DOF", - "value": "0.98 m (1.04 - 2.02 m)" - }, - { - "@id": "_:b239", - "@type": "PropertyValue", - "name": "DateTimeOriginal", - "value": "2017:06:11 12:56:14" - }, - { - "@id": "_:b24", - "@type": "PropertyValue", - "name": "CompressionFactor", - "value": 4 - }, - { - "@id": "_:b240", - "@type": "PropertyValue", - "name": "DigitalZoomRatio", - "value": 1 - }, - { - "@id": "_:b241", - "@type": "PropertyValue", - "name": "Directory", - "value": "test_data/sample/pics" - }, - { - "@id": "_:b242", - "@type": "PropertyValue", - "name": "DistortionCorrection", - "value": "Off" - }, - { - "@id": "_:b243", - "@type": "PropertyValue", - "name": "DistortionCorrection2", - "value": "Off" - }, - { - "@id": "_:b244", - "@type": "PropertyValue", - "name": "DriveMode", - "value": "Single Shot" - }, - { - "@id": "_:b245", - "@type": "PropertyValue", - "name": "EncodingProcess", - "value": "Baseline DCT, Huffman coding" - }, - { - "@id": "_:b246", - "@type": "PropertyValue", - "name": "EquipmentVersion", - "value": "0100" - }, - { - "@id": "_:b247", - "@type": "PropertyValue", - "name": "ExifByteOrder", - "value": "Little-endian (Intel, II)" - }, - { - "@id": "_:b248", - "@type": "PropertyValue", - "name": "ExifImageHeight", - "value": 2688 - }, - { - "@id": "_:b249", - "@type": "PropertyValue", - "name": "ExifImageWidth", - "value": 4032 - }, - { - "@id": "_:b25", - "@type": "PropertyValue", - "name": "Contrast", - "value": "Normal" - }, - { - "@id": "_:b250", - "@type": "PropertyValue", - "name": "ExifToolVersion", - "value": 10.8 - }, - { - "@id": "_:b251", - "@type": "PropertyValue", - "name": "ExifVersion", - "value": "0221" - }, - { - "@id": "_:b252", - "@type": "PropertyValue", - "name": "ExposureCompensation", - "value": -0.3 - }, - { - "@id": "_:b253", - "@type": "PropertyValue", - "name": "ExposureMode", - "value": "Manual" - }, - { - "@id": "_:b254", - "@type": "PropertyValue", - "name": "ExposureProgram", - "value": "Aperture-priority AE" - }, - { - "@id": "_:b255", - "@type": "PropertyValue", - "name": "ExposureShift", - "value": 0 - }, - { - "@id": "_:b256", - "@type": "PropertyValue", - "name": "ExposureTime", - "value": "1/80" - }, - { - "@id": "_:b257", - "@type": "PropertyValue", - "name": "ExtendedWBDetect", - "value": "Off" - }, - { - "@id": "_:b258", - "@type": "PropertyValue", - "name": "Extender", - "value": "None" - }, - { - "@id": "_:b259", - "@type": "PropertyValue", - "name": "ExtenderFirmwareVersion", - "value": 0 - }, - { - "@id": "_:b26", - "@type": "PropertyValue", - "name": "ContrastSetting", - "value": "0 (min -5, max 5)" - }, - { - "@id": "_:b260", - "@type": "PropertyValue", - "name": "ExtenderModel", - "value": "" - }, - { - "@id": "_:b261", - "@type": "PropertyValue", - "name": "ExtenderSerialNumber", - "value": "" - }, - { - "@id": "_:b262", - "@type": "PropertyValue", - "name": "ExtenderStatus", - "value": "Not attached" - }, - { - "@id": "_:b263", - "@type": "PropertyValue", - "name": "ExternalFlash", - "value": "Off" - }, - { - "@id": "_:b264", - "@type": "PropertyValue", - "name": "ExternalFlashBounce", - "value": "Bounce or Off" - }, - { - "@id": "_:b265", - "@type": "PropertyValue", - "name": "ExternalFlashZoom", - "value": 0 - }, - { - "@id": "_:b266", - "@type": "PropertyValue", - "name": "FNumber", - "value": 6.3 - }, - { - "@id": "_:b267", - "@type": "PropertyValue", - "name": "FOV", - "value": "47.8 deg (1.22 m)" - }, - { - "@id": "_:b268", - "@type": "PropertyValue", - "name": "FaceDetectArea", - "value": "(Binary data 383 bytes, use -b option to extract)" - }, - { - "@id": "_:b269", - "@type": "PropertyValue", - "name": "FaceDetectFrameCrop", - "value": "0 14 320 212 0 14 320 212 0 0 0 0" - }, - { - "@id": "_:b27", - "@type": "PropertyValue", - "name": "CreateDate", - "value": "2017:06:11 12:56:14" - }, - { - "@id": "_:b270", - "@type": "PropertyValue", - "name": "FaceDetectFrameSize", - "value": "320 240 320 240 0 0" - }, - { - "@id": "_:b271", - "@type": "PropertyValue", - "name": "FacesDetected", - "value": "0 0 0" - }, - { - "@id": "_:b272", - "@type": "PropertyValue", - "name": "FileAccessDate", - "value": "2018:09:19 17:01:08+10:00" - }, - { - "@id": "_:b273", - "@type": "PropertyValue", - "name": "FileInodeChangeDate", - "value": "2018:09:19 17:01:07+10:00" - }, - { - "@id": "_:b274", - "@type": "PropertyValue", - "name": "FileModifyDate", - "value": "2018:09:19 17:01:07+10:00" - }, - { - "@id": "_:b275", - "@type": "PropertyValue", - "name": "FileName", - "value": "sepia_fence.jpg" - }, - { - "@id": "_:b276", - "@type": "PropertyValue", - "name": "FilePermissions", - "value": "rw-r--r--" - }, - { - "@id": "_:b277", - "@type": "PropertyValue", - "name": "FileSize", - "value": "4.6 MB" - }, - { - "@id": "_:b278", - "@type": "PropertyValue", - "name": "FileSource", - "value": "Digital Camera" - }, - { - "@id": "_:b279", - "@type": "PropertyValue", - "name": "FileType", - "value": "JPEG" - }, - { - "@id": "_:b28", - "@type": "PropertyValue", - "name": "CropHeight", - "value": 3024 - }, - { - "@id": "_:b280", - "@type": "PropertyValue", - "name": "FileTypeExtension", - "value": "jpg" - }, - { - "@id": "_:b281", - "@type": "PropertyValue", - "name": "Flash", - "value": "On, Did not fire" - }, - { - "@id": "_:b282", - "@type": "PropertyValue", - "name": "FlashControlMode", - "value": "Off; 0; 0" - }, - { - "@id": "_:b283", - "@type": "PropertyValue", - "name": "FlashExposureComp", - "value": 0 - }, - { - "@id": "_:b284", - "@type": "PropertyValue", - "name": "FlashFirmwareVersion", - "value": 0 - }, - { - "@id": "_:b285", - "@type": "PropertyValue", - "name": "FlashIntensity", - "value": "n/a" - }, - { - "@id": "_:b286", - "@type": "PropertyValue", - "name": "FlashMode", - "value": "Fill-in" - }, - { - "@id": "_:b287", - "@type": "PropertyValue", - "name": "FlashModel", - "value": "None" - }, - { - "@id": "_:b288", - "@type": "PropertyValue", - "name": "FlashRemoteControl", - "value": "Off" - }, - { - "@id": "_:b289", - "@type": "PropertyValue", - "name": "FlashSerialNumber", - "value": "" - }, - { - "@id": "_:b29", - "@type": "PropertyValue", - "name": "CropLeft", - "value": "28 0" - }, - { - "@id": "_:b290", - "@type": "PropertyValue", - "name": "FlashType", - "value": "None" - }, - { - "@id": "_:b291", - "@type": "PropertyValue", - "name": "FlashpixVersion", - "value": "0100" - }, - { - "@id": "_:b292", - "@type": "PropertyValue", - "name": "FocalLength", - "value": "20.0 mm" - }, - { - "@id": "_:b293", - "@type": "PropertyValue", - "name": "FocalLength35efl", - "value": "20.0 mm (35 mm equivalent: 40.1 mm)" - }, - { - "@id": "_:b294", - "@type": "PropertyValue", - "name": "FocalPlaneDiagonal", - "value": "21.6 mm" - }, - { - "@id": "_:b295", - "@type": "PropertyValue", - "name": "FocusDistance", - "value": "1.375 m" - }, - { - "@id": "_:b296", - "@type": "PropertyValue", - "name": "FocusInfoVersion", - "value": "0100" - }, - { - "@id": "_:b297", - "@type": "PropertyValue", - "name": "FocusMode", - "value": "Single AF; S-AF, Imager AF" - }, - { - "@id": "_:b298", - "@type": "PropertyValue", - "name": "FocusProcess", - "value": "AF Used; 64" - }, - { - "@id": "_:b299", - "@type": "PropertyValue", - "name": "FocusStepCount", - "value": 3151 - }, - { - "@id": "_:b3", - "@type": "PropertyValue", - "name": "AFFineTuneAdj", - "value": "0 0 0" - }, - { - "@id": "_:b30", - "@type": "PropertyValue", - "name": "CropTop", - "value": "30 0" - }, - { - "@id": "_:b300", - "@type": "PropertyValue", - "name": "GainBase", - "value": 256 - }, - { - "@id": "_:b301", - "@type": "PropertyValue", - "name": "GainControl", - "value": "High gain up" - }, - { - "@id": "_:b302", - "@type": "PropertyValue", - "name": "Gradation", - "value": "Normal; Auto-Override" - }, - { - "@id": "_:b303", - "@type": "PropertyValue", - "name": "HyperfocalDistance", - "value": "4.23 m" - }, - { - "@id": "_:b304", - "@type": "PropertyValue", - "name": "ISO", - "value": 400 - }, - { - "@id": "_:b305", - "@type": "PropertyValue", - "name": "ImageDescription", - "value": "OLYMPUS DIGITAL CAMERA " - }, - { - "@id": "_:b306", - "@type": "PropertyValue", - "name": "ImageHeight", - "value": 2688 - }, - { - "@id": "_:b307", - "@type": "PropertyValue", - "name": "ImageProcessingVersion", - "value": "0112" - }, - { - "@id": "_:b308", - "@type": "PropertyValue", - "name": "ImageSize", - "value": "4032x2688" - }, - { - "@id": "_:b309", - "@type": "PropertyValue", - "name": "ImageStabilization", - "value": "On, Mode 1" - }, - { - "@id": "_:b31", - "@type": "PropertyValue", - "name": "CropWidth", - "value": 4032 - }, - { - "@id": "_:b310", - "@type": "PropertyValue", - "name": "ImageWidth", - "value": 4032 - }, - { - "@id": "_:b311", - "@type": "PropertyValue", - "name": "InternalFlash", - "value": "Off" - }, - { - "@id": "_:b312", - "@type": "PropertyValue", - "name": "InternalSerialNumber", - "value": "4102011002108002 " - }, - { - "@id": "_:b313", - "@type": "PropertyValue", - "name": "InteropIndex", - "value": "R98 - DCF basic file (sRGB)" - }, - { - "@id": "_:b314", - "@type": "PropertyValue", - "name": "InteropVersion", - "value": "0100" - }, - { - "@id": "_:b315", - "@type": "PropertyValue", - "name": "JFIFVersion", - "value": 1.01 - }, - { - "@id": "_:b316", - "@type": "PropertyValue", - "name": "LensFirmwareVersion", - "value": 1.1 - }, - { - "@id": "_:b317", - "@type": "PropertyValue", - "name": "LensID", - "value": "Lumix G 20mm F1.7 Asph." - }, - { - "@id": "_:b318", - "@type": "PropertyValue", - "name": "LensModel", - "value": "LUMIX G 20/F1.7" - }, - { - "@id": "_:b319", - "@type": "PropertyValue", - "name": "LensProperties", - "value": "0x4110" - }, - { - "@id": "_:b32", - "@type": "PropertyValue", - "name": "CustomRendered", - "value": "Normal" - }, - { - "@id": "_:b320", - "@type": "PropertyValue", - "name": "LensSerialNumber", - "value": "01FG3033651" - }, - { - "@id": "_:b321", - "@type": "PropertyValue", - "name": "LensType", - "value": "Lumix G 20mm F1.7 Asph." - }, - { - "@id": "_:b322", - "@type": "PropertyValue", - "name": "LightSource", - "value": "Unknown" - }, - { - "@id": "_:b323", - "@type": "PropertyValue", - "name": "LightValue", - "value": 9.6 - }, - { - "@id": "_:b324", - "@type": "PropertyValue", - "name": "MIMEType", - "value": "image/jpeg" - }, - { - "@id": "_:b325", - "@type": "PropertyValue", - "name": "MacroLED", - "value": "Off" - }, - { - "@id": "_:b326", - "@type": "PropertyValue", - "name": "MacroMode", - "value": "Off" - }, - { - "@id": "_:b327", - "@type": "PropertyValue", - "name": "Make", - "value": "OLYMPUS IMAGING CORP." - }, - { - "@id": "_:b328", - "@type": "PropertyValue", - "name": "ManometerPressure", - "value": "0 kPa" - }, - { - "@id": "_:b329", - "@type": "PropertyValue", - "name": "ManometerReading", - "value": "0 m, 0 ft" - }, - { - "@id": "_:b33", - "@type": "PropertyValue", - "name": "CustomSaturation", - "value": "1 (min -5, max 5)" - }, - { - "@id": "_:b330", - "@type": "PropertyValue", - "name": "ManualFlash", - "value": "Off" - }, - { - "@id": "_:b331", - "@type": "PropertyValue", - "name": "ManualFlashStrength", - "value": "n/a" - }, - { - "@id": "_:b332", - "@type": "PropertyValue", - "name": "MaxAperture", - "value": 1.8 - }, - { - "@id": "_:b333", - "@type": "PropertyValue", - "name": "MaxApertureAtMaxFocal", - "value": 1.7 - }, - { - "@id": "_:b334", - "@type": "PropertyValue", - "name": "MaxApertureAtMinFocal", - "value": 1.7 - }, - { - "@id": "_:b335", - "@type": "PropertyValue", - "name": "MaxApertureValue", - "value": 1.7 - }, - { - "@id": "_:b336", - "@type": "PropertyValue", - "name": "MaxFaces", - "value": "8 8 0" - }, - { - "@id": "_:b337", - "@type": "PropertyValue", - "name": "MaxFocalLength", - "value": 20 - }, - { - "@id": "_:b338", - "@type": "PropertyValue", - "name": "Megapixels", - "value": 10.8 - }, - { - "@id": "_:b339", - "@type": "PropertyValue", - "name": "MeteringMode", - "value": "ESP" - }, - { - "@id": "_:b34", - "@type": "PropertyValue", - "name": "DOF", - "value": "0.98 m (1.04 - 2.02 m)" - }, - { - "@id": "_:b340", - "@type": "PropertyValue", - "name": "MinFocalLength", - "value": 20 - }, - { - "@id": "_:b341", - "@type": "PropertyValue", - "name": "Model", - "value": "E-PL1" - }, - { - "@id": "_:b342", - "@type": "PropertyValue", - "name": "ModifiedSaturation", - "value": "Off" - }, - { - "@id": "_:b343", - "@type": "PropertyValue", - "name": "ModifyDate", - "value": "2017:06:11 12:56:14" - }, - { - "@id": "_:b344", - "@type": "PropertyValue", - "name": "MultipleExposureMode", - "value": "Off; 1" - }, - { - "@id": "_:b345", - "@type": "PropertyValue", - "name": "NoiseFilter", - "value": "Standard" - }, - { - "@id": "_:b346", - "@type": "PropertyValue", - "name": "NoiseReduction", - "value": "Auto" - }, - { - "@id": "_:b347", - "@type": "PropertyValue", - "name": "NoiseReduction2", - "value": "(none)" - }, - { - "@id": "_:b348", - "@type": "PropertyValue", - "name": "Orientation", - "value": "Horizontal (normal)" - }, - { - "@id": "_:b349", - "@type": "PropertyValue", - "name": "PanoramaMode", - "value": "Off" - }, - { - "@id": "_:b35", - "@type": "PropertyValue", - "name": "DateTimeOriginal", - "value": "2017:06:11 12:56:14" - }, - { - "@id": "_:b350", - "@type": "PropertyValue", - "name": "PictureMode", - "value": "Vivid; 2" - }, - { - "@id": "_:b351", - "@type": "PropertyValue", - "name": "PictureModeBWFilter", - "value": "n/a" - }, - { - "@id": "_:b352", - "@type": "PropertyValue", - "name": "PictureModeContrast", - "value": "0 (min -2, max 2)" - }, - { - "@id": "_:b353", - "@type": "PropertyValue", - "name": "PictureModeEffect", - "value": "Standard" - }, - { - "@id": "_:b354", - "@type": "PropertyValue", - "name": "PictureModeSaturation", - "value": "0 (min -2, max 2)" - }, - { - "@id": "_:b355", - "@type": "PropertyValue", - "name": "PictureModeSharpness", - "value": "0 (min -2, max 2)" - }, - { - "@id": "_:b356", - "@type": "PropertyValue", - "name": "PictureModeTone", - "value": "n/a" - }, - { - "@id": "_:b357", - "@type": "PropertyValue", - "name": "PreviewImage", - "value": "(Binary data 514170 bytes, use -b option to extract)" - }, - { - "@id": "_:b358", - "@type": "PropertyValue", - "name": "PreviewImageLength", - "value": 514170 - }, - { - "@id": "_:b359", - "@type": "PropertyValue", - "name": "PreviewImageStart", - "value": 4600626 - }, - { - "@id": "_:b36", - "@type": "PropertyValue", - "name": "DigitalZoomRatio", - "value": 1 - }, - { - "@id": "_:b360", - "@type": "PropertyValue", - "name": "PreviewImageValid", - "value": "Yes" - }, - { - "@id": "_:b361", - "@type": "PropertyValue", - "name": "PrintIMVersion", - "value": "0300" - }, - { - "@id": "_:b362", - "@type": "PropertyValue", - "name": "RawDevColorSpace", - "value": "sRGB" - }, - { - "@id": "_:b363", - "@type": "PropertyValue", - "name": "RawDevContrastValue", - "value": "0 0 0" - }, - { - "@id": "_:b364", - "@type": "PropertyValue", - "name": "RawDevEditStatus", - "value": "Original" - }, - { - "@id": "_:b365", - "@type": "PropertyValue", - "name": "RawDevEngine", - "value": "High Speed" - }, - { - "@id": "_:b366", - "@type": "PropertyValue", - "name": "RawDevExposureBiasValue", - "value": 0 - }, - { - "@id": "_:b367", - "@type": "PropertyValue", - "name": "RawDevGrayPoint", - "value": "0 0 0" - }, - { - "@id": "_:b368", - "@type": "PropertyValue", - "name": "RawDevMemoryColorEmphasis", - "value": 0 - }, - { - "@id": "_:b369", - "@type": "PropertyValue", - "name": "RawDevNoiseReduction", - "value": "(none)" - }, - { - "@id": "_:b37", - "@type": "PropertyValue", - "name": "Directory", - "value": "test_data/sample/pics" - }, - { - "@id": "_:b370", - "@type": "PropertyValue", - "name": "RawDevSaturationEmphasis", - "value": "0 0 0" - }, - { - "@id": "_:b371", - "@type": "PropertyValue", - "name": "RawDevSettings", - "value": "(none)" - }, - { - "@id": "_:b372", - "@type": "PropertyValue", - "name": "RawDevSharpnessValue", - "value": "0 0 0" - }, - { - "@id": "_:b373", - "@type": "PropertyValue", - "name": "RawDevVersion", - "value": "0100" - }, - { - "@id": "_:b374", - "@type": "PropertyValue", - "name": "RawDevWBFineAdjustment", - "value": 0 - }, - { - "@id": "_:b375", - "@type": "PropertyValue", - "name": "RawDevWhiteBalanceValue", - "value": 0 - }, - { - "@id": "_:b376", - "@type": "PropertyValue", - "name": "RedBalance", - "value": 1.78125 - }, - { - "@id": "_:b377", - "@type": "PropertyValue", - "name": "ResolutionUnit", - "value": "inches" - }, - { - "@id": "_:b378", - "@type": "PropertyValue", - "name": "Saturation", - "value": "High" - }, - { - "@id": "_:b379", - "@type": "PropertyValue", - "name": "ScaleFactor35efl", - "value": 2 - }, - { - "@id": "_:b38", - "@type": "PropertyValue", - "name": "DistortionCorrection", - "value": "Off" - }, - { - "@id": "_:b380", - "@type": "PropertyValue", - "name": "SceneCaptureType", - "value": "Standard" - }, - { - "@id": "_:b381", - "@type": "PropertyValue", - "name": "SceneDetect", - "value": 0 - }, - { - "@id": "_:b382", - "@type": "PropertyValue", - "name": "SceneMode", - "value": "Standard" - }, - { - "@id": "_:b383", - "@type": "PropertyValue", - "name": "SensorCalibration", - "value": "0 0" - }, - { - "@id": "_:b384", - "@type": "PropertyValue", - "name": "SensorTemperature", - "value": "48.0 C" - }, - { - "@id": "_:b385", - "@type": "PropertyValue", - "name": "SerialNumber", - "value": "B3B505338" - }, - { - "@id": "_:b386", - "@type": "PropertyValue", - "name": "ShadingCompensation", - "value": "Off" - }, - { - "@id": "_:b387", - "@type": "PropertyValue", - "name": "ShadingCompensation2", - "value": "Off" - }, - { - "@id": "_:b388", - "@type": "PropertyValue", - "name": "Sharpness", - "value": "Hard" - }, - { - "@id": "_:b389", - "@type": "PropertyValue", - "name": "SharpnessSetting", - "value": "1 (min -5, max 5)" - }, - { - "@id": "_:b39", - "@type": "PropertyValue", - "name": "DistortionCorrection2", - "value": "Off" - }, - { - "@id": "_:b390", - "@type": "PropertyValue", - "name": "ShutterSpeed", - "value": "1/80" - }, - { - "@id": "_:b391", - "@type": "PropertyValue", - "name": "Software", - "value": "Version 1.1" - }, - { - "@id": "_:b392", - "@type": "PropertyValue", - "name": "SourceFile", - "value": "test_data/sample/pics/sepia_fence.jpg" - }, - { - "@id": "_:b393", - "@type": "PropertyValue", - "name": "SpecialMode", - "value": "Normal, Sequence: 0, Panorama: (none)" - }, - { - "@id": "_:b394", - "@type": "PropertyValue", - "name": "ThumbnailImage", - "value": "(Binary data 7738 bytes, use -b option to extract)" - }, - { - "@id": "_:b395", - "@type": "PropertyValue", - "name": "ThumbnailLength", - "value": 7738 - }, - { - "@id": "_:b396", - "@type": "PropertyValue", - "name": "ThumbnailOffset", - "value": 14482 - }, - { - "@id": "_:b397", - "@type": "PropertyValue", - "name": "ToneLevel", - "value": "0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0" - }, - { - "@id": "_:b398", - "@type": "PropertyValue", - "name": "UserComment", - "value": "" - }, - { - "@id": "_:b399", - "@type": "PropertyValue", - "name": "WB_RBLevels", - "value": "456 350 256 260" - }, - { - "@id": "_:b4", - "@type": "PropertyValue", - "name": "AFPoint", - "value": "Left (or n/a)" - }, - { - "@id": "_:b40", - "@type": "PropertyValue", - "name": "DriveMode", - "value": "Single Shot" - }, - { - "@id": "_:b400", - "@type": "PropertyValue", - "name": "WhiteBalance", - "value": "Auto" - }, - { - "@id": "_:b401", - "@type": "PropertyValue", - "name": "WhiteBalance2", - "value": "Auto" - }, - { - "@id": "_:b402", - "@type": "PropertyValue", - "name": "WhiteBalanceBracket", - "value": "0 0" - }, - { - "@id": "_:b403", - "@type": "PropertyValue", - "name": "WhiteBalanceTemperature", - "value": "Auto" - }, - { - "@id": "_:b404", - "@type": "PropertyValue", - "name": "XResolution", - "value": 314 - }, - { - "@id": "_:b405", - "@type": "PropertyValue", - "name": "YCbCrPositioning", - "value": "Co-sited" - }, - { - "@id": "_:b406", - "@type": "PropertyValue", - "name": "YCbCrSubSampling", - "value": "YCbCr4:2:2 (2 1)" - }, - { - "@id": "_:b407", - "@type": "PropertyValue", - "name": "YResolution", - "value": 314 - }, - { - "@id": "_:b408", - "@type": "PropertyValue", - "name": "ZoomStepCount", - "value": 0 - }, - { - "@id": "_:b41", - "@type": "PropertyValue", - "name": "EncodingProcess", - "value": "Baseline DCT, Huffman coding" - }, - { - "@id": "_:b42", - "@type": "PropertyValue", - "name": "EquipmentVersion", - "value": "0100" - }, - { - "@id": "_:b43", - "@type": "PropertyValue", - "name": "ExifByteOrder", - "value": "Little-endian (Intel, II)" - }, - { - "@id": "_:b44", - "@type": "PropertyValue", - "name": "ExifImageHeight", - "value": 2688 - }, - { - "@id": "_:b45", - "@type": "PropertyValue", - "name": "ExifImageWidth", - "value": 4032 - }, - { - "@id": "_:b46", - "@type": "PropertyValue", - "name": "ExifToolVersion", - "value": 10.8 - }, - { - "@id": "_:b47", - "@type": "PropertyValue", - "name": "ExifVersion", - "value": "0221" - }, - { - "@id": "_:b48", - "@type": "PropertyValue", - "name": "ExposureCompensation", - "value": -0.3 - }, - { - "@id": "_:b49", - "@type": "PropertyValue", - "name": "ExposureMode", - "value": "Manual" - }, - { - "@id": "_:b5", - "@type": "PropertyValue", - "name": "AFPointSelected", - "value": "(49%,69%) (49%,69%)" - }, - { - "@id": "_:b50", - "@type": "PropertyValue", - "name": "ExposureProgram", - "value": "Aperture-priority AE" - }, - { - "@id": "_:b51", - "@type": "PropertyValue", - "name": "ExposureShift", - "value": 0 - }, - { - "@id": "_:b52", - "@type": "PropertyValue", - "name": "ExposureTime", - "value": "1/80" - }, - { - "@id": "_:b53", - "@type": "PropertyValue", - "name": "ExtendedWBDetect", - "value": "Off" - }, - { - "@id": "_:b54", - "@type": "PropertyValue", - "name": "Extender", - "value": "None" - }, - { - "@id": "_:b55", - "@type": "PropertyValue", - "name": "ExtenderFirmwareVersion", - "value": 0 - }, - { - "@id": "_:b56", - "@type": "PropertyValue", - "name": "ExtenderModel", - "value": "" - }, - { - "@id": "_:b57", - "@type": "PropertyValue", - "name": "ExtenderSerialNumber", - "value": "" - }, - { - "@id": "_:b58", - "@type": "PropertyValue", - "name": "ExtenderStatus", - "value": "Not attached" - }, - { - "@id": "_:b59", - "@type": "PropertyValue", - "name": "ExternalFlash", - "value": "Off" - }, - { - "@id": "_:b6", - "@type": "PropertyValue", - "name": "AFSearch", - "value": "Ready" - }, - { - "@id": "_:b60", - "@type": "PropertyValue", - "name": "ExternalFlashBounce", - "value": "Bounce or Off" - }, - { - "@id": "_:b61", - "@type": "PropertyValue", - "name": "ExternalFlashZoom", - "value": 0 - }, - { - "@id": "_:b62", - "@type": "PropertyValue", - "name": "FNumber", - "value": 6.3 - }, - { - "@id": "_:b63", - "@type": "PropertyValue", - "name": "FOV", - "value": "47.8 deg (1.22 m)" - }, - { - "@id": "_:b64", - "@type": "PropertyValue", - "name": "FaceDetectArea", - "value": "(Binary data 383 bytes, use -b option to extract)" - }, - { - "@id": "_:b65", - "@type": "PropertyValue", - "name": "FaceDetectFrameCrop", - "value": "0 14 320 212 0 14 320 212 0 0 0 0" - }, - { - "@id": "_:b66", - "@type": "PropertyValue", - "name": "FaceDetectFrameSize", - "value": "320 240 320 240 0 0" - }, - { - "@id": "_:b67", - "@type": "PropertyValue", - "name": "FacesDetected", - "value": "0 0 0" - }, - { - "@id": "_:b68", - "@type": "PropertyValue", - "name": "FileAccessDate", - "value": "2018:09:19 16:05:34+10:00" - }, - { - "@id": "_:b69", - "@type": "PropertyValue", - "name": "FileInodeChangeDate", - "value": "2018:09:19 16:04:32+10:00" - }, - { - "@id": "_:b7", - "@type": "PropertyValue", - "name": "Aperture", - "value": 6.3 - }, - { - "@id": "_:b70", - "@type": "PropertyValue", - "name": "FileModifyDate", - "value": "2017:06:18 13:10:09+10:00" - }, - { - "@id": "_:b71", - "@type": "PropertyValue", - "name": "FileName", - "value": "2017-06-11 12.56.14.jpg" - }, - { - "@id": "_:b72", - "@type": "PropertyValue", - "name": "FilePermissions", - "value": "rw-r--r--" - }, - { - "@id": "_:b73", - "@type": "PropertyValue", - "name": "FileSize", - "value": "4.9 MB" - }, - { - "@id": "_:b74", - "@type": "PropertyValue", - "name": "FileSource", - "value": "Digital Camera" - }, - { - "@id": "_:b75", - "@type": "PropertyValue", - "name": "FileType", - "value": "JPEG" - }, - { - "@id": "_:b76", - "@type": "PropertyValue", - "name": "FileTypeExtension", - "value": "jpg" - }, - { - "@id": "_:b77", - "@type": "PropertyValue", - "name": "Flash", - "value": "On, Did not fire" - }, - { - "@id": "_:b78", - "@type": "PropertyValue", - "name": "FlashControlMode", - "value": "Off; 0; 0" - }, - { - "@id": "_:b79", - "@type": "PropertyValue", - "name": "FlashExposureComp", - "value": 0 - }, - { - "@id": "_:b8", - "@type": "PropertyValue", - "name": "ArtFilter", - "value": "Off; 0; 0; 0" - }, - { - "@id": "_:b80", - "@type": "PropertyValue", - "name": "FlashFirmwareVersion", - "value": 0 - }, - { - "@id": "_:b81", - "@type": "PropertyValue", - "name": "FlashIntensity", - "value": "n/a" - }, - { - "@id": "_:b82", - "@type": "PropertyValue", - "name": "FlashMode", - "value": "Fill-in" - }, - { - "@id": "_:b83", - "@type": "PropertyValue", - "name": "FlashModel", - "value": "None" - }, - { - "@id": "_:b84", - "@type": "PropertyValue", - "name": "FlashRemoteControl", - "value": "Off" - }, - { - "@id": "_:b85", - "@type": "PropertyValue", - "name": "FlashSerialNumber", - "value": "" - }, - { - "@id": "_:b86", - "@type": "PropertyValue", - "name": "FlashType", - "value": "None" - }, - { - "@id": "_:b87", - "@type": "PropertyValue", - "name": "FlashpixVersion", - "value": "0100" - }, - { - "@id": "_:b88", - "@type": "PropertyValue", - "name": "FocalLength", - "value": "20.0 mm" - }, - { - "@id": "_:b89", - "@type": "PropertyValue", - "name": "FocalLength35efl", - "value": "20.0 mm (35 mm equivalent: 40.1 mm)" - }, - { - "@id": "_:b9", - "@type": "PropertyValue", - "name": "AspectFrame", - "value": "0 0 4031 2687" - }, - { - "@id": "_:b90", - "@type": "PropertyValue", - "name": "FocalPlaneDiagonal", - "value": "21.6 mm" - }, - { - "@id": "_:b91", - "@type": "PropertyValue", - "name": "FocusDistance", - "value": "1.375 m" - }, - { - "@id": "_:b92", - "@type": "PropertyValue", - "name": "FocusInfoVersion", - "value": "0100" - }, - { - "@id": "_:b93", - "@type": "PropertyValue", - "name": "FocusMode", - "value": "Single AF; S-AF, Imager AF" - }, - { - "@id": "_:b94", - "@type": "PropertyValue", - "name": "FocusProcess", - "value": "AF Used; 64" - }, - { - "@id": "_:b95", - "@type": "PropertyValue", - "name": "FocusStepCount", - "value": 3151 - }, - { - "@id": "_:b96", - "@type": "PropertyValue", - "name": "GainBase", - "value": 256 - }, - { - "@id": "_:b97", - "@type": "PropertyValue", - "name": "GainControl", - "value": "High gain up" - }, - { - "@id": "_:b98", - "@type": "PropertyValue", - "name": "Gradation", - "value": "Normal; Auto-Override" - }, - { - "@id": "_:b99", - "@type": "PropertyValue", - "name": "HyperfocalDistance", - "value": "4.23 m" - }, - { - "@id": "http://ands.org.au", - "@type": "Organization", - "description": "The core purpose of the Australian National Data Service (ANDS) is to make Australia’s research data assets more valuable for researchers, research institutions and the nation.", - "identifier": "http://ands.org.au", - "name": "Australian National Data Service" - }, - { - "@id": "http://dx.doi.org/10.1000/123456", - "@type": "ScholarlyArticle", - "creator": { - "@id": "http://orcid.org/0000-0002-3545-944X" - }, - "datePublished": "2018", - "identifier": [ - "http://dx.doi.org/10.1000/123456", - "dx.doi.org/10.1000/123456" - ], - "name": "This is an example publication with a dodgy DOI" - }, - { - "@id": "http://eresearch.uts.edu.au/projects/provisioner", - "@type": "Organization", - "description": "The University of Technology Sydney Provisioner project is ", - "funder": [ - { - "@id": "http://uts.edu.au" - }, - { - "@id": "http://ands.org.au" - } - ], - "identifier": "http://eresearch.uts.edu.au/projects/provisioner", - "name": "Provisioner Project" - }, - { - "@id": "http://orcid.org/0000-0002-3545-944X", - "@type": "Person", - "affiliation": { - "@id": "http://uts.edu.au" - }, - "contactPoint": { - "@id": "peter.sefton@uts.edu.au" - }, - "email": "pt@ptsefton.com", - "familyName": "Sefton", - "givenName": "Peter", - "identifier": "http://orcid.org/0000-0002-3545-944X", - "name": "Peter Sefton" - }, - { - "@id": "http://uts.edu.au", - "@type": "Organization", - "address": "Broadway, 2007, NSW Australia", - "contactPoint": { - "@id": "peter.sefton@uts.edu.au" - }, - "identifier": "http://uts.edu.au", - "name": "University of Technology Sydney" - }, - { - "@id": "http://www.geonames.org/8152662/catalina-park.html", - "@type": "Place", - "URL": "https://en.wikipedia.org/wiki/Catalina_Park", - "address": "Katoomba, NSW", - "description": "Catalina Park is a disused motor racing venue, located at Katoomba, in the Blue Mountains, New South Wales, Australia, and is recognised as an Aboriginal Place due to the long association of the local Gundungarra and Darug clans to the area.", - "geo": { - "@id": "98e56ecb-176f-4a09-8367-126e34f9d137" - }, - "identifier": "http://www.geonames.org/8152662/catalina-park.html", - "name": "Catalina Park" - }, - { - "@id": "https://creativecommons.org/licenses/by-nc-sa/3.0/au/", - "@type": "CreativeWork", - "description": "This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Australia License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/au/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.", - "identifier": "https://creativecommons.org/licenses/by-nc-sa/3.0/au/", - "name": "CC BY-NC-SA 3.0 AU" - }, - { - "@id": "https://dx.doi.org/10.5281/zenodo.1009240", - "@type": "Dataset", - "contactPoint": { - "@id": "peter.sefton@uts.edu.au" - }, - "contentLocation": { - "@id": "http://www.geonames.org/8152662/catalina-park.html" - }, - "path": "./", - "creator": { - "@id": "http://orcid.org/0000-0002-3545-944X" - }, - "datePublished": "2017-06-29", - "description": "This is a simple dataset for demonstration purposes it contains just one image and a directory full of useless text files.", - "hasPart": [ - { - "@id": "lots_of_little_files" - }, - { - "@id": "pics" - } - ], - "identifier": [ - "https://dx.doi.org/10.5281/zenodo.1009240", - "dx.doi.org/10.5281/zenodo.1009240" - ], - "keywords": "Dogs, Fences, The Gully", - "name": "Sample dataset for DataCrate v1.0", - "publisher": { - "@id": "http://uts.edu.au" - }, - "relatedLink": { - "@id": "http://dx.doi.org/10.1000/123456" - }, - "temporalCoverage": "2017" - }, - { - "@id": "https://github.com/UTS-eResearch/projects/datacrate", - "@type": "Organization", - "description": "The DataCrate project is to write the spec for DataCrate, of which this is an example. The DataCrate project is part of the University of Technology Sydney's Provisioner project, which was part-funded by the Australian National Data Service (ANDS) - now part of the Australian Research Data Commons (ARDC).", - "funder": { - "@id": "http://uts.edu.au" - }, - "identifier": "https://github.com/UTS-eResearch/projects/datacrate", - "name": "DataCrate Project" - }, - { - "@id": "https://www.imagemagick.org/", - "@type": "SoftwareApplication", - "URL": "https://www.imagemagick.org/", - "identifier": "https://www.imagemagick.org/", - "name": "ImageMagick", - "version": " ImageMagick 7.0.8-2 Q16 x86_64 2018-06-19" - }, - { - "@id": "lots_of_little_files", - "@type": "Dataset", - "path": "lots_of_little_files", - "description": "This directory contains many small files, that we’re not going to describe in detail.", - "identifier": "./lots_of_little_files", - "name": "Too many files" - }, - { - "@id": "peter.sefton@uts.edu.au", - "@type": "ContactPoint", - "URL": "http://orcid.org/0000-0002-3545-944X", - "contactType": "customer service", - "email": "peter.sefton@uts.edu.au", - "identifier": "peter.sefton@uts.edu.au", - "name": "Contact Peter Sefton" - }, - { - "@id": "pics", - "@type": "Dataset", - "path": "pics", - "description": "This directory contains the images for the research project", - "hasPart": [ - { - "@id": "pics/2017-06-11 12.56.14.jpg" - }, - { - "@id": "pics/sepia_fence.jpg" - }, - { - "@id": "pics/thumbs" - } - ], - "identifier": "./pics", - "name": "Pictures" - }, - { - "@id": "pics/2017-06-11 12.56.14.jpg", - "@type": "ImageObject", - "contentSize": "5114778", - "path": "pics/2017-06-11 12.56.14.jpg", - "creator": { - "@id": "http://orcid.org/0000-0002-3545-944X" - }, - "description": "Depicts a fence at a disused motor racing venue with the front part of a slightly out of focus black dog in the foreground.", - "encodingFormat": "Exchangeable Image File Format (Compressed)", - "exifData": [ - { - "@id": "_:b0" - }, - { - "@id": "_:b1" - }, - { - "@id": "_:b2" - }, - { - "@id": "_:b3" - }, - { - "@id": "_:b4" - }, - { - "@id": "_:b5" - }, - { - "@id": "_:b6" - }, - { - "@id": "_:b7" - }, - { - "@id": "_:b8" - }, - { - "@id": "_:b9" - }, - { - "@id": "_:b10" - }, - { - "@id": "_:b11" - }, - { - "@id": "_:b12" - }, - { - "@id": "_:b13" - }, - { - "@id": "_:b14" - }, - { - "@id": "_:b15" - }, - { - "@id": "_:b16" - }, - { - "@id": "_:b17" - }, - { - "@id": "_:b18" - }, - { - "@id": "_:b19" - }, - { - "@id": "_:b20" - }, - { - "@id": "_:b21" - }, - { - "@id": "_:b22" - }, - { - "@id": "_:b23" - }, - { - "@id": "_:b24" - }, - { - "@id": "_:b25" - }, - { - "@id": "_:b26" - }, - { - "@id": "_:b27" - }, - { - "@id": "_:b28" - }, - { - "@id": "_:b29" - }, - { - "@id": "_:b30" - }, - { - "@id": "_:b31" - }, - { - "@id": "_:b32" - }, - { - "@id": "_:b33" - }, - { - "@id": "_:b34" - }, - { - "@id": "_:b35" - }, - { - "@id": "_:b36" - }, - { - "@id": "_:b37" - }, - { - "@id": "_:b38" - }, - { - "@id": "_:b39" - }, - { - "@id": "_:b40" - }, - { - "@id": "_:b41" - }, - { - "@id": "_:b42" - }, - { - "@id": "_:b43" - }, - { - "@id": "_:b44" - }, - { - "@id": "_:b45" - }, - { - "@id": "_:b46" - }, - { - "@id": "_:b47" - }, - { - "@id": "_:b48" - }, - { - "@id": "_:b49" - }, - { - "@id": "_:b50" - }, - { - "@id": "_:b51" - }, - { - "@id": "_:b52" - }, - { - "@id": "_:b53" - }, - { - "@id": "_:b54" - }, - { - "@id": "_:b55" - }, - { - "@id": "_:b56" - }, - { - "@id": "_:b57" - }, - { - "@id": "_:b58" - }, - { - "@id": "_:b59" - }, - { - "@id": "_:b60" - }, - { - "@id": "_:b61" - }, - { - "@id": "_:b62" - }, - { - "@id": "_:b63" - }, - { - "@id": "_:b64" - }, - { - "@id": "_:b65" - }, - { - "@id": "_:b66" - }, - { - "@id": "_:b67" - }, - { - "@id": "_:b68" - }, - { - "@id": "_:b69" - }, - { - "@id": "_:b70" - }, - { - "@id": "_:b71" - }, - { - "@id": "_:b72" - }, - { - "@id": "_:b73" - }, - { - "@id": "_:b74" - }, - { - "@id": "_:b75" - }, - { - "@id": "_:b76" - }, - { - "@id": "_:b77" - }, - { - "@id": "_:b78" - }, - { - "@id": "_:b79" - }, - { - "@id": "_:b80" - }, - { - "@id": "_:b81" - }, - { - "@id": "_:b82" - }, - { - "@id": "_:b83" - }, - { - "@id": "_:b84" - }, - { - "@id": "_:b85" - }, - { - "@id": "_:b86" - }, - { - "@id": "_:b87" - }, - { - "@id": "_:b88" - }, - { - "@id": "_:b89" - }, - { - "@id": "_:b90" - }, - { - "@id": "_:b91" - }, - { - "@id": "_:b92" - }, - { - "@id": "_:b93" - }, - { - "@id": "_:b94" - }, - { - "@id": "_:b95" - }, - { - "@id": "_:b96" - }, - { - "@id": "_:b97" - }, - { - "@id": "_:b98" - }, - { - "@id": "_:b99" - }, - { - "@id": "_:b100" - }, - { - "@id": "_:b101" - }, - { - "@id": "_:b102" - }, - { - "@id": "_:b103" - }, - { - "@id": "_:b104" - }, - { - "@id": "_:b105" - }, - { - "@id": "_:b106" - }, - { - "@id": "_:b107" - }, - { - "@id": "_:b108" - }, - { - "@id": "_:b109" - }, - { - "@id": "_:b110" - }, - { - "@id": "_:b111" - }, - { - "@id": "_:b112" - }, - { - "@id": "_:b113" - }, - { - "@id": "_:b114" - }, - { - "@id": "_:b115" - }, - { - "@id": "_:b116" - }, - { - "@id": "_:b117" - }, - { - "@id": "_:b118" - }, - { - "@id": "_:b119" - }, - { - "@id": "_:b120" - }, - { - "@id": "_:b121" - }, - { - "@id": "_:b122" - }, - { - "@id": "_:b123" - }, - { - "@id": "_:b124" - }, - { - "@id": "_:b125" - }, - { - "@id": "_:b126" - }, - { - "@id": "_:b127" - }, - { - "@id": "_:b128" - }, - { - "@id": "_:b129" - }, - { - "@id": "_:b130" - }, - { - "@id": "_:b131" - }, - { - "@id": "_:b132" - }, - { - "@id": "_:b133" - }, - { - "@id": "_:b134" - }, - { - "@id": "_:b135" - }, - { - "@id": "_:b136" - }, - { - "@id": "_:b137" - }, - { - "@id": "_:b138" - }, - { - "@id": "_:b139" - }, - { - "@id": "_:b140" - }, - { - "@id": "_:b141" - }, - { - "@id": "_:b142" - }, - { - "@id": "_:b143" - }, - { - "@id": "_:b144" - }, - { - "@id": "_:b145" - }, - { - "@id": "_:b146" - }, - { - "@id": "_:b147" - }, - { - "@id": "_:b148" - }, - { - "@id": "_:b149" - }, - { - "@id": "_:b150" - }, - { - "@id": "_:b151" - }, - { - "@id": "_:b152" - }, - { - "@id": "_:b153" - }, - { - "@id": "_:b154" - }, - { - "@id": "_:b155" - }, - { - "@id": "_:b156" - }, - { - "@id": "_:b157" - }, - { - "@id": "_:b158" - }, - { - "@id": "_:b159" - }, - { - "@id": "_:b160" - }, - { - "@id": "_:b161" - }, - { - "@id": "_:b162" - }, - { - "@id": "_:b163" - }, - { - "@id": "_:b164" - }, - { - "@id": "_:b165" - }, - { - "@id": "_:b166" - }, - { - "@id": "_:b167" - }, - { - "@id": "_:b168" - }, - { - "@id": "_:b169" - }, - { - "@id": "_:b170" - }, - { - "@id": "_:b171" - }, - { - "@id": "_:b172" - }, - { - "@id": "_:b173" - }, - { - "@id": "_:b174" - }, - { - "@id": "_:b175" - }, - { - "@id": "_:b176" - }, - { - "@id": "_:b177" - }, - { - "@id": "_:b178" - }, - { - "@id": "_:b179" - }, - { - "@id": "_:b180" - }, - { - "@id": "_:b181" - }, - { - "@id": "_:b182" - }, - { - "@id": "_:b183" - }, - { - "@id": "_:b184" - }, - { - "@id": "_:b185" - }, - { - "@id": "_:b186" - }, - { - "@id": "_:b187" - }, - { - "@id": "_:b188" - }, - { - "@id": "_:b189" - }, - { - "@id": "_:b190" - }, - { - "@id": "_:b191" - }, - { - "@id": "_:b192" - }, - { - "@id": "_:b193" - }, - { - "@id": "_:b194" - }, - { - "@id": "_:b195" - }, - { - "@id": "_:b196" - }, - { - "@id": "_:b197" - }, - { - "@id": "_:b198" - }, - { - "@id": "_:b199" - }, - { - "@id": "_:b200" - }, - { - "@id": "_:b201" - }, - { - "@id": "_:b202" - }, - { - "@id": "_:b203" - } - ], - "fileFormat": "http://www.nationalarchives.gov.uk/PRONOM/fmt/645", - "name": "pics/2017-06-11 12.56.14.jpg", - "thumbnail": { - "@id": "pics/thumbs/2017-06-11 12.56.14.png" - } - }, - { - "@id": "pics/sepia_fence.jpg", - "@type": "ImageObject", - "contentSize": "4855037", - "path": "pics/sepia_fence.jpg", - "description": "Sepia tone version of my fence/dog pic", - "encodingFormat": "JPEG File Interchange Format", - "exifData": [ - { - "@id": "_:b204" - }, - { - "@id": "_:b205" - }, - { - "@id": "_:b206" - }, - { - "@id": "_:b207" - }, - { - "@id": "_:b208" - }, - { - "@id": "_:b209" - }, - { - "@id": "_:b210" - }, - { - "@id": "_:b211" - }, - { - "@id": "_:b212" - }, - { - "@id": "_:b213" - }, - { - "@id": "_:b214" - }, - { - "@id": "_:b215" - }, - { - "@id": "_:b216" - }, - { - "@id": "_:b217" - }, - { - "@id": "_:b218" - }, - { - "@id": "_:b219" - }, - { - "@id": "_:b220" - }, - { - "@id": "_:b221" - }, - { - "@id": "_:b222" - }, - { - "@id": "_:b223" - }, - { - "@id": "_:b224" - }, - { - "@id": "_:b225" - }, - { - "@id": "_:b226" - }, - { - "@id": "_:b227" - }, - { - "@id": "_:b228" - }, - { - "@id": "_:b229" - }, - { - "@id": "_:b230" - }, - { - "@id": "_:b231" - }, - { - "@id": "_:b232" - }, - { - "@id": "_:b233" - }, - { - "@id": "_:b234" - }, - { - "@id": "_:b235" - }, - { - "@id": "_:b236" - }, - { - "@id": "_:b237" - }, - { - "@id": "_:b238" - }, - { - "@id": "_:b239" - }, - { - "@id": "_:b240" - }, - { - "@id": "_:b241" - }, - { - "@id": "_:b242" - }, - { - "@id": "_:b243" - }, - { - "@id": "_:b244" - }, - { - "@id": "_:b245" - }, - { - "@id": "_:b246" - }, - { - "@id": "_:b247" - }, - { - "@id": "_:b248" - }, - { - "@id": "_:b249" - }, - { - "@id": "_:b250" - }, - { - "@id": "_:b251" - }, - { - "@id": "_:b252" - }, - { - "@id": "_:b253" - }, - { - "@id": "_:b254" - }, - { - "@id": "_:b255" - }, - { - "@id": "_:b256" - }, - { - "@id": "_:b257" - }, - { - "@id": "_:b258" - }, - { - "@id": "_:b259" - }, - { - "@id": "_:b260" - }, - { - "@id": "_:b261" - }, - { - "@id": "_:b262" - }, - { - "@id": "_:b263" - }, - { - "@id": "_:b264" - }, - { - "@id": "_:b265" - }, - { - "@id": "_:b266" - }, - { - "@id": "_:b267" - }, - { - "@id": "_:b268" - }, - { - "@id": "_:b269" - }, - { - "@id": "_:b270" - }, - { - "@id": "_:b271" - }, - { - "@id": "_:b272" - }, - { - "@id": "_:b273" - }, - { - "@id": "_:b274" - }, - { - "@id": "_:b275" - }, - { - "@id": "_:b276" - }, - { - "@id": "_:b277" - }, - { - "@id": "_:b278" - }, - { - "@id": "_:b279" - }, - { - "@id": "_:b280" - }, - { - "@id": "_:b281" - }, - { - "@id": "_:b282" - }, - { - "@id": "_:b283" - }, - { - "@id": "_:b284" - }, - { - "@id": "_:b285" - }, - { - "@id": "_:b286" - }, - { - "@id": "_:b287" - }, - { - "@id": "_:b288" - }, - { - "@id": "_:b289" - }, - { - "@id": "_:b290" - }, - { - "@id": "_:b291" - }, - { - "@id": "_:b292" - }, - { - "@id": "_:b293" - }, - { - "@id": "_:b294" - }, - { - "@id": "_:b295" - }, - { - "@id": "_:b296" - }, - { - "@id": "_:b297" - }, - { - "@id": "_:b298" - }, - { - "@id": "_:b299" - }, - { - "@id": "_:b300" - }, - { - "@id": "_:b301" - }, - { - "@id": "_:b302" - }, - { - "@id": "_:b303" - }, - { - "@id": "_:b304" - }, - { - "@id": "_:b305" - }, - { - "@id": "_:b306" - }, - { - "@id": "_:b307" - }, - { - "@id": "_:b308" - }, - { - "@id": "_:b309" - }, - { - "@id": "_:b310" - }, - { - "@id": "_:b311" - }, - { - "@id": "_:b312" - }, - { - "@id": "_:b313" - }, - { - "@id": "_:b314" - }, - { - "@id": "_:b315" - }, - { - "@id": "_:b316" - }, - { - "@id": "_:b317" - }, - { - "@id": "_:b318" - }, - { - "@id": "_:b319" - }, - { - "@id": "_:b320" - }, - { - "@id": "_:b321" - }, - { - "@id": "_:b322" - }, - { - "@id": "_:b323" - }, - { - "@id": "_:b324" - }, - { - "@id": "_:b325" - }, - { - "@id": "_:b326" - }, - { - "@id": "_:b327" - }, - { - "@id": "_:b328" - }, - { - "@id": "_:b329" - }, - { - "@id": "_:b330" - }, - { - "@id": "_:b331" - }, - { - "@id": "_:b332" - }, - { - "@id": "_:b333" - }, - { - "@id": "_:b334" - }, - { - "@id": "_:b335" - }, - { - "@id": "_:b336" - }, - { - "@id": "_:b337" - }, - { - "@id": "_:b338" - }, - { - "@id": "_:b339" - }, - { - "@id": "_:b340" - }, - { - "@id": "_:b341" - }, - { - "@id": "_:b342" - }, - { - "@id": "_:b343" - }, - { - "@id": "_:b344" - }, - { - "@id": "_:b345" - }, - { - "@id": "_:b346" - }, - { - "@id": "_:b347" - }, - { - "@id": "_:b348" - }, - { - "@id": "_:b349" - }, - { - "@id": "_:b350" - }, - { - "@id": "_:b351" - }, - { - "@id": "_:b352" - }, - { - "@id": "_:b353" - }, - { - "@id": "_:b354" - }, - { - "@id": "_:b355" - }, - { - "@id": "_:b356" - }, - { - "@id": "_:b357" - }, - { - "@id": "_:b358" - }, - { - "@id": "_:b359" - }, - { - "@id": "_:b360" - }, - { - "@id": "_:b361" - }, - { - "@id": "_:b362" - }, - { - "@id": "_:b363" - }, - { - "@id": "_:b364" - }, - { - "@id": "_:b365" - }, - { - "@id": "_:b366" - }, - { - "@id": "_:b367" - }, - { - "@id": "_:b368" - }, - { - "@id": "_:b369" - }, - { - "@id": "_:b370" - }, - { - "@id": "_:b371" - }, - { - "@id": "_:b372" - }, - { - "@id": "_:b373" - }, - { - "@id": "_:b374" - }, - { - "@id": "_:b375" - }, - { - "@id": "_:b376" - }, - { - "@id": "_:b377" - }, - { - "@id": "_:b378" - }, - { - "@id": "_:b379" - }, - { - "@id": "_:b380" - }, - { - "@id": "_:b381" - }, - { - "@id": "_:b382" - }, - { - "@id": "_:b383" - }, - { - "@id": "_:b384" - }, - { - "@id": "_:b385" - }, - { - "@id": "_:b386" - }, - { - "@id": "_:b387" - }, - { - "@id": "_:b388" - }, - { - "@id": "_:b389" - }, - { - "@id": "_:b390" - }, - { - "@id": "_:b391" - }, - { - "@id": "_:b392" - }, - { - "@id": "_:b393" - }, - { - "@id": "_:b394" - }, - { - "@id": "_:b395" - }, - { - "@id": "_:b396" - }, - { - "@id": "_:b397" - }, - { - "@id": "_:b398" - }, - { - "@id": "_:b399" - }, - { - "@id": "_:b400" - }, - { - "@id": "_:b401" - }, - { - "@id": "_:b402" - }, - { - "@id": "_:b403" - }, - { - "@id": "_:b404" - }, - { - "@id": "_:b405" - }, - { - "@id": "_:b406" - }, - { - "@id": "_:b407" - }, - { - "@id": "_:b408" - } - ], - "fileFormat": "http://www.nationalarchives.gov.uk/PRONOM/fmt/43", - "name": "pics/sepia_fence.jpg", - "thumbnail": { - "@id": "pics/thumbs/sepia_fence.png" - } - }, - { - "@id": "pics/thumbs", - "@type": "Dataset", - "path": "pics/thumbs", - "hasPart": [ - { - "@id": "pics/thumbs/2017-06-11 12.56.14.png" - }, - { - "@id": "pics/thumbs/sepia_fence.png" - } - ], - "identifier": "./pics/thumbs", - "name": "Thumbnails" - }, - { - "@id": "pics/thumbs/2017-06-11 12.56.14.png", - "@type": "File", - "contentSize": "20594", - "path": "pics/thumbs/2017-06-11 12.56.14.png", - "encodingFormat": "Portable Network Graphics", - "fileFormat": "http://www.nationalarchives.gov.uk/PRONOM/fmt/11", - "name": "pics/thumbs/2017-06-11 12.56.14.png" - }, - { - "@id": "pics/thumbs/sepia_fence.png", - "@type": "File", - "contentSize": "20524", - "path": "pics/thumbs/sepia_fence.png", - "encodingFormat": "Portable Network Graphics", - "fileFormat": "http://www.nationalarchives.gov.uk/PRONOM/fmt/11", - "name": "pics/thumbs/sepia_fence.png" - } - ] -} \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/file1.txt b/test-data/ocfl-object1-source_additional_files/sample/file1.txt deleted file mode 100644 index 7be26ec..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/file1.txt +++ /dev/null @@ -1 +0,0 @@ -$T)(*SKGJKVJS DFKJs \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/file2.txt b/test-data/ocfl-object1-source_additional_files/sample/file2.txt deleted file mode 100644 index f97109f..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/file2.txt +++ /dev/null @@ -1 +0,0 @@ -$T)(*SKGJKdfsfVJS DFKJs \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_0-copy1.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_0-copy1.txt deleted file mode 100644 index c227083..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_0-copy1.txt +++ /dev/null @@ -1 +0,0 @@ -0 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_0-copy2.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_0-copy2.txt deleted file mode 100644 index c227083..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_0-copy2.txt +++ /dev/null @@ -1 +0,0 @@ -0 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_0-copy3.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_0-copy3.txt deleted file mode 100644 index c227083..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_0-copy3.txt +++ /dev/null @@ -1 +0,0 @@ -0 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_1.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_1.txt deleted file mode 100644 index 56a6051..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_1.txt +++ /dev/null @@ -1 +0,0 @@ -1 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_10.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_10.txt deleted file mode 100644 index 9a03714..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_10.txt +++ /dev/null @@ -1 +0,0 @@ -10 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_100.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_100.txt deleted file mode 100644 index 105d7d9..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_100.txt +++ /dev/null @@ -1 +0,0 @@ -100 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_101.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_101.txt deleted file mode 100644 index 97a55e1..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_101.txt +++ /dev/null @@ -1 +0,0 @@ -101 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_102.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_102.txt deleted file mode 100644 index 0aede4a..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_102.txt +++ /dev/null @@ -1 +0,0 @@ -102 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_103.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_103.txt deleted file mode 100644 index 0fd0714..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_103.txt +++ /dev/null @@ -1 +0,0 @@ -103 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_104.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_104.txt deleted file mode 100644 index dec4c59..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_104.txt +++ /dev/null @@ -1 +0,0 @@ -104 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_105.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_105.txt deleted file mode 100644 index ffda4e7..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_105.txt +++ /dev/null @@ -1 +0,0 @@ -105 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_106.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_106.txt deleted file mode 100644 index 3fbd193..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_106.txt +++ /dev/null @@ -1 +0,0 @@ -106 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_107.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_107.txt deleted file mode 100644 index e3b5acb..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_107.txt +++ /dev/null @@ -1 +0,0 @@ -107 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_108.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_108.txt deleted file mode 100644 index 615088b..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_108.txt +++ /dev/null @@ -1 +0,0 @@ -108 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_109.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_109.txt deleted file mode 100644 index 6d58c4e..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_109.txt +++ /dev/null @@ -1 +0,0 @@ -109 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_11.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_11.txt deleted file mode 100644 index 9d60796..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_11.txt +++ /dev/null @@ -1 +0,0 @@ -11 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_110.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_110.txt deleted file mode 100644 index 97e3504..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_110.txt +++ /dev/null @@ -1 +0,0 @@ -110 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_111.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_111.txt deleted file mode 100644 index 9d07aa0..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_111.txt +++ /dev/null @@ -1 +0,0 @@ -111 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_112.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_112.txt deleted file mode 100644 index d257208..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_112.txt +++ /dev/null @@ -1 +0,0 @@ -112 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_113.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_113.txt deleted file mode 100644 index 95c8a67..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_113.txt +++ /dev/null @@ -1 +0,0 @@ -113 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_114.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_114.txt deleted file mode 100644 index c9c4108..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_114.txt +++ /dev/null @@ -1 +0,0 @@ -114 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_115.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_115.txt deleted file mode 100644 index 2702ba3..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_115.txt +++ /dev/null @@ -1 +0,0 @@ -115 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_116.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_116.txt deleted file mode 100644 index d2c5ed2..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_116.txt +++ /dev/null @@ -1 +0,0 @@ -116 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_117.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_117.txt deleted file mode 100644 index 1bda760..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_117.txt +++ /dev/null @@ -1 +0,0 @@ -117 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_118.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_118.txt deleted file mode 100644 index 8d9f781..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_118.txt +++ /dev/null @@ -1 +0,0 @@ -118 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_119.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_119.txt deleted file mode 100644 index 176fdeb..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_119.txt +++ /dev/null @@ -1 +0,0 @@ -119 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_12.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_12.txt deleted file mode 100644 index 3cacc0b..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_12.txt +++ /dev/null @@ -1 +0,0 @@ -12 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_120.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_120.txt deleted file mode 100644 index 8bc6583..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_120.txt +++ /dev/null @@ -1 +0,0 @@ -120 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_121.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_121.txt deleted file mode 100644 index 5a396e2..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_121.txt +++ /dev/null @@ -1 +0,0 @@ -121 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_122.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_122.txt deleted file mode 100644 index 3fdc173..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_122.txt +++ /dev/null @@ -1 +0,0 @@ -122 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_123.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_123.txt deleted file mode 100644 index d800886..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_123.txt +++ /dev/null @@ -1 +0,0 @@ -123 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_124.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_124.txt deleted file mode 100644 index a09fd8a..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_124.txt +++ /dev/null @@ -1 +0,0 @@ -124 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_125.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_125.txt deleted file mode 100644 index 00c98bb..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_125.txt +++ /dev/null @@ -1 +0,0 @@ -125 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_126.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_126.txt deleted file mode 100644 index afbe847..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_126.txt +++ /dev/null @@ -1 +0,0 @@ -126 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_127.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_127.txt deleted file mode 100644 index 405e057..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_127.txt +++ /dev/null @@ -1 +0,0 @@ -127 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_128.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_128.txt deleted file mode 100644 index b854a29..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_128.txt +++ /dev/null @@ -1 +0,0 @@ -128 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_129.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_129.txt deleted file mode 100644 index 6d3e9dc..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_129.txt +++ /dev/null @@ -1 +0,0 @@ -129 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_13.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_13.txt deleted file mode 100644 index ca7bf83..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_13.txt +++ /dev/null @@ -1 +0,0 @@ -13 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_130.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_130.txt deleted file mode 100644 index 8306ec1..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_130.txt +++ /dev/null @@ -1 +0,0 @@ -130 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_131.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_131.txt deleted file mode 100644 index b9c6c00..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_131.txt +++ /dev/null @@ -1 +0,0 @@ -131 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_132.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_132.txt deleted file mode 100644 index dd1ec20..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_132.txt +++ /dev/null @@ -1 +0,0 @@ -132 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_133.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_133.txt deleted file mode 100644 index af21323..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_133.txt +++ /dev/null @@ -1 +0,0 @@ -133 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_134.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_134.txt deleted file mode 100644 index fa59ff2..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_134.txt +++ /dev/null @@ -1 +0,0 @@ -134 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_135.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_135.txt deleted file mode 100644 index 50f0bcd..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_135.txt +++ /dev/null @@ -1 +0,0 @@ -135 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_136.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_136.txt deleted file mode 100644 index d55f9f7..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_136.txt +++ /dev/null @@ -1 +0,0 @@ -136 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_137.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_137.txt deleted file mode 100644 index 0973804..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_137.txt +++ /dev/null @@ -1 +0,0 @@ -137 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_138.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_138.txt deleted file mode 100644 index eafdfb0..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_138.txt +++ /dev/null @@ -1 +0,0 @@ -138 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_139.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_139.txt deleted file mode 100644 index b5db9c4..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_139.txt +++ /dev/null @@ -1 +0,0 @@ -139 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_14.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_14.txt deleted file mode 100644 index da2d398..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_14.txt +++ /dev/null @@ -1 +0,0 @@ -14 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_140.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_140.txt deleted file mode 100644 index c2807f7..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_140.txt +++ /dev/null @@ -1 +0,0 @@ -140 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_141.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_141.txt deleted file mode 100644 index acfba60..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_141.txt +++ /dev/null @@ -1 +0,0 @@ -141 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_142.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_142.txt deleted file mode 100644 index 83248fb..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_142.txt +++ /dev/null @@ -1 +0,0 @@ -142 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_143.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_143.txt deleted file mode 100644 index aa59885..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_143.txt +++ /dev/null @@ -1 +0,0 @@ -143 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_144.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_144.txt deleted file mode 100644 index 70e1a64..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_144.txt +++ /dev/null @@ -1 +0,0 @@ -144 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_145.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_145.txt deleted file mode 100644 index aca544d..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_145.txt +++ /dev/null @@ -1 +0,0 @@ -145 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_146.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_146.txt deleted file mode 100644 index bc768da..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_146.txt +++ /dev/null @@ -1 +0,0 @@ -146 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_147.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_147.txt deleted file mode 100644 index 5d1277e..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_147.txt +++ /dev/null @@ -1 +0,0 @@ -147 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_148.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_148.txt deleted file mode 100644 index 4b9bce4..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_148.txt +++ /dev/null @@ -1 +0,0 @@ -148 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_149.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_149.txt deleted file mode 100644 index d7019ae..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_149.txt +++ /dev/null @@ -1 +0,0 @@ -149 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_15.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_15.txt deleted file mode 100644 index 3f10ffe..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_15.txt +++ /dev/null @@ -1 +0,0 @@ -15 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_150.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_150.txt deleted file mode 100644 index 4701cc7..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_150.txt +++ /dev/null @@ -1 +0,0 @@ -150 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_151.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_151.txt deleted file mode 100644 index c663e4d..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_151.txt +++ /dev/null @@ -1 +0,0 @@ -151 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_152.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_152.txt deleted file mode 100644 index 2d73b5e..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_152.txt +++ /dev/null @@ -1 +0,0 @@ -152 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_153.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_153.txt deleted file mode 100644 index f79f5e3..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_153.txt +++ /dev/null @@ -1 +0,0 @@ -153 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_154.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_154.txt deleted file mode 100644 index dc9414b..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_154.txt +++ /dev/null @@ -1 +0,0 @@ -154 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_155.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_155.txt deleted file mode 100644 index b912dc1..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_155.txt +++ /dev/null @@ -1 +0,0 @@ -155 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_156.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_156.txt deleted file mode 100644 index 34bba94..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_156.txt +++ /dev/null @@ -1 +0,0 @@ -156 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_157.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_157.txt deleted file mode 100644 index 2bab422..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_157.txt +++ /dev/null @@ -1 +0,0 @@ -157 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_158.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_158.txt deleted file mode 100644 index 147ea53..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_158.txt +++ /dev/null @@ -1 +0,0 @@ -158 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_159.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_159.txt deleted file mode 100644 index b000479..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_159.txt +++ /dev/null @@ -1 +0,0 @@ -159 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_16.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_16.txt deleted file mode 100644 index 19c7bdb..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_16.txt +++ /dev/null @@ -1 +0,0 @@ -16 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_160.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_160.txt deleted file mode 100644 index 9da06a1..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_160.txt +++ /dev/null @@ -1 +0,0 @@ -160 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_161.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_161.txt deleted file mode 100644 index 7f3a7cc..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_161.txt +++ /dev/null @@ -1 +0,0 @@ -161 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_162.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_162.txt deleted file mode 100644 index 05b9b66..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_162.txt +++ /dev/null @@ -1 +0,0 @@ -162 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_163.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_163.txt deleted file mode 100644 index 5755659..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_163.txt +++ /dev/null @@ -1 +0,0 @@ -163 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_164.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_164.txt deleted file mode 100644 index a8f6a25..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_164.txt +++ /dev/null @@ -1 +0,0 @@ -164 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_165.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_165.txt deleted file mode 100644 index 59f3135..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_165.txt +++ /dev/null @@ -1 +0,0 @@ -165 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_166.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_166.txt deleted file mode 100644 index 09df927..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_166.txt +++ /dev/null @@ -1 +0,0 @@ -166 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_167.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_167.txt deleted file mode 100644 index 2efea51..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_167.txt +++ /dev/null @@ -1 +0,0 @@ -167 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_168.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_168.txt deleted file mode 100644 index a3090d2..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_168.txt +++ /dev/null @@ -1 +0,0 @@ -168 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_169.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_169.txt deleted file mode 100644 index 9a13717..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_169.txt +++ /dev/null @@ -1 +0,0 @@ -169 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_17.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_17.txt deleted file mode 100644 index 8e2afd3..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_17.txt +++ /dev/null @@ -1 +0,0 @@ -17 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_170.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_170.txt deleted file mode 100644 index 3968aef..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_170.txt +++ /dev/null @@ -1 +0,0 @@ -170 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_171.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_171.txt deleted file mode 100644 index 6547e41..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_171.txt +++ /dev/null @@ -1 +0,0 @@ -171 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_172.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_172.txt deleted file mode 100644 index 89a16a7..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_172.txt +++ /dev/null @@ -1 +0,0 @@ -172 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_173.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_173.txt deleted file mode 100644 index 7b27b25..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_173.txt +++ /dev/null @@ -1 +0,0 @@ -173 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_174.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_174.txt deleted file mode 100644 index 4a8d924..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_174.txt +++ /dev/null @@ -1 +0,0 @@ -174 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_175.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_175.txt deleted file mode 100644 index 83981c0..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_175.txt +++ /dev/null @@ -1 +0,0 @@ -175 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_176.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_176.txt deleted file mode 100644 index a6b4ce8..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_176.txt +++ /dev/null @@ -1 +0,0 @@ -176 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_177.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_177.txt deleted file mode 100644 index 12e2555..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_177.txt +++ /dev/null @@ -1 +0,0 @@ -177 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_178.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_178.txt deleted file mode 100644 index 6fc1e6e..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_178.txt +++ /dev/null @@ -1 +0,0 @@ -178 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_179.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_179.txt deleted file mode 100644 index cde50ca..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_179.txt +++ /dev/null @@ -1 +0,0 @@ -179 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_18.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_18.txt deleted file mode 100644 index 25bf17f..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_18.txt +++ /dev/null @@ -1 +0,0 @@ -18 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_180.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_180.txt deleted file mode 100644 index a14c1ee..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_180.txt +++ /dev/null @@ -1 +0,0 @@ -180 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_181.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_181.txt deleted file mode 100644 index a5b5e0f..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_181.txt +++ /dev/null @@ -1 +0,0 @@ -181 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_182.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_182.txt deleted file mode 100644 index cd00472..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_182.txt +++ /dev/null @@ -1 +0,0 @@ -182 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_183.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_183.txt deleted file mode 100644 index 80945bc..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_183.txt +++ /dev/null @@ -1 +0,0 @@ -183 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_184.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_184.txt deleted file mode 100644 index 3021b56..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_184.txt +++ /dev/null @@ -1 +0,0 @@ -184 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_185.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_185.txt deleted file mode 100644 index 1edbdba..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_185.txt +++ /dev/null @@ -1 +0,0 @@ -185 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_186.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_186.txt deleted file mode 100644 index cb37cb5..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_186.txt +++ /dev/null @@ -1 +0,0 @@ -186 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_187.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_187.txt deleted file mode 100644 index e3e1916..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_187.txt +++ /dev/null @@ -1 +0,0 @@ -187 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_188.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_188.txt deleted file mode 100644 index 0947c33..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_188.txt +++ /dev/null @@ -1 +0,0 @@ -188 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_189.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_189.txt deleted file mode 100644 index 66321c0..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_189.txt +++ /dev/null @@ -1 +0,0 @@ -189 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_19.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_19.txt deleted file mode 100644 index dec2bf5..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_19.txt +++ /dev/null @@ -1 +0,0 @@ -19 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_190.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_190.txt deleted file mode 100644 index 1a1f7f8..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_190.txt +++ /dev/null @@ -1 +0,0 @@ -190 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_191.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_191.txt deleted file mode 100644 index 946b551..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_191.txt +++ /dev/null @@ -1 +0,0 @@ -191 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_192.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_192.txt deleted file mode 100644 index 681cf04..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_192.txt +++ /dev/null @@ -1 +0,0 @@ -192 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_193.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_193.txt deleted file mode 100644 index 725cdcd..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_193.txt +++ /dev/null @@ -1 +0,0 @@ -193 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_194.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_194.txt deleted file mode 100644 index 4be28fd..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_194.txt +++ /dev/null @@ -1 +0,0 @@ -194 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_195.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_195.txt deleted file mode 100644 index a0b994e..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_195.txt +++ /dev/null @@ -1 +0,0 @@ -195 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_196.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_196.txt deleted file mode 100644 index 4129657..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_196.txt +++ /dev/null @@ -1 +0,0 @@ -196 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_197.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_197.txt deleted file mode 100644 index fb35181..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_197.txt +++ /dev/null @@ -1 +0,0 @@ -197 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_198.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_198.txt deleted file mode 100644 index 8e24a69..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_198.txt +++ /dev/null @@ -1 +0,0 @@ -198 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_199.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_199.txt deleted file mode 100644 index 7318142..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_199.txt +++ /dev/null @@ -1 +0,0 @@ -199 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_2.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_2.txt deleted file mode 100644 index d8263ee..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_2.txt +++ /dev/null @@ -1 +0,0 @@ -2 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_20.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_20.txt deleted file mode 100644 index 2edeafb..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_20.txt +++ /dev/null @@ -1 +0,0 @@ -20 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_21.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_21.txt deleted file mode 100644 index b5045cc..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_21.txt +++ /dev/null @@ -1 +0,0 @@ -21 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_22.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_22.txt deleted file mode 100644 index 8fdd954..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_22.txt +++ /dev/null @@ -1 +0,0 @@ -22 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_23.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_23.txt deleted file mode 100644 index b393560..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_23.txt +++ /dev/null @@ -1 +0,0 @@ -23 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_24.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_24.txt deleted file mode 100644 index cabf43b..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_24.txt +++ /dev/null @@ -1 +0,0 @@ -24 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_25.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_25.txt deleted file mode 100644 index 410b14d..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_25.txt +++ /dev/null @@ -1 +0,0 @@ -25 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_26.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_26.txt deleted file mode 100644 index 978b4e8..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_26.txt +++ /dev/null @@ -1 +0,0 @@ -26 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_27.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_27.txt deleted file mode 100644 index a5c750f..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_27.txt +++ /dev/null @@ -1 +0,0 @@ -27 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_28.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_28.txt deleted file mode 100644 index 368f89c..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_28.txt +++ /dev/null @@ -1 +0,0 @@ -28 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_29.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_29.txt deleted file mode 100644 index d99e90e..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_29.txt +++ /dev/null @@ -1 +0,0 @@ -29 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_3.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_3.txt deleted file mode 100644 index e440e5c..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_3.txt +++ /dev/null @@ -1 +0,0 @@ -3 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_30.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_30.txt deleted file mode 100644 index 8580e7b..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_30.txt +++ /dev/null @@ -1 +0,0 @@ -30 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_31.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_31.txt deleted file mode 100644 index b74e882..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_31.txt +++ /dev/null @@ -1 +0,0 @@ -31 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_32.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_32.txt deleted file mode 100644 index 1758ddd..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_32.txt +++ /dev/null @@ -1 +0,0 @@ -32 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_33.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_33.txt deleted file mode 100644 index dc7b54a..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_33.txt +++ /dev/null @@ -1 +0,0 @@ -33 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_34.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_34.txt deleted file mode 100644 index 3e932fe..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_34.txt +++ /dev/null @@ -1 +0,0 @@ -34 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_35.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_35.txt deleted file mode 100644 index 597975b..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_35.txt +++ /dev/null @@ -1 +0,0 @@ -35 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_36.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_36.txt deleted file mode 100644 index dce6588..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_36.txt +++ /dev/null @@ -1 +0,0 @@ -36 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_37.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_37.txt deleted file mode 100644 index 7c09198..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_37.txt +++ /dev/null @@ -1 +0,0 @@ -37 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_38.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_38.txt deleted file mode 100644 index c24b6ae..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_38.txt +++ /dev/null @@ -1 +0,0 @@ -38 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_39.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_39.txt deleted file mode 100644 index 72f523f..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_39.txt +++ /dev/null @@ -1 +0,0 @@ -39 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_4.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_4.txt deleted file mode 100644 index bf0d87a..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_4.txt +++ /dev/null @@ -1 +0,0 @@ -4 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_40.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_40.txt deleted file mode 100644 index 86ee83a..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_40.txt +++ /dev/null @@ -1 +0,0 @@ -40 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_41.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_41.txt deleted file mode 100644 index aaa6442..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_41.txt +++ /dev/null @@ -1 +0,0 @@ -41 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_42.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_42.txt deleted file mode 100644 index f70d7bb..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_42.txt +++ /dev/null @@ -1 +0,0 @@ -42 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_43.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_43.txt deleted file mode 100644 index ac4213d..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_43.txt +++ /dev/null @@ -1 +0,0 @@ -43 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_44.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_44.txt deleted file mode 100644 index d2e1cef..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_44.txt +++ /dev/null @@ -1 +0,0 @@ -44 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_45.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_45.txt deleted file mode 100644 index 7d37386..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_45.txt +++ /dev/null @@ -1 +0,0 @@ -45 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_46.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_46.txt deleted file mode 100644 index abc4eff..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_46.txt +++ /dev/null @@ -1 +0,0 @@ -46 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_47.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_47.txt deleted file mode 100644 index 801f180..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_47.txt +++ /dev/null @@ -1 +0,0 @@ -47 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_48.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_48.txt deleted file mode 100644 index 31ff414..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_48.txt +++ /dev/null @@ -1 +0,0 @@ -48 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_49.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_49.txt deleted file mode 100644 index 2e66562..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_49.txt +++ /dev/null @@ -1 +0,0 @@ -49 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_5.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_5.txt deleted file mode 100644 index 7813681..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_5.txt +++ /dev/null @@ -1 +0,0 @@ -5 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_50.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_50.txt deleted file mode 100644 index c5b431b..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_50.txt +++ /dev/null @@ -1 +0,0 @@ -50 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_51.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_51.txt deleted file mode 100644 index 7003e7f..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_51.txt +++ /dev/null @@ -1 +0,0 @@ -51 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_52.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_52.txt deleted file mode 100644 index 6139554..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_52.txt +++ /dev/null @@ -1 +0,0 @@ -52 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_53.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_53.txt deleted file mode 100644 index 8783e30..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_53.txt +++ /dev/null @@ -1 +0,0 @@ -53 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_54.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_54.txt deleted file mode 100644 index 43c451e..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_54.txt +++ /dev/null @@ -1 +0,0 @@ -54 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_55.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_55.txt deleted file mode 100644 index 7c6ba0f..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_55.txt +++ /dev/null @@ -1 +0,0 @@ -55 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_56.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_56.txt deleted file mode 100644 index 2ebc651..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_56.txt +++ /dev/null @@ -1 +0,0 @@ -56 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_57.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_57.txt deleted file mode 100644 index f0b5c72..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_57.txt +++ /dev/null @@ -1 +0,0 @@ -57 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_58.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_58.txt deleted file mode 100644 index 4800c7d..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_58.txt +++ /dev/null @@ -1 +0,0 @@ -58 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_59.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_59.txt deleted file mode 100644 index fc9afb4..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_59.txt +++ /dev/null @@ -1 +0,0 @@ -59 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_6.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_6.txt deleted file mode 100644 index 62f9457..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_6.txt +++ /dev/null @@ -1 +0,0 @@ -6 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_60.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_60.txt deleted file mode 100644 index 2b82dfe..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_60.txt +++ /dev/null @@ -1 +0,0 @@ -60 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_61.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_61.txt deleted file mode 100644 index eebd1d1..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_61.txt +++ /dev/null @@ -1 +0,0 @@ -61 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_62.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_62.txt deleted file mode 100644 index b2412e3..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_62.txt +++ /dev/null @@ -1 +0,0 @@ -62 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_63.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_63.txt deleted file mode 100644 index 4e9e288..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_63.txt +++ /dev/null @@ -1 +0,0 @@ -63 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_64.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_64.txt deleted file mode 100644 index 4b6f9c3..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_64.txt +++ /dev/null @@ -1 +0,0 @@ -64 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_65.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_65.txt deleted file mode 100644 index b44fe09..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_65.txt +++ /dev/null @@ -1 +0,0 @@ -65 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_66.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_66.txt deleted file mode 100644 index d1cbcfa..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_66.txt +++ /dev/null @@ -1 +0,0 @@ -66 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_67.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_67.txt deleted file mode 100644 index 8323328..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_67.txt +++ /dev/null @@ -1 +0,0 @@ -67 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_68.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_68.txt deleted file mode 100644 index 3d9aebb..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_68.txt +++ /dev/null @@ -1 +0,0 @@ -68 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_69.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_69.txt deleted file mode 100644 index 8c0474e..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_69.txt +++ /dev/null @@ -1 +0,0 @@ -69 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_7.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_7.txt deleted file mode 100644 index c793025..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_7.txt +++ /dev/null @@ -1 +0,0 @@ -7 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_70.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_70.txt deleted file mode 100644 index d7765fe..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_70.txt +++ /dev/null @@ -1 +0,0 @@ -70 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_71.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_71.txt deleted file mode 100644 index 2fb681e..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_71.txt +++ /dev/null @@ -1 +0,0 @@ -71 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_72.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_72.txt deleted file mode 100644 index 9cd72aa..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_72.txt +++ /dev/null @@ -1 +0,0 @@ -72 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_73.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_73.txt deleted file mode 100644 index e77a963..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_73.txt +++ /dev/null @@ -1 +0,0 @@ -73 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_74.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_74.txt deleted file mode 100644 index 0aeb548..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_74.txt +++ /dev/null @@ -1 +0,0 @@ -74 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_75.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_75.txt deleted file mode 100644 index a76c74d..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_75.txt +++ /dev/null @@ -1 +0,0 @@ -75 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_76.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_76.txt deleted file mode 100644 index aa92725..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_76.txt +++ /dev/null @@ -1 +0,0 @@ -76 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_77.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_77.txt deleted file mode 100644 index 780fea9..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_77.txt +++ /dev/null @@ -1 +0,0 @@ -77 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_78.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_78.txt deleted file mode 100644 index efee1f8..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_78.txt +++ /dev/null @@ -1 +0,0 @@ -78 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_79.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_79.txt deleted file mode 100644 index eb13855..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_79.txt +++ /dev/null @@ -1 +0,0 @@ -79 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_8.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_8.txt deleted file mode 100644 index 301160a..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_8.txt +++ /dev/null @@ -1 +0,0 @@ -8 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_80.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_80.txt deleted file mode 100644 index e3f1e9b..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_80.txt +++ /dev/null @@ -1 +0,0 @@ -80 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_81.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_81.txt deleted file mode 100644 index c147342..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_81.txt +++ /dev/null @@ -1 +0,0 @@ -81 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_82.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_82.txt deleted file mode 100644 index 9d1ce53..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_82.txt +++ /dev/null @@ -1 +0,0 @@ -82 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_83.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_83.txt deleted file mode 100644 index 24af08a..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_83.txt +++ /dev/null @@ -1 +0,0 @@ -83 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_84.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_84.txt deleted file mode 100644 index 3ca9062..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_84.txt +++ /dev/null @@ -1 +0,0 @@ -84 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_85.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_85.txt deleted file mode 100644 index 615be70..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_85.txt +++ /dev/null @@ -1 +0,0 @@ -85 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_86.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_86.txt deleted file mode 100644 index 8bfa2f5..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_86.txt +++ /dev/null @@ -1 +0,0 @@ -86 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_87.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_87.txt deleted file mode 100644 index eaf7a13..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_87.txt +++ /dev/null @@ -1 +0,0 @@ -87 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_88.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_88.txt deleted file mode 100644 index 9f72858..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_88.txt +++ /dev/null @@ -1 +0,0 @@ -88 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_89.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_89.txt deleted file mode 100644 index 7730ef7..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_89.txt +++ /dev/null @@ -1 +0,0 @@ -89 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_9.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_9.txt deleted file mode 100644 index f11c82a..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_9.txt +++ /dev/null @@ -1 +0,0 @@ -9 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_90.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_90.txt deleted file mode 100644 index 0fa6a7b..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_90.txt +++ /dev/null @@ -1 +0,0 @@ -90 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_91.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_91.txt deleted file mode 100644 index a46c9d2..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_91.txt +++ /dev/null @@ -1 +0,0 @@ -91 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_92.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_92.txt deleted file mode 100644 index 69226f7..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_92.txt +++ /dev/null @@ -1 +0,0 @@ -92 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_93.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_93.txt deleted file mode 100644 index 27a37eb..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_93.txt +++ /dev/null @@ -1 +0,0 @@ -93 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_94.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_94.txt deleted file mode 100644 index bd753cc..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_94.txt +++ /dev/null @@ -1 +0,0 @@ -94 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_95.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_95.txt deleted file mode 100644 index 90be1cd..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_95.txt +++ /dev/null @@ -1 +0,0 @@ -95 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_96.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_96.txt deleted file mode 100644 index 56749c8..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_96.txt +++ /dev/null @@ -1 +0,0 @@ -96 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_97.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_97.txt deleted file mode 100644 index c4fbb1c..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_97.txt +++ /dev/null @@ -1 +0,0 @@ -97 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_98.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_98.txt deleted file mode 100644 index d7f3668..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_98.txt +++ /dev/null @@ -1 +0,0 @@ -98 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_99.txt b/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_99.txt deleted file mode 100644 index d97edbb..0000000 --- a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_99.txt +++ /dev/null @@ -1 +0,0 @@ -99 \ No newline at end of file diff --git a/test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_0.txt b/test-data/simple-ocfl-object/sample/file_0.txt similarity index 100% rename from test-data/ocfl-object1-source_additional_files/sample/lots_of_little_files/file_0.txt rename to test-data/simple-ocfl-object/sample/file_0.txt diff --git a/test/ocflObject.spec.js b/test/ocflObject.spec.js index 9edd9ab..fa3c58f 100644 --- a/test/ocflObject.spec.js +++ b/test/ocflObject.spec.js @@ -1,302 +1,1001 @@ -const assert = require('assert'); -const path = require('path'); -const fs = require('fs-extra'); -const hasha = require('hasha'); -const OcflObject = require('../lib/ocflObject'); -const _ = require('lodash'); +const assert = require("assert"); +const path = require("path"); +const fs = require("fs-extra"); +const hasha = require("hasha"); +const OcflObject = require("../lib/ocflObject"); +const _ = require("lodash"); +const pairtree = require("pairtree"); -const DIGEST_ALGORITHM = 'sha512'; +const DIGEST_ALGORITHM = "sha512"; -const chai = require('chai'); +const chai = require("chai"); const expect = chai.expect; -chai.use(require('chai-fs')); - - - -function createDirectory(aPath) { - if (fs.existsSync(aPath)) { - fs.removeSync(aPath); - } - fs.mkdirSync(aPath); -} - -describe('object init', function () { - - describe('no dir', function () { - const objPath = path.join(process.cwd(), './test-data/ocfl_obj_test'); - const object = new OcflObject(); - it('should test directory', async function f() { - try { - const init = await object.create(objPath); - } catch (e) { - assert.strictEqual(e.code, 'ENOENT') - } - }) - }); - - describe('no init', function () { - const objPath = path.join(process.cwd(), './test-data/notocfl'); - const object = new OcflObject(); - it('should not create an object in directories with files', async function () { - try { - const init = await object.create(objPath); - } catch (e) { - assert.strictEqual(e.message, 'can\'t initialise an object here as there are already files'); - } - }); +chai.use(require("chai-fs")); + +describe("Testing object creation functionality", async () => { + let object; + const ocflRoot = "test-output"; + const id = "1"; + const source = "./test-data/simple-ocfl-object"; + beforeEach(async () => { + object = new OcflObject({ ocflRoot, id }); }); -}); -const objectPath = path.join(process.cwd(), './test-data/ocfl-object'); - -describe('object init 2', function () { - const object = new OcflObject(); - createDirectory(objectPath); - - try { - it('should test content root', async function () { - const init = await object.create(objectPath); - assert.strictEqual(object.ocflVersion, '1.0'); - }); - it('should have a path', function () { - assert.strictEqual(object.path, objectPath); - }); - it('should have a namaste file', function () { - assert.strictEqual(fs.existsSync(path.join(objectPath, '0=ocfl_object_1.0')), true); + afterEach(async () => { + await fs.remove(path.join(source, "file1.txt")); + await fs.remove(path.join(source, "file2.txt")); + await fs.remove("test-output"); + }); + it("should be able to create an object with one version", async () => { + // v1 create object and import folder + await object.update({ source }); + + let inventory = await object.getLatestInventory(); + // console.log(inventory); + expect(inventory.head).to.equal("v1"); + expect(Object.keys(inventory.versions).length).to.equal(1); + expect(inventory.manifest).to.deep.equal({ + "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99": [ + "v1/content/sample/file_0.txt" + ] }); - - it('should be version 0', function () { - assert.strictEqual(object.contentVersion, null); - }); - - it('Should let you access an existing (on disk) object', async function() { - const object2 = new OcflObject(); - const init = await object2.load(objectPath); - + }); + it(`should fail to create an object because there's already one in deposit`, async () => { + await fs.mkdirp(path.join(ocflRoot, "deposit", id)); + try { + await object.update({ source }); + } catch (error) { + expect(error.message).to.equal( + "An object with that ID is already in the deposit path." + ); + } + }); + it(`should be able to create an object given a path`, async () => { + const objectPath = "/xx/yy/zz"; + object = new OcflObject({ ocflRoot, objectPath }); + await object.update({ source }); + await object.load(); + const inventory = await object.getLatestInventory(); + expect(inventory.id).to.equal(objectPath); + }); + it(`should fail to create an object as a child of another`, async () => { + let objectPath = "/xx/yy"; + object = new OcflObject({ ocflRoot, objectPath }); + await object.update({ source }); + + objectPath = "/xx/yy/zz"; + object = new OcflObject({ ocflRoot, objectPath }); + try { + await object.update({ source }); + } catch (error) { + expect(error.message).to.equal( + `This object is a child of an existing object and that's not allowed.` + ); + } + }); + it(`should be able to load an object from a path`, async () => { + const id = "xxyyzz"; + object = new OcflObject({ ocflRoot, id }); + await object.update({ source }); + await object.load(); + const inventory = await object.getLatestInventory(); + expect(inventory.manifest).to.deep.equal({ + "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99": [ + "v1/content/sample/file_0.txt" + ] }); - - } catch (e) { - console.log(e); - assert.notStrictEqual(e, null); - } - -}); - -const objectPath1 = path.join(process.cwd(), './test-data/ocfl-object1'); -const sourcePath1 = path.join(process.cwd(), './test-data/ocfl-object1-source'); - - -describe ('version numbering', function() { - //Helper functions - const object = new OcflObject(); - - it("should know how to increment versions", function() { - assert.strictEqual("v1", object.getVersionString(1)); - assert.strictEqual("v100", object.getVersionString(100)); + }); + it("should be able to create an object with two versions by adding a file", async () => { + await object.update({ source }); + + // v2 add a file + fs.writeFileSync(path.join(source, "file1.txt"), "$T)(*SKGJKVJS DFKJs"); + await object.update({ source }); + + let inventory = await object.getLatestInventory(); + // console.log(inventory); + expect(inventory.head).to.equal("v2"); + expect(Object.keys(inventory.versions).length).to.equal(2); + expect(inventory.manifest).to.deep.equal({ + de01d675497715d6e139c1182eeb4e9c73cfe25df4f1006a8e75679910c7b897707591bd574f27f21c50a6f624e737284c5271431302afa0bac8b66a342e3617: [ + "v2/content/file1.txt" + ], + "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99": [ + "v1/content/sample/file_0.txt" + ] }); - //Can tell what version of content is in a repository -}) - - -describe('object with content imported from an existing directory', async function () { - const object = new OcflObject(); - const objectPath1 = path.join(process.cwd(), './test-data/ocfl-object1'); - const inventoryPath1 = path.join(objectPath1, 'inventory.json'); - const inventoryPath1_v1 = path.join(objectPath1, 'v1', 'inventory.json'); - const repeatedFileHash = "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99" - const file1Hash = "4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a" - const id = "some_id"; - createDirectory(objectPath1); - - it('can create an object by importing an existing directory', async function () { - await object.create(objectPath1); - await object.importDir("some_id", sourcePath1); - assert.strictEqual(object.ocflVersion, '1.0'); }); - - it('should have a namaste', function () { - assert.strictEqual(object.path, objectPath1); + it("should be able to create an object with three versions by adding another file", async () => { + // v1 + let result; + object = await object.update({ source }); + + // v2 add a file + fs.writeFileSync(path.join(source, "file1.txt"), "$T)(*SKGJKVJS DFKJs"); + object = await object.update({ source }); + + // v3 add another file + fs.writeFileSync( + path.join(source, "file2.txt"), + "fsf v$T)(*SKGJKVJS DFKJs" + ); + object = await object.update({ source }); + + let inventory = await object.getLatestInventory(); + // console.log(inventory); + expect(inventory.head).to.equal("v3"); + expect(Object.keys(inventory.versions).length).to.equal(3); }); - - it('should have a namaste file', function () { - //create this test path - assert.strictEqual(fs.existsSync(path.join(objectPath1, '0=ocfl_object_1.0')), true); + it("should be able to create an object with four versions by changing an existing file", async () => { + await object.update({ source }); + + // v2 add a file + fs.writeFileSync(path.join(source, "file1.txt"), "$T)(*SKGJKVJS DFKJs"); + await object.update({ source }); + + // v3 add another file + fs.writeFileSync( + path.join(source, "file2.txt"), + "fsf v$T)(*SKGJKVJS DFKJs" + ); + await object.update({ source }); + + // v4 change the content of a file + fs.writeFileSync( + path.join(source, "file1.txt"), + "fsf v$T)(*SKGJKVJS DFKJs" + ); + await object.update({ source }); + + let inventory = await object.getLatestInventory(); + // console.log(inventory); + expect(inventory.head).to.equal("v4"); + expect(Object.keys(inventory.versions).length).to.equal(4); + expect(inventory.manifest).to.deep.equal({ + ea832e64995b2a7d64358abe682e9c0abfb015d22278a78ac17cb2d0a0ac2f9dfc02f5fb2e6baf37a77480a5be0b32957d0e9f979a77403ffb70a8dae1e319d8: [ + "v4/content/file1.txt", + "v3/content/file2.txt" + ], + "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99": [ + "v1/content/sample/file_0.txt" + ] + }); }); - - it('should have a v1 dir', function () { - //create this test path - expect(path.join(objectPath1, 'v1')).to.be.a.directory("v1 dir"); + it("should be able to create an object with five versions by removing an existing file", async () => { + // v1 + await object.update({ source }); + + // v2 add a file + await fs.writeFile(path.join(source, "file1.txt"), "$T)(*SKGJKVJS DFKJs"); + await object.update({ source }); + + // v3 add another file + await fs.writeFile( + path.join(source, "file2.txt"), + "fsf v$T)(*SKGJKVJS DFKJs" + ); + await object.update({ source }); + + await // v4 change the content of a file + await fs.writeFile( + path.join(source, "file1.txt"), + "fsf v$T)(*SKGJKVJS DFKJs" + ); + await object.update({ source }); + + // v5 remove a file + await fs.remove(path.join(source, "file2.txt")); + await object.update({ source }); + + let inventory = await object.getLatestInventory(); + // console.log(inventory); + expect(inventory.head).to.equal("v5"); + expect(Object.keys(inventory.versions).length).to.equal(5); + expect(inventory.manifest).to.deep.equal({ + ea832e64995b2a7d64358abe682e9c0abfb015d22278a78ac17cb2d0a0ac2f9dfc02f5fb2e6baf37a77480a5be0b32957d0e9f979a77403ffb70a8dae1e319d8: [ + "v4/content/file1.txt" + ], + "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99": [ + "v1/content/sample/file_0.txt" + ] + }); }); - - it('should be version 1', function () { - assert.strictEqual(object.contentVersion, "v1"); + it("should remain at one version when there is no change to the source", async () => { + await object.update({ source }); + await object.update({ source }); + await object.update({ source }); + + let inventory = await object.getLatestInventory(); + // console.log(inventory); + expect(inventory.head).to.equal("v1"); + expect(Object.keys(inventory.versions).length).to.equal(1); + expect(inventory.manifest).to.deep.equal({ + "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99": [ + "v1/content/sample/file_0.txt" + ] + }); }); - - const contentPath = path.join(objectPath1, 'v1', 'content'); - - it('should have a v1/content dir', function () { - //create this test path - expect(contentPath).to.be.a.directory("v1/content dir"); + it("should be able to create an object with a callback to write the content", async () => { + await object.update({ writer: writeContent }); + + let inventory = await object.getLatestInventory(); + // console.log(inventory); + expect(inventory.head).to.equal("v1"); + expect(Object.keys(inventory.versions).length).to.equal(1); + expect(inventory.manifest).to.deep.equal({ + "3abea15c00b706b25bd01ef29bfbe4fc117bb3464d0ba178bb2d924d71b758dd660dbef464e896ad4ec86e4bb498a7b58abb11b958875c468193cc42995b249e": [ + "v1/content/dir/fileX.txt" + ], + "9fb7cdf68ceaa2425e9e8f761e6b89c95250f63ae014c757436760caf9c28b2b368a173b340616ccbba0377c0c724a2d67a6c968a3b91968f72a8ed0da95e6cf": [ + "v1/content/fileY.txt" + ] + }); }); - - it('should have a manifest (inventory)', function () { - //create this test path - expect(inventoryPath1).to.be.a.file("inventory.json is a file"); + it("should handle an object being written with a source folder and a callback", async () => { + // v1 - load a source folder + await object.update({ source }); + + // v2 - write some content via a callback + await object.update({ writer: writeContent }); + + inventory = await object.getLatestInventory(); + // console.log(inventory); + expect(inventory.head).to.equal("v2"); + expect(Object.keys(inventory.versions).length).to.equal(2); + expect(inventory.manifest).to.deep.equal({ + "3abea15c00b706b25bd01ef29bfbe4fc117bb3464d0ba178bb2d924d71b758dd660dbef464e896ad4ec86e4bb498a7b58abb11b958875c468193cc42995b249e": [ + "v2/content/dir/fileX.txt" + ], + "9fb7cdf68ceaa2425e9e8f761e6b89c95250f63ae014c757436760caf9c28b2b368a173b340616ccbba0377c0c724a2d67a6c968a3b91968f72a8ed0da95e6cf": [ + "v2/content/fileY.txt" + ] + }); }); - - it("object has same directory structure as source", function () { - expect(contentPath).to.to.be.a.directory().and.deep.equal(sourcePath1, "ocfl content has original directory structure"); - }); - - it("has copied all the contents of the source to the object", function () { - expect(sourcePath1).to.be.a.directory("is a dir").with.deep.files.that.satisfy((files) => { - return files.every((file) => { - const fixture_file = path.join(sourcePath1, file); - const output_file = path.join(contentPath, file); - expect(output_file).to.be.a.file(`file ${output_file}`).and.equal(fixture_file, `${output_file} content matches`); - return true; - }) - }) + it("should object to both source and writer being defined", async () => { + try { + await object.update({ source, writer: () => {} }); + } catch (error) { + expect(error.message).to.equal( + "Specify only one of source or writer - not both." + ); + } }); - - // either the magic number here is wrong or there are some missing files in the - // test fixture - - it.skip(`should have a manifest (inventory) with 209 items in it`, async function () { - const inv = await JSON.parse(fs.readFile(inventoryPath1)); - assert.strictEqual(Object.keys(inv.manifest).length, 209); + it("should object because neither source nor writer is defined", async () => { + try { + await object.update({}); + } catch (error) { + expect(error.message).to.equal( + "Specify at least one of source or writer." + ); + } }); - - - it('should have file1.txt ', async function() { - const inv = await JSON.parse(fs.readFileSync(inventoryPath1)); - assert.strictEqual(inv.manifest[file1Hash][0],"v1/content/sample/lots_of_little_files/file_1.txt"); - assert.strictEqual(inv.versions["v1"].state[file1Hash][0], "sample/lots_of_little_files/file_1.txt"); + it(`should not be able to export - target folder doesn't exist`, async () => { + // v1 create object and import folder + await object.update({ source }); + try { + await object.export({ target: "./notfolder" }); + } catch (error) { + expect(error.message).to.equal(`Export target folder doesn't exist.`); + } }); - - it('should list 1 copies of file with same content in the manifest and 4 in v1', async function() { - const inv = await JSON.parse(fs.readFileSync(inventoryPath1)); - assert.strictEqual(inv.manifest[repeatedFileHash].length, 1); - assert.strictEqual(inv.versions["v1"].state[repeatedFileHash].length,4); + it(`should not be able to export - target folder not empty`, async () => { + // v1 create object and import folder + await object.update({ source }); + try { + await object.export({ target: "./test-data" }); + } catch (error) { + expect(error.message).to.equal(`Export target folder isn't empty.`); + } }); - - - it('should have an inventory digest file', function () { - assert.strictEqual(fs.existsSync(inventoryPath1 + '.sha512'), true); + it("should be able to export an object with one version - automatically select head", async () => { + const exportFolder = "./test-export"; + await object.update({ source }); + await fs.mkdirp(exportFolder); + await object.export({ target: "./test-export" }); + let content = await fs.readdir(exportFolder); + expect(content).to.deep.equal(["sample"]); + content = await fs.readdir(path.join(exportFolder, "sample")); + expect(content).to.deep.equal(["file_0.txt"]); + await fs.remove(exportFolder); }); - - it('should have a V1 inventory file', function () { - assert.strictEqual(fs.existsSync(path.join(objectPath1, "v1", 'inventory.json')), true); + it("should be able to export an object with one version - select v1", async () => { + const exportFolder = "./test-export"; + await object.update({ source }); + await fs.mkdirp(exportFolder); + await object.export({ target: "./test-export", version: "v1" }); + + let content = await fs.readdir(exportFolder); + expect(content).to.deep.equal(["sample"]); + content = await fs.readdir(path.join(exportFolder, "sample")); + expect(content).to.deep.equal(["file_0.txt"]); + await fs.remove(exportFolder); }); + it("should be able to export a version from an object with two versions - select v1", async () => { + const exportFolder = "./test-export"; - it('should have a V1 inventory digest file', function () { - assert.strictEqual(fs.existsSync(path.join(objectPath1, "v1", 'inventory.json.sha512')), true); - }); - - - after(async function () { - //TODO: destroy test objPath - //fs.removeSync(objectPath); - await fs.remove(objectPath1); - }); - - + // v1 + await object.update({ source }); -}); + // v2 add a file + fs.writeFileSync(path.join(source, "file1.txt"), "$T)(*SKGJKVJS DFKJs"); + await object.update({ source }); + // export + await fs.mkdirp(exportFolder); + await object.export({ target: "./test-export", version: "v1" }); -describe('object with content added by a callback', async function () { - const object = new OcflObject(); - const objectPath1 = path.join(process.cwd(), './test-data/ocfl-object1'); - const inventoryPath1 = path.join(objectPath1, 'inventory.json'); - const inventoryPath1_v1 = path.join(objectPath1, 'v1', 'inventory.json'); - const id = "some_id"; + let content = await fs.readdir(exportFolder); + expect(content).to.deep.equal(["sample"]); + content = await fs.readdir(path.join(exportFolder, "sample")); + expect(content).to.deep.equal(["file_0.txt"]); + await fs.remove(exportFolder); + }); + it("should be able to export a version from an object with two versions - select v2", async () => { + const exportFolder = "./test-export"; - const CONTENT = { - 'dir/file1.txt': 'Contents of file1.txt', - 'dir/file2.txt': 'Contents of file2.txt', - 'file3.txt': 'Contents of file3.txt' - }; + // v1 + await object.update({ source }); + // v2 add a file + fs.writeFileSync(path.join(source, "file1.txt"), "$T)(*SKGJKVJS DFKJs"); + await object.update({ source }); + // export + await fs.mkdirp(exportFolder); + await object.export({ target: "./test-export", version: "v2" }); + let content = await fs.readdir(exportFolder); + expect(content).to.deep.equal(["file1.txt", "sample"]); + content = await fs.readdir(path.join(exportFolder, "sample")); + expect(content).to.deep.equal(["file_0.txt"]); + await fs.remove(exportFolder); + }); - const makeContent = async (dir) => { + async function writeContent({ target }) { + const CONTENT = { + "dir/fileX.txt": "Contents of fileX.txt", + "fileY.txt": "Contents of fileY.txt" + }; const files = Object.keys(CONTENT); - for( const f of files ) { - const d = path.join(dir, path.dirname(f)); + for (const f of files) { + const d = path.join(target, path.dirname(f)); await fs.ensureDir(d); - await fs.writeFile(path.join(dir, f), CONTENT[f]); + await fs.writeFile(path.join(target, f), CONTENT[f]); } - }; + } +}); - - it('can create an object with a callback that writes to the directory', async function () { - createDirectory(objectPath1); - await object.create(objectPath1); - await object.addContent("some_id", makeContent); - assert.strictEqual(object.ocflVersion, '1.0'); +describe("Testing object manipulation functionality - object with one version", async () => { + let object, source; + beforeEach(async () => { + source = "./test-data/simple-ocfl-object"; + object = new OcflObject({ ocflRoot: "test-output", id: "2" }); }); + afterEach(async () => { + await fs.remove(path.join(source, "file1.txt")); + await fs.remove(path.join(source, "file2.txt")); + await fs.remove("test-output"); + }); + it("should be able to get the latest inventory", async () => { + // v1 create object and import folder + await object.update({ source }); + await object.load(); + const inventory = await object.getLatestInventory(); + expect(inventory.head).to.equal("v1"); + }); + it("should be able to get the v1 inventory", async () => { + // v1 create object and import folder + await object.update({ source }); + await object.load(); + const inventory = await object.getInventory({ version: "v1" }); + expect(inventory.head).to.equal("v1"); + }); + it("should be able to get the versions from an object with one version", async () => { + // v1 create object and import folder + await object.update({ source }); + await object.load(); + + let versions = await object.getVersions(); + expect(versions.length).to.equal(1); + expect(versions[0].version).to.equal("v1"); + }); + it(`should be able to see if it's an OCFL object`, async () => { + let isObject = await object.isObject(); + expect(isObject).to.be.false; + // v1 create object and import folder + await object.update({ source }); - it('should have the content generated by the callback', async function () { - const files = Object.keys(CONTENT); - for( const f of files ) { - const ocflf = path.join(objectPath1, 'v1/content', f); - expect(ocflf).to.be.a.file(`${ocflf} is a file`).with.content(CONTENT[f]); - } - }) - - it('should have a manifest entry for each file with the correct hash', async function () { - const files = Object.keys(CONTENT); - const inv = await fs.readJSON(inventoryPath1); - const manifest = inv.manifest; - for( const f of files ) { - const ocflf = path.join(objectPath1, 'v1/content', f); - expect(ocflf).to.be.a.file(`${ocflf} is a file`).with.content(CONTENT[f]); - const h = await hasha.fromFile(ocflf, { algorithm: DIGEST_ALGORITHM }); - expect(manifest[h][0]).to.equal(path.join('v1/content', f)); - delete manifest[h]; - } - expect(manifest).to.be.empty; - }) - - - // it('should have file1.txt ', async function() { - // const inv = await JSON.parse(fs.readFileSync(inventoryPath1)); - // assert.strictEqual(inv.manifest[file1Hash][0],"v1/content/sample/lots_of_little_files/file_1.txt"); - // assert.strictEqual(inv.versions["v1"].state[file1Hash][0], "sample/lots_of_little_files/file_1.txt"); - // }); - - // it('should list 1 copies of file with same content in the manifest and 4 in v1', async function() { - // const inv = await JSON.parse(fs.readFileSync(inventoryPath1)); - // assert.strictEqual(inv.manifest[repeatedFileHash].length, 1); - // assert.strictEqual(inv.versions["v1"].state[repeatedFileHash].length,4); - // }); - - - it('should have an inventory digest file', function () { - assert.strictEqual(fs.existsSync(inventoryPath1 + '.sha512'), true); - }); - - it('should have a V1 inventory file', function () { - assert.strictEqual(fs.existsSync(path.join(objectPath1, "v1", 'inventory.json')), true); - }); - - it('should have a V1 inventory digest file', function () { - assert.strictEqual(fs.existsSync(path.join(objectPath1, "v1", 'inventory.json.sha512')), true); - }); - - after(async function () { - //TODO: destroy test objPath - //fs.removeSync(objectPath); - await fs.remove(objectPath1); - }); - + isObject = await object.isObject(); + expect(isObject).to.be.true; + }); + it(`should be able to see if it's available`, async () => { + let isAvailable = await object.isAvailable(); + expect(isAvailable).to.be.true; -}); + // v1 create object and import folder + await object.update({ source }); + + isAvailable = await object.isAvailable(); + expect(isAvailable).to.be.false; + }); + it("should be able to get the state from an object with one version", async () => { + // v1 create object and import folder + await object.update({ source }); + await object.load(); + + let versions = await object.getVersions(); + expect(versions.length).to.equal(1); + expect(versions[0].version).to.equal("v1"); + + let content = await object.getVersion({ version: "v1" }); + expect(content.version).to.equal("v1"); + expect(content.state).to.deep.equal({ + "file_0.txt": [ + { + name: "file_0.txt", + path: "v1/content/sample/file_0.txt", + hash: + "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99", + version: 1 + } + ] + }); + }); + it("should be able to get the latest state from an object with one version", async () => { + // v1 create object and import folder + await object.update({ source }); + await object.load(); + + let versions = await object.getVersions(); + expect(versions.length).to.equal(1); + expect(versions[0].version).to.equal("v1"); + + let content = await object.getLatestVersion(); + expect(content.version).to.equal("v1"); + expect(content.state).to.deep.equal({ + "file_0.txt": [ + { + name: "file_0.txt", + path: "v1/content/sample/file_0.txt", + hash: + "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99", + version: 1 + } + ] + }); + }); + it("should be able to get all states from an object with one version", async () => { + // v1 create object and import folder + await object.update({ source }); + await object.load(); + + let versions = await object.getVersions(); + expect(versions.length).to.equal(1); + expect(versions[0].version).to.equal("v1"); + + let content = await object.getAllVersions(); + expect(content.length).to.equal(1); + content = content.pop(); + expect(content.version).to.equal("v1"); + expect(content.state).to.deep.equal({ + "file_0.txt": [ + { + name: "file_0.txt", + path: "v1/content/sample/file_0.txt", + hash: + "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99", + version: 1 + } + ] + }); + }); + it("should be able to remove an object from the repository", async () => { + await object.update({ source }); + let isObject = await object.isObject(); + expect(isObject).to.be.true; + const result = await object.remove(); + expect(result).to.be.null; + + isObject = await object.isObject(); + expect(isObject).to.be.false; + + isAvailable = await object.isAvailable(); + expect(isAvailable).to.be.true; + }); + it(`should be able to resolve a file path relative to the object`, async () => { + // v1 create object and import folder + await object.update({ source }); + await object.load(); + let version = await object.getLatestVersion(); + let file = version.state["file_0.txt"].pop(); + file = object.resolveFilePath({ filePath: file.path }); + expect(file).to.equal("test-output/2/v1/content/sample/file_0.txt"); + }); +}); +describe("Testing object manipulation functionality - object with three versions", async () => { + let object, source; + beforeEach(async () => { + source = "./test-data/simple-ocfl-object"; + object = new OcflObject({ ocflRoot: "test-output", id: "3" }); + // v1 + await object.update({ source }); + + // v2 add a file + fs.writeFileSync(path.join(source, "file1.txt"), "$T)(*SKGJKVJS DFKJs"); + await object.update({ source }); + + // v3 add another file + fs.writeFileSync( + path.join(source, "file2.txt"), + "fsf v$T)(*SKGJKVJS DFKJs" + ); + await object.update({ source }); + + await object.load(); + }); + afterEach(async () => { + await fs.remove(path.join(source, "file1.txt")); + await fs.remove(path.join(source, "file2.txt")); + await fs.remove("test-output"); + }); + it("should be able to get the latest inventory", async () => { + // v1 create object and import folder + await object.update({ source }); + await object.load(); + const inventory = await object.getLatestInventory(); + expect(inventory.head).to.equal("v3"); + }); + it("should be able to get the v1 inventory", async () => { + // v1 create object and import folder + await object.update({ source }); + await object.load(); + const inventory = await object.getInventory({ version: "v1" }); + expect(inventory.head).to.equal("v1"); + }); + it("should be able to get the versions from an object with three versions", async () => { + let versions = await object.getVersions(); + expect(versions.length).to.equal(3); + expect(versions.pop().version).to.equal("v3"); + }); + it("should be able to get the v1 state from an object with three versions", async () => { + let content = await object.getVersion({ version: "v1" }); + expect(content.version).to.equal("v1"); + expect(content.state).to.deep.equal({ + "file_0.txt": [ + { + name: "file_0.txt", + path: "v1/content/sample/file_0.txt", + hash: + "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99", + version: 1 + } + ] + }); + }); + it("should be able to get the latest state from an object with one version", async () => { + let content = await object.getLatestVersion(); + expect(content.version).to.equal("v3"); + expect(content.state).to.deep.equal({ + "file1.txt": [ + { + name: "file1.txt", + path: "v2/content/file1.txt", + hash: + "de01d675497715d6e139c1182eeb4e9c73cfe25df4f1006a8e75679910c7b897707591bd574f27f21c50a6f624e737284c5271431302afa0bac8b66a342e3617", + version: 2 + } + ], + "file2.txt": [ + { + name: "file2.txt", + path: "v3/content/file2.txt", + hash: + "ea832e64995b2a7d64358abe682e9c0abfb015d22278a78ac17cb2d0a0ac2f9dfc02f5fb2e6baf37a77480a5be0b32957d0e9f979a77403ffb70a8dae1e319d8", + version: 3 + } + ], + "file_0.txt": [ + { + name: "file_0.txt", + path: "v1/content/sample/file_0.txt", + hash: + "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99", + version: 1 + } + ] + }); + }); + it("should be able to get all states from an object with one version", async () => { + let versions = await object.getVersions(); + + let content = await object.getAllVersions(); + expect(content.length).to.equal(3); + const state1 = content.shift(); + expect(state1.version).to.equal("v1"); + expect(state1.state).to.deep.equal({ + "file_0.txt": [ + { + name: "file_0.txt", + path: "v1/content/sample/file_0.txt", + hash: + "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99", + version: 1 + } + ] + }); + const state2 = content.shift(); + expect(state2.version).to.equal("v2"); + expect(state2.state).to.deep.equal({ + "file1.txt": [ + { + name: "file1.txt", + path: "v2/content/file1.txt", + hash: + "de01d675497715d6e139c1182eeb4e9c73cfe25df4f1006a8e75679910c7b897707591bd574f27f21c50a6f624e737284c5271431302afa0bac8b66a342e3617", + version: 2 + } + ], + "file_0.txt": [ + { + name: "file_0.txt", + path: "v1/content/sample/file_0.txt", + hash: + "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99", + version: 1 + } + ] + }); + }); +}); +// function createDirectory(aPath) { +// if (fs.existsSync(aPath)) { +// fs.removeSync(aPath); +// } +// fs.mkdirSync(aPath); +// } + +// describe.skip("object init", function() { +// describe("no dir", function() { +// const objPath = path.join(process.cwd(), "./test-data/ocfl_obj_test"); +// // const object = new OcflObject({ ocflRoot: objPath, id: "xx" }); +// it("should test directory", async function f() { +// try { +// const init = await object.create(); +// } catch (e) { +// assert.strictEqual(e.code, "ENOENT"); +// } +// }); +// }); + +// describe("no init", function() { +// const objPath = path.join(process.cwd(), "./test-data/notocfl"); +// // const object = new OcflObject({ ocflRoot: objPath, id: "xx" }); +// it("should not create an object in directories with files", async function() { +// try { +// const init = await object.create(objPath); +// } catch (e) { +// assert.strictEqual( +// e.message, +// "can't initialise an object here as there are already files" +// ); +// } +// }); +// }); +// }); + +// describe.skip("object init 2", function() { +// const objectPath = path.join(process.cwd(), "./test-data/ocfl-object"); +// const objectId = "1"; +// let object; + +// beforeEach(async () => { +// object = new OcflObject({ ocflRoot: objectPath, id: objectId }); +// await object.create(); +// }); + +// it("should test content root", async function() { +// assert.strictEqual(object.ocflVersion, "1.0"); +// }); +// it("should have a path", function() { +// assert.strictEqual(object.path, path.join(objectPath, objectId, "/")); +// }); +// it("should have a namaste file", function() { +// assert.strictEqual( +// fs.existsSync(path.join(objectPath, objectId, "0=ocfl_object_1.0")), +// true +// ); +// }); + +// it("should be version 0", function() { +// assert.strictEqual(object.contentVersion, null); +// }); + +// // it("Should let you access an existing (on disk) object", async function() { +// // const object2 = new OcflObject({ ocflRoot: objectPath, id: objectId }); +// // const init = await object2.load(); +// // }); +// }); + +// const objectPath1 = path.join(process.cwd(), "./test-data/ocfl-object1"); + +// describe.skip("version numbering", function() { +// //Helper functions +// // const object = new OcflObject({}); + +// it("should know how to increment versions", function() { +// assert.strictEqual("v1", object.getVersionString(1)); +// assert.strictEqual("v100", object.getVersionString(100)); +// }); +// //Can tell what version of content is in a repository +// }); + +// describe.skip("object with content imported from an existing directory", async function() { +// const objectPath1 = path.join(process.cwd(), "./test-data/ocfl-object1"); +// const inventoryPath1_v1 = path.join(objectPath1, "v1", "inventory.json"); +// const repeatedFileHash = +// "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99"; +// const file1Hash = +// "4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a"; +// const id = "some_id"; +// const sourcePath1 = path.join( +// process.cwd(), +// "./test-data/ocfl-object1-source" +// ); + +// let object, objectPath; +// beforeEach(async () => { +// createDirectory(objectPath1); +// object = new OcflObject({ ocflRoot: objectPath1, id }); +// objectPath = path.join(objectPath1, pairtree.path(id)); +// await object.create(); +// await object.importDir({ id, source: sourcePath1 }); +// await object.load(); +// }); + +// afterEach(async function() { +// await fs.remove(objectPath1); +// }); + +// it("can create an object by importing an existing directory", async function() { +// assert.strictEqual(object.ocflVersion, "1.0"); +// }); + +// it("should be at the expected path", function() { +// assert.strictEqual(object.path, objectPath); +// }); + +// it("should have a namaste file", function() { +// //create this test path +// assert.strictEqual( +// fs.existsSync(path.join(objectPath, "0=ocfl_object_1.0")), +// true +// ); +// }); + +// it("should have a v1 dir", async function() { +// //create this test path +// expect(path.join(objectPath, "v1")).to.be.a.directory("v1 dir"); +// }); + +// it("should be version 1", async function() { +// assert.strictEqual(object.contentVersion, "v1"); +// }); + +// it("should have a v1/content dir", function() { +// const contentPath = path.join(objectPath, "v1", "content"); +// expect(contentPath).to.be.a.directory("v1/content dir"); +// }); + +// it("should have a manifest (inventory)", function() { +// //create this test path +// const inventoryPath1 = path.join(objectPath, "inventory.json"); +// expect(inventoryPath1).to.be.a.file("inventory.json is a file"); +// }); + +// it("object has same directory structure as source", function() { +// const contentPath = path.join(objectPath, "v1", "content"); +// expect(contentPath) +// .to.to.be.a.directory() +// .and.deep.equal( +// sourcePath1, +// "ocfl content has original directory structure" +// ); +// }); + +// it("has copied all the contents of the source to the object", function() { +// const contentPath = path.join(objectPath, "v1", "content"); +// expect(sourcePath1) +// .to.be.a.directory("is a dir") +// .with.deep.files.that.satisfy(files => { +// return files.every(file => { +// const fixture_file = path.join(sourcePath1, file); +// const output_file = path.join(contentPath, file); +// expect(output_file) +// .to.be.a.file(`file ${output_file}`) +// .and.equal(fixture_file, `${output_file} content matches`); +// return true; +// }); +// }); +// }); + +// it("should be able to load an object", async () => { +// expect(object.versions.length).to.equal(1); +// expect(object.versions[0].version).to.equal("v1"); +// }); + +// it("should be able to get a specific version inventory", async () => { +// const versionInventory = await object.getVersion({ version: "v1" }); +// expect(versionInventory.version).to.equal("v1"); +// expect(Object.keys(versionInventory.state)).to.deep.equal([ +// "CATALOG.json", +// "file_0.txt", +// "file_1.txt", +// "file_2.txt", +// "2017-06-11 12.56.14.jpg", +// "sepia_fence.jpg", +// "2017-06-11 12.56.14.png", +// "sepia_fence.png" +// ]); +// }); + +// it("should be able to get the latest version inventory - only one version", async () => { +// const versionInventory = await object.getVersion({ version: "latest" }); +// expect(versionInventory.version).to.equal("v1"); +// }); + +// // either the magic number here is wrong or there are some missing files in the +// // test fixture + +// it.skip(`should have a manifest (inventory) with 209 items in it`, async function() { +// const inventoryPath1 = path.join(objectPath, "inventory.json"); +// const inv = await JSON.parse(fs.readFile(inventoryPath1)); +// assert.strictEqual(Object.keys(inv.manifest).length, 209); +// }); + +// it("should have file1.txt ", async function() { +// const inventoryPath1 = path.join(objectPath, "inventory.json"); +// const inv = await JSON.parse(fs.readFileSync(inventoryPath1)); +// assert.strictEqual( +// inv.manifest[file1Hash][0], +// "v1/content/sample/lots_of_little_files/file_1.txt" +// ); +// assert.strictEqual( +// inv.versions["v1"].state[file1Hash][0], +// "sample/lots_of_little_files/file_1.txt" +// ); +// }); + +// it("should list 1 copies of file with same content in the manifest and 4 in v1", async function() { +// const inventoryPath1 = path.join(objectPath, "inventory.json"); +// const inv = await JSON.parse(fs.readFileSync(inventoryPath1)); +// assert.strictEqual(inv.manifest[repeatedFileHash].length, 1); +// assert.strictEqual(inv.versions["v1"].state[repeatedFileHash].length, 4); +// }); + +// it("should have an inventory digest file", function() { +// const inventoryPath1 = path.join(objectPath, "inventory.json"); +// assert.strictEqual(fs.existsSync(inventoryPath1 + ".sha512"), true); +// }); + +// it("should have a V1 inventory file", function() { +// assert.strictEqual( +// fs.existsSync(path.join(objectPath, "v1", "inventory.json")), +// true +// ); +// }); + +// it("should have a V1 inventory digest file", function() { +// assert.strictEqual( +// fs.existsSync(path.join(objectPath, "v1", "inventory.json.sha512")), +// true +// ); +// }); +// }); + +// describe.skip("object with content added by a callback", async function() { +// const objectPath1 = path.join(process.cwd(), "./test-data/ocfl-object1"); +// const inventoryPath1 = path.join(objectPath1, "inventory.json"); +// const inventoryPath1_v1 = path.join(objectPath1, "v1", "inventory.json"); +// const id = "some_id"; +// // const object = new OcflObject({ id, ocflRoot: objectPath1 }); +// const sourcePath1 = path.join( +// process.cwd(), +// "./test-data/ocfl-object1-source" +// ); + +// const CONTENT = { +// "dir/file1.txt": "Contents of file1.txt", +// "dir/file2.txt": "Contents of file2.txt", +// "file3.txt": "Contents of file3.txt" +// }; + +// const makeContent = async dir => { +// const files = Object.keys(CONTENT); +// for (const f of files) { +// const d = path.join(dir, path.dirname(f)); +// await fs.ensureDir(d); +// await fs.writeFile(path.join(dir, f), CONTENT[f]); +// } +// }; + +// let objectPath; +// beforeEach(async () => { +// createDirectory(objectPath1); +// objectPath = path.join(objectPath1, pairtree.path(id)); +// await object.create(); +// await object.importDir("some_id", sourcePath1); +// }); + +// afterEach(async function() { +// // await fs.remove(objectPath1); +// }); + +// it("can create an object with a callback that writes to the directory", async function() { +// await object.create(); +// await object.addContent("some_id", makeContent); +// assert.strictEqual(object.ocflVersion, "1.0"); +// }); + +// it("should have the content generated by the callback", async function() { +// const files = Object.keys(CONTENT); +// for (const f of files) { +// console.log(f, objectPath); +// const ocflf = path.join(objectPath, "v1/content", f); +// expect(ocflf) +// .to.be.a.file(`${ocflf} is a file`) +// .with.content(CONTENT[f]); +// } +// }); + +// it("should have a manifest entry for each file with the correct hash", async function() { +// const files = Object.keys(CONTENT); +// const inv = await fs.readJSON(inventoryPath1); +// const manifest = inv.manifest; +// for (const f of files) { +// const ocflf = path.join(objectPath1, "v1/content", f); +// expect(ocflf) +// .to.be.a.file(`${ocflf} is a file`) +// .with.content(CONTENT[f]); +// const h = await hasha.fromFile(ocflf, { algorithm: DIGEST_ALGORITHM }); +// expect(manifest[h][0]).to.equal(path.join("v1/content", f)); +// delete manifest[h]; +// } +// expect(manifest).to.be.empty; +// }); + +// // it('should have file1.txt ', async function() { +// // const inv = await JSON.parse(fs.readFileSync(inventoryPath1)); +// // assert.strictEqual(inv.manifest[file1Hash][0],"v1/content/sample/lots_of_little_files/file_1.txt"); +// // assert.strictEqual(inv.versions["v1"].state[file1Hash][0], "sample/lots_of_little_files/file_1.txt"); +// // }); + +// // it('should list 1 copies of file with same content in the manifest and 4 in v1', async function() { +// // const inv = await JSON.parse(fs.readFileSync(inventoryPath1)); +// // assert.strictEqual(inv.manifest[repeatedFileHash].length, 1); +// // assert.strictEqual(inv.versions["v1"].state[repeatedFileHash].length,4); +// // }); + +// it("should have an inventory digest file", function() { +// assert.strictEqual(fs.existsSync(inventoryPath1 + ".sha512"), true); +// }); + +// it("should have a V1 inventory file", function() { +// assert.strictEqual( +// fs.existsSync(path.join(objectPath1, "v1", "inventory.json")), +// true +// ); +// }); + +// it("should have a V1 inventory digest file", function() { +// assert.strictEqual( +// fs.existsSync(path.join(objectPath1, "v1", "inventory.json.sha512")), +// true +// ); +// }); +// }); diff --git a/test/ocflObject.streams.spec.js b/test/ocflObject.streams.spec.js index 7f0c27e..cd1714a 100644 --- a/test/ocflObject.streams.spec.js +++ b/test/ocflObject.streams.spec.js @@ -1,44 +1,44 @@ -const assert = require('assert'); -const path = require('path'); -const fs = require('fs-extra'); -const OcflObject = require('../lib/ocflObject'); - -describe('from path get an object', async function () { - - const testDataPath = path.join(process.cwd(), 'test-data', 'streams'); - fs.removeSync(testDataPath); - fs.ensureDirSync(testDataPath); - - const sampleDir = path.join(testDataPath, 'sample'); - fs.removeSync(sampleDir); - fs.ensureDirSync(sampleDir); - - const fileName = 'ojbectFromPath.json'; - const filePath = path.join(sampleDir, fileName); - - it('should get a file path from OcflObject', async function () { - try { - //create test-file - const objPath = path.join(testDataPath, 'obj'); - fs.ensureDirSync(objPath); - fs.writeFileSync(filePath, '{what:{is:{a:"test"}}}'); - const obj = new OcflObject(); - const objIni = await obj.create(objPath); - //add content - const initWithContent = await obj.importDir("some_id", sampleDir); - //compare object - //path relative to the object - const objFilePath = await obj.getFilePath(fileName); - const readFile = await fs.readFile(path.join(objPath, objFilePath)); - const content = readFile.toString(); - assert.strictEqual('{what:{is:{a:"test"}}}', content); - } catch (e) { - assert.fail(e.message); - throw new Error(e); - } - }); - -}); +// const assert = require('assert'); +// const path = require('path'); +// const fs = require('fs-extra'); +// const OcflObject = require('../lib/ocflObject'); + +// describe('from path get an object', async function () { + +// const testDataPath = path.join(process.cwd(), 'test-data', 'streams'); +// fs.removeSync(testDataPath); +// fs.ensureDirSync(testDataPath); + +// const sampleDir = path.join(testDataPath, 'sample'); +// fs.removeSync(sampleDir); +// fs.ensureDirSync(sampleDir); + +// const fileName = 'ojbectFromPath.json'; +// const filePath = path.join(sampleDir, fileName); + +// it('should get a file path from OcflObject', async function () { +// try { +// //create test-file +// const objPath = path.join(testDataPath, 'obj'); +// fs.ensureDirSync(objPath); +// fs.writeFileSync(filePath, '{what:{is:{a:"test"}}}'); +// const obj = new OcflObject(); +// const objIni = await obj.create(objPath); +// //add content +// const initWithContent = await obj.importDir("some_id", sampleDir); +// //compare object +// //path relative to the object +// const objFilePath = await obj.getFilePath(fileName); +// const readFile = await fs.readFile(path.join(objPath, objFilePath)); +// const content = readFile.toString(); +// assert.strictEqual('{what:{is:{a:"test"}}}', content); +// } catch (e) { +// assert.fail(e.message); +// throw new Error(e); +// } +// }); + +// }); /* const testDataPath = path.join(process.cwd(), 'test-data', 'streams'); @@ -56,4 +56,3 @@ describe('from path get an object', async function () { throw new Error(e); } */ - diff --git a/test/repository.spec.js b/test/repository.spec.js index 98ef89f..8fd39e1 100644 --- a/test/repository.spec.js +++ b/test/repository.spec.js @@ -1,420 +1,683 @@ -const assert = require('assert'); -const path = require('path'); -const fs = require('fs-extra'); -const uuidv4 = require('uuidv4'); -const pairtree = require('pairtree'); -const hasha = require('hasha'); -const Repository = require('../lib/repository'); -const OcflObject = require('../lib/ocflObject'); +const assert = require("assert"); +const path = require("path"); +const fs = require("fs-extra"); +const uuidv4 = require("uuidv4"); +const pairtree = require("pairtree"); +const hasha = require("hasha"); +const Repository = require("../lib/repository"); +const OcflObject = require("../lib/ocflObject"); -const chai = require('chai'); +const chai = require("chai"); const expect = chai.expect; -chai.use(require('chai-fs')); +chai.use(require("chai-fs")); -const DIGEST_ALGORITHM = 'sha512'; - - -function createDirectory(aPath) { - if (!fs.existsSync(aPath)) { - fs.mkdirSync(aPath); - } -} - -// Path constants -const repositoryPath = path.join(process.cwd(), './test-data/ocfl1'); -const sourcePath1 = path.join(process.cwd(), './test-data/ocfl-object1-source'); -const sourcePath1_additional_files = sourcePath1 + "_additional_files"; - - -async function createTestRepo() { - fs.removeSync(repositoryPath); - createDirectory(repositoryPath); - const repository = new Repository(); - const init = await repository.create(repositoryPath); - return repository; -} - -describe('repository initialisation', function () { - - it('should not initialise previous created or loaded repositories', async function () { - const repository = await createTestRepo(); - try { - const init = await repository.create(repositoryPath); - } catch (e) { - assert.strictEqual(e.message, 'This repository has already been initialized.'); - } - }); - - it('should not initialise directories with files', async function () { - const repository = new Repository(); - - try { - const init = await repository.create("."); - } catch (e) { - assert.strictEqual(e.message, "can't initialise a repository as there are already files."); - } - }); - - - it('Should not let you load twice', async function () { - const repository = new Repository(); - try { - const new_id = await repository.load(repositoryPath); - } - catch (e) { - assert.strictEqual(e.message, 'This repository has already been initialized.'); - } - - }); - -}); - -describe('No directory to create a repo in', function () { - const repoPath = path.join(process.cwd(), './test-data/ocflX'); - const repository = new Repository(); - it('should test directory', async function f() { - try { - const init = await repository.create(repoPath); - } catch (e) { - assert.strictEqual(e.code, 'ENOENT') - } +const DIGEST_ALGORITHM = "sha512"; +describe("Repository initialisation", () => { + let repository; + const ocflRoot = "test-output"; + beforeEach(async () => {}); + afterEach(async () => { + await fs.remove(ocflRoot); }); -}); - -describe('Successful repository creation', function () { - const ocflVersion = "1.0"; - - it('should test content root', async function () { - const repository = await createTestRepo(); - assert.strictEqual(repository.ocflVersion, ocflVersion); - }); + it(`should be able to create a repository`, async () => { + if (!(await fs.exists(ocflRoot))) await fs.mkdirp(ocflRoot); + repository = new Repository({ ocflRoot }); + expect(repository.ocflRoot).to.equal(ocflRoot); - it('repo path is set', async function () { - const repository = await createTestRepo(); - assert.strictEqual(repository.path, repositoryPath); + expect(await repository.create()).to.not.throw; }); - - it('should have a namaste file', async function () { - const repository = await createTestRepo(); - assert.strictEqual(fs.existsSync(path.join(repositoryPath, '0=ocfl_' + ocflVersion)), true); - }); - - const repository2 = new Repository(); - it('should initialise in a directory with an existing namaste file', async function () { - const init = await repository2.load(repositoryPath); - assert.strictEqual(repository2.ocflVersion, ocflVersion) - }); - - -}); - -describe('Adding objects from directories', function () { - - - const repeatedFileHash = "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99"; - const file1Hash = "4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a"; - const sepiaPicHash = "577b1610764f4d9d05e82b5efe9b39214806e4c29249b59634699101a2a4679317388e78f7b40134aba8371cc684a9b422a7032d34a6785201051e484805bd59"; - const sepiaPicPath = "v1/content/sample/pics/sepia_fence.jpg" - const sepiaPicLogicalPath = "sample/pics/sepia_fence.jpg" - - - it('should make up an ID if you add content', async function () { - const repository = await createTestRepo(); - const obj = await repository.importNewObjectDir(null, sourcePath1); - const inv = await obj.getInventory(); - const new_id = inv.id; - // We got a UUID as an an ID - assert.strictEqual(new_id.length, 36); - // Check that the object is there - const objectPath = path.join(repositoryPath, new_id.replace(/(..)/g, "$1/")); - assert.strictEqual(fs.existsSync(objectPath), true); - }); - - it('should use your id for a new object if you give it one', async function () { - const repository = await createTestRepo(); - const obj = await repository.importNewObjectDir("some_other_id", sourcePath1); - // We got a UUID as an an ID - const inv = await (obj.getInventory()); - assert.strictEqual(inv.id, "some_other_id"); - // Check that the object is there - const objectPath = path.join(repositoryPath, inv.id.replace(/(..)/g, "$1/")); - assert.strictEqual(fs.existsSync(objectPath), true); - }); - - it('should create a deposit directory in the repository path', async function () { - const repository = await createTestRepo(); - const id = uuidv4(); - const idpath = repository.objectIdToPath(id).replace(/\//g, ""); - const epath = path.join(repository.path, "deposit", idpath); - const gpath = await repository.makeDepositPath(id); - expect(gpath).to.equal(epath); - expect(gpath).to.be.a.directory(`Created ${gpath}`).and.empty; - }); - - - it('should refuse to make an object if there is a failed attempt in the deposit dir', async function () { - const repository = await createTestRepo(); + it(`should fail to create a repository - folder doesn't exist`, async () => { + repository = new Repository({ ocflRoot }); try { - const depositDir = await fs.mkdirp(path.join(repositoryPath, "deposit", "some_id")); - const new_id = await repository.importNewObjectDir("some_id", sourcePath1); + await repository.create(); + } catch (error) { + expect(error.message).to.equal("Directory does not exist"); } - catch (e) { - assert.strictEqual(e.message, 'There is already an object with this ID being deposited or left behind after a crash. Cannot proceed.'); - } - }); - - it('Should now have three objects in it', async function () { - const repository = await createTestRepo(); - const obj1 = await repository.importNewObjectDir("1", sourcePath1); - const obj2 = await repository.importNewObjectDir("2", sourcePath1); - const obj3 = await repository.importNewObjectDir("3", sourcePath1); - - const objects = await repository.objects(); - assert.strictEqual(objects.length, 3) - - //TODO - Check Object IDs - - }); - - // TODO: break this into smaller it()s and fix the 211 magic number bug - - it('should handle file additions and export', async function () { - // TODO this depends on tests above running - fix that! - const repository = new Repository(); - await repository.load(repositoryPath); - - fs.removeSync(sourcePath1_additional_files); - fs.copySync(sourcePath1, sourcePath1_additional_files); - // Add some identical additional files - - // Add some new additional files - fs.writeFileSync(path.join(sourcePath1_additional_files, "sample", "file1.txt"), "$T)(*SKGJKVJS DFKJs"); - fs.writeFileSync(path.join(sourcePath1_additional_files, "sample", "file2.txt"), "$T)(*SKGJKdfsfVJS DFKJs"); - - const test_id = "id"; - await repository.importNewObjectDir(test_id, sourcePath1); - const obj = await repository.importNewObjectDir(test_id, sourcePath1_additional_files); - - - const inv3 = await obj.getInventory(); - const new_id = inv3.id; - assert.strictEqual(new_id, test_id); - // Check that the object is there - const objectPath = path.join(repositoryPath, new_id.replace(/(..)/g, "$1/")); - assert.strictEqual(fs.existsSync(objectPath), true); - // Check that it's v2 - const object = new OcflObject(); - await object.load(objectPath); - const inv = await object.getInventory(); - - assert.strictEqual(inv.versions["v2"].state[repeatedFileHash].length, 4); - assert.strictEqual(inv.versions["v2"].state[repeatedFileHash].indexOf("sample/lots_of_little_files/file_0-copy1.txt") > -1, true); - - // Now delete some stuff - await fs.remove(path.join(sourcePath1_additional_files, "sample", "pics")); - // And re-import - await repository.importNewObjectDir(test_id, sourcePath1_additional_files); - - // Re-initialize exsiting object - const inv1 = await object.getInventory(); - // - assert.strictEqual(Object.keys(inv1.manifest).length, 211); - assert.strictEqual(inv1.manifest[sepiaPicHash][0], sepiaPicPath); - // Sepia pic is v2 - assert.strictEqual(inv1.versions["v2"].state[sepiaPicHash][0], sepiaPicLogicalPath); - // Not in v3 - assert.strictEqual(inv1.versions["v3"].state[sepiaPicHash], undefined); - - // Now put some stuff back - fs.copySync(path.join(sourcePath1, "sample", "pics"), path.join(sourcePath1_additional_files, "sample", "pics")); - await repository.importNewObjectDir(test_id, sourcePath1_additional_files); - - const inv2 = await object.getInventory(); - assert.strictEqual(Object.keys(inv1.manifest).length, 211); - assert.strictEqual(inv2.manifest[sepiaPicHash][0], sepiaPicPath); - // Sepia pic is v2 - assert.strictEqual(inv2.versions["v4"].state[sepiaPicHash][0], sepiaPicLogicalPath, "no sepia pic in v4"); - // Not in v3 - assert.strictEqual(inv2.versions["v3"].state[sepiaPicHash], undefined, "No sepia pic in v3"); - // No content dirs in V3 or v4 - assert.strictEqual(fs.existsSync(path.join(object.path, "v3", "content")), false), "v3 has no content dir"; - assert.strictEqual(fs.existsSync(path.join(object.path, "v4", "content")), false, "v4 has no content dir"); - // Tho v2 has one - assert.strictEqual(fs.existsSync(path.join(object.path, "v2", "content")), true, "v2 has content dir"); - - const exportDirV4 = path.join("test-data", "exportv4"); - const exportDirV5 = path.join("test-data", "exportv5"); - const exportDirV1 = path.join("test-data", "exportv1"); - - await fs.remove(exportDirV1); - await fs.remove(exportDirV4); - await fs.remove(exportDirV5); - - - const testId = "id"; - - try { - const init = await repository.export(testId, exportDirV4); - } catch (e) { - assert.strictEqual(e.message, "Can't export as the directory does not exist.", "Export needs an empty directory to put stuff in."); - } - - const fl = await fs.writeFile(exportDirV4, ""); - try { - const init = await repository.export(testId, exportDirV4); - } catch (e) { - assert.strictEqual(e.message, "Can't export to an existing file.", "Cannot export over the top of a file"); - } - await fs.remove(exportDirV4); - - await fs.mkdir(exportDirV4); - await repository.export(testId, exportDirV4); - - expect(exportDirV4).to.be.a.directory().and.deep.equal(sourcePath1_additional_files, "Matches the stuff that was imported", "Exported v4 is the same as the thing we imported."); - - + it(`should fail to create a repository - already a repo`, async () => { + if (!fs.existsSync(ocflRoot)) await fs.mkdirp(ocflRoot); + repository = new Repository({ ocflRoot }); + await repository.create(); try { - const init = await repository.export(testId, exportDirV4); - } catch (e) { - assert.strictEqual(e.message, "Can't export as the directory has stuff in it.", "Will not export to a directory that has existing content."); + await repository.create(); + } catch (error) { + expect(error.message).to.equal( + "This repository has already been initialized." + ); } - - await fs.mkdir(exportDirV1); - await repository.export(testId, exportDirV1, { version: "v1" }); - expect(exportDirV1).to.be.a.directory().and.deep.equal(sourcePath1, "Matches the stuff that was imported"); - - await fs.mkdir(exportDirV5); - + }); + it(`should fail to create a repository - not empty folder`, async () => { + repository = new Repository({ ocflRoot: "./test-data" }); try { - await repository.export(testId, exportDirV5, { version: "v5" }); - } catch (e) { - assert.strictEqual(e.message, "Can't export a version that doesn't exist.", "Refuses to export non existent version"); + await repository.create(); + } catch (error) { + expect(error.message).to.equal( + `Can't initialise a repository as there are already files.` + ); } - }); - -}); - - -// FIXME: a lot of this is duplicated from the directory import tests -// and could be streamlined - - -describe('Adding objects with callbacks', async function () { - - const CONTENT = { - 'dir/file1.txt': 'Contents of file1.txt', - 'dir/file2.txt': 'Contents of file2.txt', - 'file3.txt': 'Contents of file3.txt' - }; - - const makeContent = async (dir) => { - const files = Object.keys(CONTENT); - for( const f of files ) { - const d = path.join(dir, path.dirname(f)); - await fs.ensureDir(d); - await fs.writeFile(path.join(dir, f), CONTENT[f]); - } - }; - - - it('can create an object with a callback', async function () { - const repository = await createTestRepo(); - const object = await repository.createNewObjectContent("some_id", makeContent); - assert.strictEqual(object.ocflVersion, '1.0'); + it(`should find a repository`, async () => { + repository = new Repository({ ocflRoot }); + if (!fs.existsSync(ocflRoot)) await fs.mkdirp(ocflRoot); + await repository.create(); + expect(await repository.isRepository()).to.be.true; }); - - - it('Does not increment version number if you add the same thing twice', async function () { - const repository = await createTestRepo(); - await repository.createNewObjectContent("xx", makeContent); - const object = await repository.createNewObjectContent("xx", makeContent); - const inventory = await object.getInventory(); - assert.strictEqual(inventory.head, 'v1'); - }); - - it('Does not let you use a subset of an existing id', async function () { - const repository = await createTestRepo(); - await repository.createNewObjectContent("aaaa", makeContent); - try { - const object = await repository.createNewObjectContent("aa", makeContent); - } catch (e) { - assert.strictEqual(e.message, 'There is no object here but the path already exists is this ID a subset of a longer one?'); - } - }); - - it('Does not let you use a superset of an existing id', async function () { - const repository = await createTestRepo(); - await repository.createNewObjectContent("cc", makeContent); - try { - await repository.createNewObjectContent("ccdd", makeContent); - } catch (e) { - assert.strictEqual(e.message, 'Cannot make an object. There is already an object in a higher level directory.'); - } + it(`should not find a repository`, async () => { + repository = new Repository({ ocflRoot: "./test-data" }); + expect(await repository.isRepository()).to.be.false; }); - - - it('should make up an ID if you add content', async function () { - const repository = await createTestRepo(); - const obj = await repository.createNewObjectContent(null, makeContent); - const inv = await obj.getInventory(); - const new_id = inv.id; - // We got a UUID as an an ID - assert.strictEqual(new_id.length, 36); - // Check that the object is there - const objectPath = path.join(repositoryPath, new_id.replace(/(..)/g, "$1/")); - assert.strictEqual(fs.existsSync(objectPath), true); + it(`should find one object in the repository - THIS IS AN EMITTER`, async () => { + // create a repository + if (!fs.existsSync(ocflRoot)) await fs.mkdirp(ocflRoot); + repository = new Repository({ ocflRoot }); + expect(repository.ocflRoot).to.equal(ocflRoot); + await repository.create(); + + let object = new OcflObject({ ocflRoot, id: "xx1" }); + await object.update({ source: "./test-data/simple-ocfl-object" }); + + repository.findObjects({}); + repository.on("object", object => { + expect(object.objectPath).to.equal("/xx/1"); + object = new OcflObject(object); + expect(object.id).to.equal("/xx/1"); + }); }); - - it('should use your id for a new object if you give it one', async function () { - const repository = await createTestRepo(); - const obj = await repository.createNewObjectContent("some_other_id", makeContent); - // We got a UUID as an an ID - const inv = await (obj.getInventory()); - assert.strictEqual(inv.id, "some_other_id"); - // Check that the object is there - const objectPath = path.join(repositoryPath, inv.id.replace(/(..)/g, "$1/")); - assert.strictEqual(fs.existsSync(objectPath), true); + it(`should find 3 objects in the repository - THIS IS AN EMITTER`, async () => { + // create a repository + if (!fs.existsSync(ocflRoot)) await fs.mkdirp(ocflRoot); + repository = new Repository({ ocflRoot }); + expect(repository.ocflRoot).to.equal(ocflRoot); + await repository.create(); + + let object = new OcflObject({ ocflRoot, id: "xx1" }); + await object.update({ source: "./test-data/simple-ocfl-object" }); + object = new OcflObject({ ocflRoot, id: "xx2" }); + await object.update({ source: "./test-data/simple-ocfl-object" }); + object = new OcflObject({ ocflRoot, id: "xx3" }); + await object.update({ source: "./test-data/simple-ocfl-object" }); + + repository.findObjects({}); + let objects = []; + repository.on("object", object => objects.push(object)); + setTimeout(() => { + expect(objects.length).to.equal(3); + }, 200); }); - - - - - it('should have the content generated by the callback', async function () { - const repository = await createTestRepo(); - const obj = await repository.createNewObjectContent("some_other_id", makeContent); - const files = Object.keys(CONTENT); - for( const f of files ) { - const ocflf = path.join(obj.path, 'v1/content', f); - expect(ocflf).to.be.a.file(`${ocflf} is a file`).with.content(CONTENT[f]); - } - }) - - it('should have a manifest entry for each file with the correct hash', async function () { - const repository = await createTestRepo(); - const obj = await repository.createNewObjectContent("some_other_id", makeContent); - const files = Object.keys(CONTENT); - const inventory = await obj.getInventory(); - const manifest = inventory.manifest; - for( const f of files ) { - const ocflf = path.join(obj.path, 'v1/content', f); - expect(ocflf).to.be.a.file(`${ocflf} is a file`).with.content(CONTENT[f]); - const h = await hasha.fromFile(ocflf, { algorithm: DIGEST_ALGORITHM }); - expect(manifest[h][0]).to.equal(path.join('v1/content', f)); - delete manifest[h]; - } - expect(manifest).to.be.empty; - }) - }); +// function createDirectory(aPath) { +// if (!fs.existsSync(aPath)) { +// fs.mkdirSync(aPath); +// } +// } - -after(function () { - //TODO: destroy test repoPath - -}); +// Path constants +// const repositoryPath = path.join(process.cwd(), "./test-data/ocfl1"); +// const sourcePath1 = path.join(process.cwd(), "./test-data/ocfl-object1-source"); +// const sourcePath1_additional_files = sourcePath1 + "_additional_files"; + +// async function createTestRepo() { +// fs.removeSync(repositoryPath); +// createDirectory(repositoryPath); +// const repository = new Repository(); +// const init = await repository.create(repositoryPath); +// return repository; +// } + +// describe.skip("repository initialisation", function() { +// beforeEach(async () => { +// createDirectory(repositoryPath); +// repository = new Repository({ ocflRoot: repositoryPath }); +// await repository.create(); +// return repository; +// }); +// afterEach(async () => { +// await fs.remove(repositoryPath); +// }); +// it("should not initialise an existing repository", async function() { +// try { +// const init = await repository.create(); +// } catch (e) { +// assert.strictEqual( +// e.message, +// "This repository has already been initialized." +// ); +// } +// }); +// it("should not initialise directories with files", async function() { +// const repository = new Repository({ ocflRoot: "." }); +// try { +// const init = await repository.create(); +// } catch (e) { +// assert.strictEqual( +// e.message, +// "Can't initialise a repository as there are already files." +// ); +// } +// }); +// it("Should verify a repository", async function() { +// const repository = new Repository({ ocflRoot: repositoryPath }); +// const result = await repository.isRepository(); +// expect(result).to.be.true; +// }); +// it("Should not verify a nonexistent directory as a repository", async function() { +// const repository = new Repository({ +// ocflRoot: "some other not yet created" +// }); +// try { +// const result = await repository.isRepository(); +// } catch (e) { +// expect(e.message).to.equal("Directory does not exist."); +// } +// }); +// it("Should not verify a repository without a namaste file", async function() { +// const repository = new Repository({ ocflRoot: repositoryPath }); +// try { +// await fs.unlink(path.join(repositoryPath, "0=ocfl_1.0")); +// const result = await repository.isRepository(); +// } catch (e) { +// expect(e.message).to.equal("Not an OCFL repository."); +// } +// }); +// }); + +// describe.skip("No directory to create a repo in", function() { +// const repoPath = path.join(process.cwd(), "./test-data/ocflX"); +// const repository = new Repository({ ocflRoot: repoPath }); +// it("should test directory", async () => { +// try { +// const init = await repository.create(); +// } catch (e) { +// assert.strictEqual(e.code, "ENOENT"); +// } +// }); +// }); + +// describe.skip("Successful repository creation", function() { +// let repository; +// const ocflVersion = "1.0"; +// beforeEach(async () => { +// createDirectory(repositoryPath); +// repository = new Repository({ ocflRoot: repositoryPath }); +// await repository.create(); +// return repository; +// }); +// afterEach(async () => { +// await fs.remove(repositoryPath); +// }); +// it("should test content root", async function() { +// assert.strictEqual(repository.ocflVersion, ocflVersion); +// }); +// it("repo path is set", async function() { +// assert.strictEqual(repository.ocflRoot, repositoryPath); +// }); +// it("should have a namaste file", async function() { +// assert.strictEqual( +// fs.existsSync(path.join(repositoryPath, "0=ocfl_" + ocflVersion)), +// true +// ); +// }); +// it("should initialise in a directory with an existing namaste file", async function() { +// const repository2 = new Repository({ ocflRoot: repositoryPath }); +// const init = await repository2.isRepository(); +// assert.strictEqual(repository2.ocflVersion, ocflVersion); +// }); +// }); + +// describe.skip("Adding objects from directories", function() { +// const repeatedFileHash = +// "31bca02094eb78126a517b206a88c73cfa9ec6f704c7030d18212cace820f025f00bf0ea68dbf3f3a5436ca63b53bf7bf80ad8d5de7d8359d0b7fed9dbc3ab99"; +// const file1Hash = +// "4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a"; +// const sepiaPicHash = +// "577b1610764f4d9d05e82b5efe9b39214806e4c29249b59634699101a2a4679317388e78f7b40134aba8371cc684a9b422a7032d34a6785201051e484805bd59"; +// const sepiaPicPath = "v1/content/sample/pics/sepia_fence.jpg"; +// const sepiaPicLogicalPath = "sample/pics/sepia_fence.jpg"; + +// let repository; +// const ocflVersion = "1.0"; +// beforeEach(async () => { +// createDirectory(repositoryPath); +// repository = new Repository({ ocflRoot: repositoryPath }); +// await repository.create(); +// return repository; +// }); +// afterEach(async () => { +// await fs.remove(repositoryPath); +// }); + +// it("should make up an ID if you add content", async function() { +// const obj = await repository.importNewObjectDir({ +// id: null, +// sourceDir: sourcePath1 +// }); +// const inv = await obj.getLatestInventory(); +// const new_id = inv.id; +// // We got a UUID as an an ID +// assert.strictEqual(new_id.length, 36); +// // Check that the object is there +// const objectPath = path.join( +// repositoryPath, +// new_id.replace(/(..)/g, "$1/") +// ); +// assert.strictEqual(fs.existsSync(objectPath), true); +// }); + +// it("should use your id for a new object if you give it one", async function() { +// const obj = await repository.importNewObjectDir({ +// id: "some_other_id", +// sourceDir: sourcePath1 +// }); +// // We got a UUID as an an ID +// const inv = await obj.getLatestInventory(); +// assert.strictEqual(inv.id, "some_other_id"); +// // Check that the object is there +// const objectPath = path.join( +// repositoryPath, +// inv.id.replace(/(..)/g, "$1/") +// ); +// assert.strictEqual(fs.existsSync(objectPath), true); +// }); + +// // it.skip("should create a deposit directory in the repository path", async function() { +// // // OCFL objects are now responsible for creating paths +// // const repository = await createTestRepo(); +// // const id = uuidv4(); +// // const idpath = repository.objectIdToPath(id).replace(/\//g, ""); +// // const epath = path.join(repository.path, "deposit", idpath); +// // const gpath = await repository.makeDepositPath(id); +// // expect(gpath).to.equal(epath); +// // expect(gpath).to.be.a.directory(`Created ${gpath}`).and.empty; +// // }); + +// it("should refuse to make an object if there is a failed attempt in the deposit dir", async function() { +// try { +// const depositDir = await fs.mkdirp( +// path.join(repositoryPath, "deposit", "some_id") +// ); +// const new_id = await repository.importNewObjectDir({ +// id: "some_id", +// sourceDir: sourcePath1 +// }); +// } catch (e) { +// assert.strictEqual( +// e.message, +// "There is already an object with this ID being deposited or left behind after a crash. Cannot proceed." +// ); +// } +// }); + +// it("Should now have three objects in it", async function() { +// const obj1 = await repository.importNewObjectDir({ +// id: "1", +// sourceDir: sourcePath1 +// }); +// const obj2 = await repository.importNewObjectDir({ +// id: "2", +// sourceDir: sourcePath1 +// }); +// const obj3 = await repository.importNewObjectDir({ +// id: "3", +// sourceDir: sourcePath1 +// }); + +// const objects = await repository.objects(); +// assert.strictEqual(objects.length, 3); + +// //TODO - Check Object IDs +// }); + +// // TODO: break this into smaller it()s and fix the 211 magic number bug + +// it("should handle file additions and export", async function() { +// const obj1 = await repository.importNewObjectDir({ +// id: "1", +// sourceDir: sourcePath1 +// }); +// const obj2 = await repository.importNewObjectDir({ +// id: "2", +// sourceDir: sourcePath1 +// }); +// const obj3 = await repository.importNewObjectDir({ +// id: "3", +// sourceDir: sourcePath1 +// }); +// // await repository.load(); + +// fs.removeSync(sourcePath1_additional_files); +// fs.copySync(sourcePath1, sourcePath1_additional_files); +// // Add some identical additional files + +// // Add some new additional files +// fs.writeFileSync( +// path.join(sourcePath1_additional_files, "sample", "file1.txt"), +// "$T)(*SKGJKVJS DFKJs" +// ); +// fs.writeFileSync( +// path.join(sourcePath1_additional_files, "sample", "file2.txt"), +// "$T)(*SKGJKdfsfVJS DFKJs" +// ); + +// const test_id = "id"; +// await repository.importNewObjectDir({ +// id: test_id, +// sourceDir: sourcePath1 +// }); +// const obj = await repository.importNewObjectDir({ +// id: test_id, +// sourceDir: sourcePath1_additional_files +// }); + +// const inv3 = await obj.getLatestInventory(); +// const new_id = inv3.id; +// assert.strictEqual(new_id, test_id); +// // Check that the object is there +// // assert.strictEqual(fs.existsSync(objectPath), true); +// // Check that it's v2 +// const object = new OcflObject({ +// ocflRoot: repositoryPath, +// objectPath: new_id +// }); +// await object.load(); +// const inv = await object.getLatestInventory(); + +// assert.strictEqual(inv.versions["v2"].state[repeatedFileHash].length, 4); +// assert.strictEqual( +// inv.versions["v2"].state[repeatedFileHash].indexOf( +// "sample/lots_of_little_files/file_0-copy1.txt" +// ) > -1, +// true +// ); + +// // Now delete some stuff +// await fs.remove(path.join(sourcePath1_additional_files, "sample", "pics")); +// // And re-import +// await repository.importNewObjectDir({ +// id: test_id, +// sourceDir: sourcePath1_additional_files +// }); + +// // Re-initialize exsiting object +// const inv1 = await object.getLatestInventory(); +// // +// assert.strictEqual(Object.keys(inv1.manifest).length, 207); +// assert.strictEqual(inv1.manifest[sepiaPicHash][0], sepiaPicPath); +// // Sepia pic is v2 +// assert.strictEqual( +// inv1.versions["v2"].state[sepiaPicHash][0], +// sepiaPicLogicalPath +// ); +// // Not in v3 +// assert.strictEqual(inv1.versions["v3"].state[sepiaPicHash], undefined); + +// // Now put some stuff back +// fs.copySync( +// path.join(sourcePath1, "sample", "pics"), +// path.join(sourcePath1_additional_files, "sample", "pics") +// ); +// await repository.importNewObjectDir({ +// id: test_id, +// sourceDir: sourcePath1_additional_files +// }); + +// const inv2 = await object.getLatestInventory(); +// assert.strictEqual(Object.keys(inv1.manifest).length, 207); +// assert.strictEqual(inv2.manifest[sepiaPicHash][0], sepiaPicPath); +// // Sepia pic is v2 +// assert.strictEqual( +// inv2.versions["v4"].state[sepiaPicHash][0], +// sepiaPicLogicalPath, +// "no sepia pic in v4" +// ); +// // Not in v3 +// assert.strictEqual( +// inv2.versions["v3"].state[sepiaPicHash], +// undefined, +// "No sepia pic in v3" +// ); +// // No content dirs in V3 or v4 +// assert.strictEqual( +// fs.existsSync(path.join(object.path, "v3", "content")), +// false +// ), +// "v3 has no content dir"; +// assert.strictEqual( +// fs.existsSync(path.join(object.path, "v4", "content")), +// false, +// "v4 has no content dir" +// ); +// // Tho v2 has one +// assert.strictEqual( +// fs.existsSync(path.join(object.path, "v2", "content")), +// true, +// "v2 has content dir" +// ); + +// const exportDirV4 = path.join("test-data", "exportv4"); +// const exportDirV5 = path.join("test-data", "exportv5"); +// const exportDirV1 = path.join("test-data", "exportv1"); + +// await fs.remove(exportDirV1); +// await fs.remove(exportDirV4); +// await fs.remove(exportDirV5); + +// const testId = "1"; + +// // try { +// // const init = await repository.export({ +// // id: testId, +// // target: exportDirV4 +// // }); +// // } catch (e) { +// // assert.strictEqual( +// // e.message, +// // "Can't export as the directory does not exist.", +// // "Export needs an empty directory to put stuff in." +// // ); +// // } + +// const fl = await fs.writeFile(exportDirV4, ""); +// try { +// const init = await repository.export({ +// id: testId, +// target: exportDirV4 +// }); +// } catch (e) { +// assert.strictEqual( +// e.message, +// "That target is not useable. A non existent path or an empty folder is required." +// ); +// } +// await fs.remove(exportDirV4); + +// // await fs.mkdir(exportDirV4); +// await repository.export({ id: testId, target: exportDirV4 }); + +// expect(exportDirV4).to.be.a.directory(); + +// // .and.deep.equal( +// // sourcePath1_additional_files, +// // "Matches the stuff that was imported", +// // "Exported v4 is the same as the thing we imported." +// // ); + +// try { +// const init = await repository.export({ +// id: testId, +// target: exportDirV4 +// }); +// } catch (e) { +// assert.strictEqual( +// e.message, +// "That target is not useable. A non existent path or an empty folder is required." +// ); +// } + +// await repository.export({ +// id: testId, +// target: exportDirV1, +// options: { version: "v1" } +// }); +// expect(exportDirV1) +// .to.be.a.directory() +// .and.deep.equal(sourcePath1, "Matches the stuff that was imported"); + +// // await fs.mkdir(exportDirV5); + +// return; +// try { +// await repository.export({ +// id: testId, +// target: exportDirV5, +// options: { version: "v5" } +// }); +// } catch (e) { +// // assert.strictEqual( +// // e.message, +// // "Can't export a version that doesn't exist.", +// // "Refuses to export non existent version" +// // ); +// } +// return; +// }); +// }); + +// // FIXME: a lot of this is duplicated from the directory import tests +// // and could be streamlined + +// describe.skip("Adding objects with callbacks", async function() { +// const CONTENT = { +// "dir/file1.txt": "Contents of file1.txt", +// "dir/file2.txt": "Contents of file2.txt", +// "file3.txt": "Contents of file3.txt" +// }; + +// let repository; + +// beforeEach(async () => { +// repository = await createTestRepo(); +// }); + +// const makeContent = async dir => { +// const files = Object.keys(CONTENT); +// for (const f of files) { +// const d = path.join(dir, path.dirname(f)); +// await fs.ensureDir(d); +// await fs.writeFile(path.join(dir, f), CONTENT[f]); +// } +// }; + +// it("can create an object with a callback", async function() { +// const object = await repository.createNewObjectContent( +// "some_id", +// makeContent +// ); +// assert.strictEqual(object.ocflVersion, "1.0"); +// }); + +// it("Does not increment version number if you add the same thing twice", async function() { +// await repository.createNewObjectContent("xx", makeContent); +// const object = await repository.createNewObjectContent("xx", makeContent); +// const inventory = await object.getInventory(); +// assert.strictEqual(inventory.head, "v1"); +// }); + +// it("Does not let you use a subset of an existing id", async function() { +// await repository.createNewObjectContent("aa", makeContent); +// try { +// const object = await repository.createNewObjectContent( +// "aabb", +// makeContent +// ); +// } catch (e) { +// assert.strictEqual( +// e.message, +// "A parent of this path seems to be an OCFL object and that's not allowed" +// ); +// } +// }); + +// it("Does not let you use a superset of an existing id", async function() { +// await repository.createNewObjectContent("cc", makeContent); +// try { +// await repository.createNewObjectContent("ccdd", makeContent); +// } catch (e) { +// assert.strictEqual( +// e.message, +// "A parent of this path seems to be an OCFL object and that's not allowed" +// ); +// } +// }); + +// it("should make up an ID if you add content", async function() { +// const obj = await repository.createNewObjectContent(null, makeContent); +// const inv = await obj.getInventory(); +// const new_id = inv.id; +// // We got a UUID as an an ID +// assert.strictEqual(new_id.length, 36); +// // Check that the object is there +// const objectPath = path.join( +// repositoryPath, +// new_id.replace(/(..)/g, "$1/") +// ); +// assert.strictEqual(fs.existsSync(objectPath), true); +// }); + +// it("should use your id for a new object if you give it one", async function() { +// const obj = await repository.createNewObjectContent( +// "some_other_id", +// makeContent +// ); +// // We got a UUID as an an ID +// const inv = await obj.getInventory(); +// assert.strictEqual(inv.id, "some_other_id"); +// // Check that the object is there +// const objectPath = path.join( +// repositoryPath, +// inv.id.replace(/(..)/g, "$1/") +// ); +// assert.strictEqual(fs.existsSync(objectPath), true); +// }); + +// it("should have the content generated by the callback", async function() { +// const obj = await repository.createNewObjectContent( +// "some_other_id", +// makeContent +// ); +// const files = Object.keys(CONTENT); +// for (const f of files) { +// const ocflf = path.join(obj.path, "v1/content", f); +// expect(ocflf) +// .to.be.a.file(`${ocflf} is a file`) +// .with.content(CONTENT[f]); +// } +// }); + +// it("should have a manifest entry for each file with the correct hash", async function() { +// const obj = await repository.createNewObjectContent( +// "some_other_id", +// makeContent +// ); +// const files = Object.keys(CONTENT); +// const inventory = await obj.getInventory(); +// const manifest = inventory.manifest; +// for (const f of files) { +// const ocflf = path.join(obj.path, "v1/content", f); +// expect(ocflf) +// .to.be.a.file(`${ocflf} is a file`) +// .with.content(CONTENT[f]); +// const h = await hasha.fromFile(ocflf, { algorithm: DIGEST_ALGORITHM }); +// expect(manifest[h][0]).to.equal(path.join("v1/content", f)); +// delete manifest[h]; +// } +// expect(manifest).to.be.empty; +// }); +// }); + +// after(function() { +// //TODO: destroy test repoPath +// });