{"id":22302591,"url":"https://github.com/dataoneorg/mnlite","last_synced_at":"2026-04-17T09:32:35.302Z","repository":{"id":71253812,"uuid":"314573676","full_name":"DataONEorg/mnlite","owner":"DataONEorg","description":"Light weight read-only DataONE member node in Python Flask","archived":false,"fork":false,"pushed_at":"2026-03-17T19:21:58.000Z","size":4439,"stargazers_count":0,"open_issues_count":22,"forks_count":0,"subscribers_count":8,"default_branch":"main","last_synced_at":"2026-03-18T03:57:41.897Z","etag":null,"topics":["json-ld","python3","repository"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DataONEorg.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-11-20T14:13:01.000Z","updated_at":"2026-03-17T14:05:57.000Z","dependencies_parsed_at":"2024-03-15T19:49:41.399Z","dependency_job_id":"6af2a321-d005-4af7-86ec-92bd0e89d64e","html_url":"https://github.com/DataONEorg/mnlite","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/DataONEorg/mnlite","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DataONEorg%2Fmnlite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DataONEorg%2Fmnlite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DataONEorg%2Fmnlite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DataONEorg%2Fmnlite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DataONEorg","download_url":"https://codeload.github.com/DataONEorg/mnlite/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DataONEorg%2Fmnlite/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31923153,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-17T09:10:15.403Z","status":"ssl_error","status_checked_at":"2026-04-17T09:10:14.455Z","response_time":62,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["json-ld","python3","repository"],"created_at":"2024-12-03T18:39:58.032Z","updated_at":"2026-04-17T09:32:35.280Z","avatar_url":"https://github.com/DataONEorg.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# mnlite\n\nLight weight read-only DataONE member node in Python Flask\n\n## Development Notes\n\nCreating a MN with node identifier `urn:node:mn_1`:\n\n----\nworkon mnlite\nexport FLASK_APP=mnlite\nmkdir -p instance/nodes/mn_1\nflask m_node new_node mn_1\n----\n\nAdd a subject to the MN:\n\n----\nopersist -f instance/nodes/mn_1 sub -o create -n \"Dave\" -s 'https://orcid.org/0000-0002-6513-4996'\n----\n\nAdjust the node configuration to specify `default_submitter`, `default_owner`, `base_url`, and `contact_subject`:\n\n----\n{\n  \"node\": {\n    \"node_id\": \"urn:node:mn_1\",\n    \"state\": \"up\",\n    \"name\": \"Unnamed member node: mn_1\",\n    \"description\": \"No description available for this node.\",\n    \"base_url\": \"http://localhost:5000/mn_1/\",\n    \"schedule\": {\n      \"hour\": \"*\",\n      \"day\": \"*\",\n      \"min\": \"0,10,20,30,40,50\",\n      \"mon\": \"*\",\n      \"sec\": \"5\",\n      \"wday\": \"*\",\n      \"year\": \"*\"\n    },\n    \"subject\": \"http://localhost:5000/mn_1\",\n    \"contact_subject\": \"https://orcid.org/0000-0002-6513-4996\"\n  },\n  \"content_database\": \"sqlite:///content.db\",\n  \"log_database\": \"sqlite:///eventlog.db\",\n  \"data_folder\": \"data\",\n  \"created\": \"2021-02-19T15:17:09+0000\",\n  \"default_submitter\": \"https://orcid.org/0000-0002-6513-4996\",\n  \"default_owner\": \"https://orcid.org/0000-0002-6513-4996\"\n  \"spider\":{\n    \"sitemap_urls\":[\n      \"https://datadryad.org/sitemap.xml\"\n    ]\n  }\n}\n----\n\n\nThe `mnlite` service:\n\n----\nworkon mnlite\nexport FLASK_APP=mnlite\nexport FLASK_ENV=development\nflask run\n----\n\nThe `soscan` service:\n\n----\nworkon mnlite\n\n----\n\nCollecting content from a source.\n\nImplemented as a scrapy based crawler. Given a sitemap, crawls\nand adds discovered SO:Dataset entries to the persistence store.\n\nSettings are in `settings.py`\n\n----\nworkon mnlite\nscrapy crawl JsonldSpider  -s STORE_PATH=instance/nodes/mn_3\n----\n\nTo count sitemap loc entries only:\n\n----\nscrapy crawl JsonldSpider -s STORE_PATH=instance/nodes/mnTestDRYAD -L INFO -a count_only=1\n----\n\n## Model\n\n\n### Thing\n\nA digital entity. The persistent identifier is the Sha256 hash of the\nbytes. A Thing may have more than one identifier. An instance of Thing\nmay be any digital object such as metadata, data, and so forth.\n\nA Thing may have multiple Identifiers.\n\nA Thing has only one unique Sha256 hash. It has single Sha1 and MD5\nhashes that are unique within the constraints of those hashing\nalgorithms.\n\n### Identifier\n\nCaptures metadata associated with a minted identifier. Note that this\nis about the identifier, it's creation, and other management aspects.\nThe content referenced by an identifier is described by the Thing.\n\nAn Identifier may be associated with more than one Thing. There are\nsituations where this can happen:\n\n1. Different representations of the same thing. For example a digital\nentity may be conceptually the same though serialized differently.\n\n2. Different aspects of the same thing. For example, a DOI may resolve to\na landing page that describes a Thing.\n\n3. Erroneous duplication, the Identifier is used to reference two or more\ndistinct, unrelated entities.\n\n4. The identifier refers to a conceptualization of a thing. For example a\nseries identifer in the DataONE system refers to the most recent version of\nsome thing.\n\nIn practice, while an identifier may be intended to be a globally unique\nreference to a specific digital thing, the most reliable mechanism to achieve\nthis is using an identifier derived from the content of the thing.\n\nIdentifiers generated from a hash of the content of a Thing will be unique,\nsubject to the contraints of the hashing algorithm. It is assumed here\nfor all practical purposes that a Sha256 identifier will always refer\nto exactly one digital entity.\n\nIdentifiers may refer to a physical thing. Physical things do not exist\ndigitally. Hence, any digital entity can only be associated with a physical\nthing, it can not be that thing. As such, where an identifier is used to\nrefer to a physical thing and a digital thing, the digital thing must\nresult from some observation of the physical thing. The outcomes of such\nobservation may be manifest in many different forms such as metadata, data\nrecords, images, and other digital entities.\n\n\n### Relation\n\nDocuments a relationship between two identifiers.\n\nWhere identifiers refer to specific digital entities, the relation is\nunambiguous.\n\nAmbiguous relationships arise where identifiers may refer to more than one\nThing. The degree of ambiguity varies with the precision of the identifiers.\n\nA relationship between physical things implies a physical association. E.g.\na sub-sample, a sibling sample from a batch, geographcally co-located, and\nso forth.\n\nRelations exist within a Context. As of this writing, Contexts are\ndefined by a label.\n\n\n### AccessRule\n\nDefines how Subjects may interact with a Thing.\n\nA Thing may have multiple AccessRules.\n\nAn AccessRule may have multiple Subjects.\n\n### Subject\n\nIdentifies an actor that may interact with a Thing.\n\n### Request\n\nHolds metadata associated with a request such as a HTTP request resolving\nan Identifier or retrieving a Thing.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdataoneorg%2Fmnlite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdataoneorg%2Fmnlite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdataoneorg%2Fmnlite/lists"}