paneron-register 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -0
- data/README.adoc +52 -13
- data/lib/paneron/register/data_set.rb +12 -0
- data/lib/paneron/register/item.rb +18 -0
- data/lib/paneron/register/item_class.rb +6 -45
- data/lib/paneron/register/item_status.rb +11 -0
- data/lib/paneron/register/item_statuses.rb +16 -0
- data/lib/paneron/register/proposal.rb +14 -0
- data/lib/paneron/register/proposal_state.rb +11 -0
- data/lib/paneron/register/proposal_states.rb +22 -0
- data/lib/paneron/register/raw/data_set.rb +93 -0
- data/lib/paneron/register/raw/item.rb +58 -0
- data/lib/paneron/register/raw/item_class.rb +70 -0
- data/lib/paneron/register/raw/register.rb +154 -0
- data/lib/paneron/register/raw.rb +8 -0
- data/lib/paneron/register/register.rb +7 -66
- data/lib/paneron/register/version.rb +3 -1
- data/lib/paneron/register.rb +13 -2
- data/lib/paneron.rb +2 -0
- data/paneron-register.gemspec +5 -0
- metadata +42 -3
- data/lib/paneron/register/register_root.rb +0 -79
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 52d7cfff231080db14c14453bd757db38f58b35ffcdbe69588c34fc97facc331
|
4
|
+
data.tar.gz: f5d14ee0605cc362800849f463a08bacf6cf2e1ef3a055244425b7264933bdf1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a8588a75ec028ce6faa1083f615c120ed289a31924a19276383e8309ac40c2aa0733b299de94d1af23d98406faf67b06548351a605f2ead260ee1f927be30e7
|
7
|
+
data.tar.gz: '049798fcb8d8308ada3f45ce7effb8d960e3546890c5780c34178c5ad2bd94653f82be52f63a29945d3cf3b98d1b1a251055a1dec529b8056103c8da1ac5b268'
|
data/.rubocop.yml
CHANGED
@@ -7,10 +7,16 @@ inherit_from:
|
|
7
7
|
Layout/LineLength:
|
8
8
|
Enabled: true
|
9
9
|
AllowedPatterns: ["^\\s*#"]
|
10
|
+
Max: 95
|
10
11
|
|
11
12
|
Metrics/MethodLength:
|
12
13
|
Enabled: true
|
13
14
|
CountAsOne: ["array", "hash", "heredoc", "method_call"]
|
15
|
+
Max: 35
|
16
|
+
|
17
|
+
Metrics/AbcSize:
|
18
|
+
Enabled: true
|
19
|
+
Max: 20
|
14
20
|
|
15
21
|
Metrics/BlockLength:
|
16
22
|
Enabled: true
|
data/README.adoc
CHANGED
@@ -18,31 +18,70 @@ gem install paneron-register
|
|
18
18
|
```ruby
|
19
19
|
require "paneron/register"
|
20
20
|
|
21
|
-
# Initialize a new
|
22
|
-
# This example uses a working copy of Paneron's
|
23
|
-
|
21
|
+
# Initialize a new data set
|
22
|
+
# This example uses a working copy of Paneron's data set.
|
23
|
+
# => Paneron::Register::Raw::DataSet
|
24
|
+
raw_data_set = Paneron::Register::Raw::DataSet.new(
|
24
25
|
"/Users/username/Library/Application Support/Electron/working_copies/00000000-0001-0000-0000-000000000001",
|
25
|
-
"
|
26
|
+
"data_set_name-1"
|
26
27
|
)
|
27
28
|
|
28
|
-
#
|
29
|
-
|
29
|
+
# => Paneron::Register::DataSet < Lutaml::Model::Serializable
|
30
|
+
data_set = raw_data_set.to_lutaml
|
31
|
+
|
32
|
+
# Alternatively, initialize a new register:
|
33
|
+
# => Paneron::Register::Raw::Register
|
34
|
+
raw_register = Paneron::Register::Raw::Register.new(
|
30
35
|
"/Users/username/Library/Application Support/Electron/working_copies/00000000-0001-0000-0000-000000000001",
|
31
36
|
)
|
32
|
-
|
37
|
+
|
38
|
+
# This example uses a Git URL
|
39
|
+
# => Paneron::Register::Raw::Register
|
40
|
+
raw_register = Paneron::Register::Raw::Register.from_git(
|
41
|
+
"https://github.com/isogr/registry",
|
42
|
+
|
43
|
+
# optional. For previously cloned repos, pulls from repo iff true.
|
44
|
+
# update: true,
|
45
|
+
)
|
46
|
+
|
47
|
+
# => Paneron::Register::Raw::DataSet
|
48
|
+
raw_data_set = raw_register.data_sets("data_set_name-1")
|
49
|
+
|
50
|
+
# => Paneron::Register::DataSet < Lutaml::Model::Serializable
|
51
|
+
data_set = raw_data_set.to_lutaml
|
33
52
|
|
34
53
|
# Get all item class objects
|
35
|
-
|
54
|
+
# => { item-class-name: Paneron::Register::Raw::ItemClass }
|
55
|
+
raw_data_set.item_classes
|
56
|
+
|
57
|
+
# => [ Paneron::Register::ItemClass ]
|
58
|
+
data_set.item_classes
|
36
59
|
|
37
60
|
# Get a specific item class object
|
38
|
-
|
61
|
+
# => Paneron::Register::Raw::ItemClass
|
62
|
+
raw_item_class = raw_data_set.item_classes("item-class-1")
|
63
|
+
|
64
|
+
# => Paneron::Register::ItemClass < Lutaml::Model::Serializable
|
65
|
+
item_class = raw_item_class.to_lutaml
|
39
66
|
|
40
|
-
# Get all item
|
41
|
-
|
67
|
+
# Get all item objects in Ruby Hash format
|
68
|
+
# => { item-uuid: Paneron::Register::Raw::Item }
|
69
|
+
raw_item_class.items
|
70
|
+
|
71
|
+
# => [ Paneron::Register::Item ]
|
72
|
+
item_class.items
|
42
73
|
|
43
74
|
# Get a specific item property, using normal Ruby Hash methods
|
44
|
-
|
45
|
-
|
75
|
+
# => Paneron::Register::Raw::Item
|
76
|
+
raw_item = raw_item_class.items["00000000-0000-0000-0000-000000000001"]
|
77
|
+
id = raw_item["id"]
|
78
|
+
blob1 = raw_item["data"]["blob1"]
|
79
|
+
|
80
|
+
# Get a specific item property, from a Lutaml object
|
81
|
+
# => Paneron::Register::Item < Lutaml::Model::Serializable
|
82
|
+
item = raw_item.to_lutaml
|
83
|
+
id = item.to_h["id"]
|
84
|
+
blob1 = item.to_h["data"]["blob1"]
|
46
85
|
```
|
47
86
|
|
48
87
|
== License
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "lutaml/model"
|
4
|
+
|
5
|
+
module Paneron
|
6
|
+
module Register
|
7
|
+
class DataSet < Lutaml::Model::Serializable
|
8
|
+
attribute :name, Lutaml::Model::Type::String
|
9
|
+
attribute :item_classes, Paneron::Register::ItemClass, collection: true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "lutaml/model"
|
4
|
+
|
5
|
+
module Paneron
|
6
|
+
module Register
|
7
|
+
class Item < Lutaml::Model::Serializable
|
8
|
+
# 'id' is a UUID
|
9
|
+
attribute :id, Lutaml::Model::Type::String
|
10
|
+
|
11
|
+
# TODO: data is free form object
|
12
|
+
attribute :data, Lutaml::Model::Type::String
|
13
|
+
attribute :status, Paneron::Register::ItemStatus, values:
|
14
|
+
Paneron::Register::ITEM_STATUSES.values
|
15
|
+
attribute :date_accepted, Lutaml::Model::Type::DateTime
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -1,51 +1,12 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "lutaml/model"
|
2
4
|
|
3
5
|
module Paneron
|
4
6
|
module Register
|
5
|
-
class ItemClass
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def initialize(register_root_path, register_name, item_class_name)
|
10
|
-
File.join(register_root_path, register_name)
|
11
|
-
item_class_path = File.join(register_root_path, register_name,
|
12
|
-
item_class_name)
|
13
|
-
self.class.validate_item_class_path(item_class_path)
|
14
|
-
@item_class_path = item_class_path
|
15
|
-
@items_uuids = nil
|
16
|
-
@items = {}
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.validate_item_class_path(path)
|
20
|
-
unless File.exist?(path)
|
21
|
-
raise Paneron::Register::Error,
|
22
|
-
"Item class path does not exist"
|
23
|
-
end
|
24
|
-
unless File.directory?(path)
|
25
|
-
raise Paneron::Register::Error,
|
26
|
-
"Item class path is not a directory"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def item_uuids
|
31
|
-
@item_uuids ||= Dir.glob(File.join(item_class_path, "*.yaml"))
|
32
|
-
.map { |file| File.basename(file, ".yaml") }
|
33
|
-
end
|
34
|
-
|
35
|
-
def item_yamls(uuid = nil)
|
36
|
-
if uuid.nil?
|
37
|
-
item_uuids.reduce({}) do |acc, uuid|
|
38
|
-
acc[uuid] = item_yamls(uuid)
|
39
|
-
acc
|
40
|
-
end
|
41
|
-
else
|
42
|
-
@items[uuid] ||=
|
43
|
-
YAML.safe_load_file(
|
44
|
-
File.join(item_class_path, "#{uuid}.yaml"),
|
45
|
-
permitted_classes: [Time],
|
46
|
-
)
|
47
|
-
end
|
48
|
-
end
|
7
|
+
class ItemClass < Lutaml::Model::Serializable
|
8
|
+
attribute :name, Lutaml::Model::Type::String
|
9
|
+
attribute :items, Paneron::Register::Item, collection: true
|
49
10
|
end
|
50
11
|
end
|
51
12
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Paneron
|
4
|
+
module Register
|
5
|
+
# From registry-kit
|
6
|
+
ITEM_STATUSES = {
|
7
|
+
INVALID: "invalid",
|
8
|
+
RETIRED: "retired",
|
9
|
+
SUBMITTED: "submitted",
|
10
|
+
SUPERSEDED: "superseded",
|
11
|
+
VALID: "valid",
|
12
|
+
}
|
13
|
+
.transform_values { |v| Paneron::Register::ItemStatus.new(state: v) }
|
14
|
+
.freeze
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "lutaml/model"
|
4
|
+
|
5
|
+
module Paneron
|
6
|
+
module Register
|
7
|
+
class Proposal < Lutaml::Model::Serializable
|
8
|
+
attribute :uuid, Lutaml::Model::Type::String
|
9
|
+
attribute :date_accepted, Lutaml::Model::Type::DateTime
|
10
|
+
attribute :state, Paneron::Register::ProposalState, values:
|
11
|
+
Paneron::Register::PROPOSAL_STATES.values
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Paneron
|
4
|
+
module Register
|
5
|
+
# From registry-kit
|
6
|
+
PROPOSAL_STATES = {
|
7
|
+
DRAFT: "draft",
|
8
|
+
PROPOSED: "proposed",
|
9
|
+
SUBMITTED_FOR_CONTROL_BODY_REVIEW: "pending-control-body-review",
|
10
|
+
RETURNED_FOR_CLARIFICATION: "returned-for-clarification",
|
11
|
+
ACCEPTED: "accepted",
|
12
|
+
REJECTED: "rejected",
|
13
|
+
APPEALED: "rejection-appealed-to-owner",
|
14
|
+
WITHDRAWN: "withdrawn",
|
15
|
+
ACCEPTED_ON_APPEAL: "accepted-on-appeal",
|
16
|
+
REJECTION_UPHELD_ON_APPEAL: "rejection-upheld-on-appeal",
|
17
|
+
APPEAL_WITHDRAWN: "appeal-withdrawn",
|
18
|
+
}
|
19
|
+
.transform_values { |v| Paneron::Register::ProposalState.new(state: v) }
|
20
|
+
.freeze
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "yaml"
|
4
|
+
|
5
|
+
module Paneron
|
6
|
+
module Register
|
7
|
+
module Raw
|
8
|
+
class DataSet
|
9
|
+
attr_reader :data_set_path, :register_path, :data_set_yaml_path,
|
10
|
+
:data_set_name, :extension
|
11
|
+
|
12
|
+
def initialize(register_path, data_set_name, extension = "yaml")
|
13
|
+
data_set_path = File.join(register_path, data_set_name)
|
14
|
+
self.class.validate_data_set_path(data_set_path)
|
15
|
+
|
16
|
+
@register_path = register_path
|
17
|
+
@data_set_name = data_set_name
|
18
|
+
@extension = extension
|
19
|
+
@data_set_path = data_set_path
|
20
|
+
@data_set_yaml_path = File.join(data_set_path,
|
21
|
+
DATA_SET_METADATA_FILENAME)
|
22
|
+
@item_classes = {}
|
23
|
+
@item_class_names = nil
|
24
|
+
@item_uuids = nil
|
25
|
+
@metadata = nil
|
26
|
+
end
|
27
|
+
|
28
|
+
DATA_SET_METADATA_FILENAME = "/register.yaml"
|
29
|
+
|
30
|
+
def self.validate_data_set_path(data_set_path)
|
31
|
+
unless File.exist?(data_set_path)
|
32
|
+
raise Paneron::Register::Error,
|
33
|
+
"Data Set path does not exist"
|
34
|
+
end
|
35
|
+
unless File.directory?(data_set_path)
|
36
|
+
raise Paneron::Register::Error,
|
37
|
+
"Data Set path is not a directory"
|
38
|
+
end
|
39
|
+
unless File.exist?(File.join(
|
40
|
+
data_set_path, DATA_SET_METADATA_FILENAME
|
41
|
+
))
|
42
|
+
raise Paneron::Register::Error,
|
43
|
+
"Data Set metadata file does not exist"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_lutaml
|
48
|
+
Paneron::Register::DataSet.new(
|
49
|
+
name: data_set_name,
|
50
|
+
item_classes: item_class_lutamls,
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
def item_class_lutamls
|
55
|
+
item_classes.map do |_item_class_name, item_class|
|
56
|
+
item_class.to_lutaml
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def item_classes(item_class_name = nil)
|
61
|
+
if item_class_name.nil?
|
62
|
+
item_class_names.reduce({}) do |acc, item_class_name|
|
63
|
+
acc[item_class_name] = item_classes(item_class_name)
|
64
|
+
acc
|
65
|
+
end
|
66
|
+
else
|
67
|
+
@item_classes[item_class_name] ||=
|
68
|
+
Paneron::Register::Raw::ItemClass.new(
|
69
|
+
data_set_path, item_class_name
|
70
|
+
)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def item_class_names
|
75
|
+
@item_class_names ||=
|
76
|
+
Dir.glob(File.join(data_set_path, "*/*.#{extension}"))
|
77
|
+
.map { |file| File.basename(File.dirname(file)) }.uniq
|
78
|
+
end
|
79
|
+
|
80
|
+
def item_uuids
|
81
|
+
item_classes.values.map(&:item_uuids).flatten
|
82
|
+
end
|
83
|
+
|
84
|
+
def metadata
|
85
|
+
@metadata ||= YAML.safe_load_file(
|
86
|
+
data_set_yaml_path,
|
87
|
+
permitted_classes: [Time],
|
88
|
+
)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "yaml"
|
4
|
+
|
5
|
+
module Paneron
|
6
|
+
module Register
|
7
|
+
module Raw
|
8
|
+
class Item
|
9
|
+
attr_reader :item_class_path,
|
10
|
+
:item_id,
|
11
|
+
:item_path,
|
12
|
+
:extension
|
13
|
+
|
14
|
+
def initialize(
|
15
|
+
item_class_path,
|
16
|
+
item_id,
|
17
|
+
extension = "yaml"
|
18
|
+
)
|
19
|
+
item_path = File.join(item_class_path, "#{item_id}.#{extension}")
|
20
|
+
self.class.validate_item_path(item_path)
|
21
|
+
@item_class_path = item_class_path
|
22
|
+
@item_id = item_id
|
23
|
+
@item_path = item_path
|
24
|
+
@extension = extension
|
25
|
+
@to_h = nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.validate_item_path(path)
|
29
|
+
unless File.exist?(path)
|
30
|
+
raise Paneron::Register::Error,
|
31
|
+
"Item path does not exist"
|
32
|
+
end
|
33
|
+
unless File.file?(path)
|
34
|
+
raise Paneron::Register::Error,
|
35
|
+
"Item path is not a file"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_lutaml
|
40
|
+
Paneron::Register::Item.new(
|
41
|
+
id: item_id,
|
42
|
+
data: to_h["data"],
|
43
|
+
status: Paneron::Register::ItemStatus.new(state: to_h["status"]),
|
44
|
+
date_accepted: to_h["dateAccepted"].to_s,
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_h
|
49
|
+
@to_h ||=
|
50
|
+
YAML.safe_load_file(
|
51
|
+
File.join(item_path),
|
52
|
+
permitted_classes: [Time],
|
53
|
+
)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "yaml"
|
4
|
+
|
5
|
+
module Paneron
|
6
|
+
module Register
|
7
|
+
module Raw
|
8
|
+
class ItemClass
|
9
|
+
attr_reader :data_set_path,
|
10
|
+
:item_class_name, :item_class_path, :extension
|
11
|
+
|
12
|
+
def initialize(
|
13
|
+
data_set_path,
|
14
|
+
item_class_name,
|
15
|
+
extension = "yaml"
|
16
|
+
)
|
17
|
+
item_class_path = File.join(data_set_path, item_class_name)
|
18
|
+
self.class.validate_item_class_path(item_class_path)
|
19
|
+
@extension = extension
|
20
|
+
@data_set_path = data_set_path
|
21
|
+
@item_class_name = item_class_name
|
22
|
+
@item_class_path = item_class_path
|
23
|
+
@items_uuids = nil
|
24
|
+
@items = {}
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.validate_item_class_path(path)
|
28
|
+
unless File.exist?(path)
|
29
|
+
raise Paneron::Register::Error,
|
30
|
+
"Item class path does not exist"
|
31
|
+
end
|
32
|
+
unless File.directory?(path)
|
33
|
+
raise Paneron::Register::Error,
|
34
|
+
"Item class path is not a directory"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_lutaml
|
39
|
+
Paneron::Register::ItemClass.new(
|
40
|
+
name: item_class_name,
|
41
|
+
items: item_lutamls,
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
def item_uuids
|
46
|
+
@item_uuids ||= Dir.glob(File.join(item_class_path, "*.#{extension}"))
|
47
|
+
.map { |file| File.basename(file, ".#{extension}") }
|
48
|
+
end
|
49
|
+
|
50
|
+
def items(uuid = nil)
|
51
|
+
if uuid.nil?
|
52
|
+
item_uuids.reduce({}) do |acc, uuid|
|
53
|
+
acc[uuid] = items(uuid)
|
54
|
+
acc
|
55
|
+
end
|
56
|
+
else
|
57
|
+
@items[uuid] ||=
|
58
|
+
Paneron::Register::Raw::Item.new(
|
59
|
+
item_class_path, uuid
|
60
|
+
)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def item_lutamls
|
65
|
+
items.values.map(&:to_lutaml)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "yaml"
|
4
|
+
|
5
|
+
module Paneron
|
6
|
+
module Register
|
7
|
+
module Raw
|
8
|
+
class Register
|
9
|
+
attr_reader :register_path, :register_yaml_path
|
10
|
+
|
11
|
+
def initialize(register_path)
|
12
|
+
self.class.validate_path(register_path)
|
13
|
+
@register_path = register_path
|
14
|
+
@register_yaml_path = File.join(register_path,
|
15
|
+
REGISTER_METADATA_FILENAME)
|
16
|
+
@data_set_names = nil
|
17
|
+
@data_sets = {}
|
18
|
+
@metadata = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.local_cache_path
|
22
|
+
case RUBY_PLATFORM
|
23
|
+
when /darwin/
|
24
|
+
File.join(
|
25
|
+
`command getconf DARWIN_USER_CACHE_DIR`.chomp,
|
26
|
+
"com.paneron.ruby-paneron-register",
|
27
|
+
)
|
28
|
+
else
|
29
|
+
File.join(
|
30
|
+
Dir.exist?(ENV["XDG_CACHE_HOME"]) ? ENV["XDG_CACHE_HOME"] : "~/.cache",
|
31
|
+
"ruby-paneron-register",
|
32
|
+
)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.setup_cache_path
|
37
|
+
if !Dir.exist?(local_cache_path)
|
38
|
+
require "fileutils"
|
39
|
+
FileUtils.mkdir_p(local_cache_path)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.calculate_repo_cache_hash(repo_url)
|
44
|
+
require "digest"
|
45
|
+
require "base64"
|
46
|
+
digest = [Digest::SHA1.hexdigest(repo_url)].pack("H*")
|
47
|
+
Base64.encode64(digest).tr("+/= ", "_-")[0..16]
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.from_git(repo_url, update: true)
|
51
|
+
require "git"
|
52
|
+
setup_cache_path
|
53
|
+
repo_cache_name =
|
54
|
+
"#{File.basename(repo_url)}-#{calculate_repo_cache_hash(repo_url)}"
|
55
|
+
|
56
|
+
# Check if repo is already cloned
|
57
|
+
full_local_cache_path = File.join(local_cache_path, repo_cache_name)
|
58
|
+
g = begin
|
59
|
+
if File.exist?(full_local_cache_path)
|
60
|
+
_g = Git.open(full_local_cache_path)
|
61
|
+
|
62
|
+
# Pull-rebase to update it
|
63
|
+
if update
|
64
|
+
_g.pull(
|
65
|
+
nil, nil, rebase: true
|
66
|
+
)
|
67
|
+
end
|
68
|
+
_g
|
69
|
+
else
|
70
|
+
Git.clone(
|
71
|
+
repo_url,
|
72
|
+
repo_cache_name,
|
73
|
+
path: local_cache_path,
|
74
|
+
# timeout: 30,
|
75
|
+
)
|
76
|
+
end
|
77
|
+
rescue Git::TimeoutError => e
|
78
|
+
e.result.tap do |_r|
|
79
|
+
warn "Timed out trying to clone #{repo_url}."
|
80
|
+
raise e
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
new(g.dir.path)
|
85
|
+
end
|
86
|
+
|
87
|
+
REGISTER_METADATA_FILENAME = "/paneron.yaml"
|
88
|
+
|
89
|
+
def self.validate_path(register_path)
|
90
|
+
unless File.exist?(register_path)
|
91
|
+
raise Paneron::Register::Error,
|
92
|
+
"Register path does not exist"
|
93
|
+
end
|
94
|
+
unless File.directory?(register_path)
|
95
|
+
raise Paneron::Register::Error,
|
96
|
+
"Register path is not a directory"
|
97
|
+
end
|
98
|
+
unless File.exist?(File.join(
|
99
|
+
register_path, REGISTER_METADATA_FILENAME
|
100
|
+
))
|
101
|
+
raise Paneron::Register::Error,
|
102
|
+
"Register metadata file does not exist"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def to_lutaml
|
107
|
+
Paneron::Register::Register.new(
|
108
|
+
data_sets: data_set_lutamls,
|
109
|
+
metadata: metadata.to_json,
|
110
|
+
)
|
111
|
+
end
|
112
|
+
|
113
|
+
def data_set_names
|
114
|
+
@data_set_names ||= Dir.glob(
|
115
|
+
File.join(
|
116
|
+
register_path,
|
117
|
+
"*#{Paneron::Register::Raw::DataSet::DATA_SET_METADATA_FILENAME}",
|
118
|
+
),
|
119
|
+
)
|
120
|
+
.map do |file|
|
121
|
+
File.basename(File.dirname(file))
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def data_set_path(data_set_name)
|
126
|
+
File.join(register_path, data_set_name)
|
127
|
+
end
|
128
|
+
|
129
|
+
def metadata
|
130
|
+
@metadata ||= YAML.safe_load_file(register_yaml_path)
|
131
|
+
end
|
132
|
+
|
133
|
+
def data_sets(data_set_name = nil)
|
134
|
+
if data_set_name.nil?
|
135
|
+
data_set_names.reduce({}) do |acc, data_set_name|
|
136
|
+
acc[data_set_name] = data_sets(data_set_name)
|
137
|
+
acc
|
138
|
+
end
|
139
|
+
else
|
140
|
+
@data_sets[data_set_name] ||=
|
141
|
+
Paneron::Register::Raw::DataSet.new(register_path,
|
142
|
+
data_set_name)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def data_set_lutamls
|
147
|
+
data_sets.map do |_data_set_name, data_set|
|
148
|
+
data_set.to_lutaml
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
@@ -1,73 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "yaml"
|
2
4
|
|
5
|
+
require "lutaml/model"
|
6
|
+
|
3
7
|
module Paneron
|
4
8
|
module Register
|
5
|
-
class Register
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def initialize(register_root_path, register_name)
|
10
|
-
register_path = File.join(register_root_path, register_name)
|
11
|
-
self.class.validate_register_path(register_path)
|
12
|
-
@register_name = register_name
|
13
|
-
@register_root_path = register_root_path
|
14
|
-
@register_path = register_path
|
15
|
-
@register_yaml_path = File.join(register_path,
|
16
|
-
REGISTER_METADATA_FILENAME)
|
17
|
-
@item_classes = {}
|
18
|
-
@item_class_names = nil
|
19
|
-
@item_uuids = nil
|
20
|
-
end
|
21
|
-
|
22
|
-
REGISTER_METADATA_FILENAME = "/register.yaml".freeze
|
23
|
-
|
24
|
-
def self.validate_register_path(register_path)
|
25
|
-
unless File.exist?(register_path)
|
26
|
-
raise Paneron::Register::Error,
|
27
|
-
"Register path does not exist"
|
28
|
-
end
|
29
|
-
unless File.directory?(register_path)
|
30
|
-
raise Paneron::Register::Error,
|
31
|
-
"Register path is not a directory"
|
32
|
-
end
|
33
|
-
unless File.exist?(File.join(
|
34
|
-
register_path, REGISTER_METADATA_FILENAME
|
35
|
-
))
|
36
|
-
raise Paneron::Register::Error,
|
37
|
-
"Register metadata file does not exist"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def item_classes(item_class_name = nil)
|
42
|
-
if item_class_name.nil?
|
43
|
-
item_class_names.reduce({}) do |acc, item_class_name|
|
44
|
-
acc[item_class_name] = item_classes(item_class_name)
|
45
|
-
acc
|
46
|
-
end
|
47
|
-
else
|
48
|
-
@item_classes[item_class_name] ||=
|
49
|
-
Paneron::Register::ItemClass.new(
|
50
|
-
register_root_path, register_name, item_class_name
|
51
|
-
)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def item_class_names
|
56
|
-
@item_class_names ||=
|
57
|
-
Dir.glob(File.join(register_path, "*/*.yaml"))
|
58
|
-
.map { |file| File.basename(File.dirname(file)) }.uniq
|
59
|
-
end
|
60
|
-
|
61
|
-
def item_uuids
|
62
|
-
item_classes.values.map(&:item_uuids).flatten
|
63
|
-
end
|
64
|
-
|
65
|
-
def get_metadata_yaml
|
66
|
-
YAML.safe_load_file(
|
67
|
-
register_yaml_path,
|
68
|
-
permitted_classes: [Time],
|
69
|
-
)
|
70
|
-
end
|
9
|
+
class Register < Lutaml::Model::Serializable
|
10
|
+
attribute :data_sets, Paneron::Register::DataSet, collection: true
|
11
|
+
attribute :metadata, Lutaml::Model::Type::String
|
71
12
|
end
|
72
13
|
end
|
73
14
|
end
|
data/lib/paneron/register.rb
CHANGED
@@ -2,9 +2,20 @@
|
|
2
2
|
|
3
3
|
require "paneron/register/version"
|
4
4
|
require "paneron/register/error"
|
5
|
-
|
6
|
-
require "paneron/register/
|
5
|
+
|
6
|
+
require "paneron/register/raw/item"
|
7
|
+
require "paneron/register/raw/item_class"
|
8
|
+
require "paneron/register/raw/data_set"
|
9
|
+
require "paneron/register/raw/register"
|
10
|
+
|
11
|
+
require "paneron/register/proposal_state"
|
12
|
+
require "paneron/register/proposal_states"
|
13
|
+
require "paneron/register/item_status"
|
14
|
+
require "paneron/register/item_statuses"
|
15
|
+
require "paneron/register/item"
|
7
16
|
require "paneron/register/item_class"
|
17
|
+
require "paneron/register/data_set"
|
18
|
+
require "paneron/register/register"
|
8
19
|
|
9
20
|
# Paneron::Register module
|
10
21
|
module Paneron
|
data/lib/paneron.rb
CHANGED
data/paneron-register.gemspec
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
lib = File.expand_path("lib", __dir__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
5
|
require "paneron/register/version"
|
@@ -25,6 +27,9 @@ Gem::Specification.new do |spec|
|
|
25
27
|
|
26
28
|
# spec.add_runtime_dependency "yaml"
|
27
29
|
|
30
|
+
spec.add_runtime_dependency "git", "~> 2.3.1"
|
31
|
+
spec.add_runtime_dependency "lutaml-model", "~> 0.3.18"
|
32
|
+
|
28
33
|
spec.add_development_dependency "debug"
|
29
34
|
spec.add_development_dependency "pry"
|
30
35
|
spec.add_development_dependency "rake", "~> 13.0"
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paneron-register
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-10-
|
11
|
+
date: 2024-10-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: git
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.3.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.3.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: lutaml-model
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.3.18
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.3.18
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: debug
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,10 +206,21 @@ files:
|
|
178
206
|
- flake.nix
|
179
207
|
- lib/paneron.rb
|
180
208
|
- lib/paneron/register.rb
|
209
|
+
- lib/paneron/register/data_set.rb
|
181
210
|
- lib/paneron/register/error.rb
|
211
|
+
- lib/paneron/register/item.rb
|
182
212
|
- lib/paneron/register/item_class.rb
|
213
|
+
- lib/paneron/register/item_status.rb
|
214
|
+
- lib/paneron/register/item_statuses.rb
|
215
|
+
- lib/paneron/register/proposal.rb
|
216
|
+
- lib/paneron/register/proposal_state.rb
|
217
|
+
- lib/paneron/register/proposal_states.rb
|
218
|
+
- lib/paneron/register/raw.rb
|
219
|
+
- lib/paneron/register/raw/data_set.rb
|
220
|
+
- lib/paneron/register/raw/item.rb
|
221
|
+
- lib/paneron/register/raw/item_class.rb
|
222
|
+
- lib/paneron/register/raw/register.rb
|
183
223
|
- lib/paneron/register/register.rb
|
184
|
-
- lib/paneron/register/register_root.rb
|
185
224
|
- lib/paneron/register/version.rb
|
186
225
|
- paneron-register.gemspec
|
187
226
|
homepage: https://github.com/paneron/ruby-paneron-register
|
@@ -1,79 +0,0 @@
|
|
1
|
-
require "yaml"
|
2
|
-
|
3
|
-
module Paneron
|
4
|
-
module Register
|
5
|
-
class RegisterRoot
|
6
|
-
attr_reader :register_root_path, :register_root_yaml_path
|
7
|
-
|
8
|
-
def initialize(register_root_path)
|
9
|
-
self.class.validate_root_path(register_root_path)
|
10
|
-
@register_root_path = register_root_path
|
11
|
-
@register_root_yaml_path = File.join(register_root_path,
|
12
|
-
REGISTER_ROOT_METADATA_FILENAME)
|
13
|
-
@register_names = nil
|
14
|
-
@registries = {}
|
15
|
-
end
|
16
|
-
|
17
|
-
REGISTER_ROOT_METADATA_FILENAME = "/paneron.yaml".freeze
|
18
|
-
|
19
|
-
def self.validate_root_path(register_root_path)
|
20
|
-
unless File.exist?(register_root_path)
|
21
|
-
raise Paneron::Register::Error,
|
22
|
-
"Register root path does not exist"
|
23
|
-
end
|
24
|
-
unless File.directory?(register_root_path)
|
25
|
-
raise Paneron::Register::Error,
|
26
|
-
"Register root path is not a directory"
|
27
|
-
end
|
28
|
-
unless File.exist?(File.join(
|
29
|
-
register_root_path, REGISTER_ROOT_METADATA_FILENAME
|
30
|
-
))
|
31
|
-
raise Paneron::Register::Error,
|
32
|
-
"Register root metadata file does not exist"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def register_names
|
37
|
-
@register_names ||= Dir.glob(
|
38
|
-
File.join(
|
39
|
-
register_root_path,
|
40
|
-
"*#{Paneron::Register::Register::REGISTER_METADATA_FILENAME}",
|
41
|
-
),
|
42
|
-
)
|
43
|
-
.map do |file|
|
44
|
-
File.basename(File.dirname(file))
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def register_path(register_name)
|
49
|
-
File.join(register_root_path, register_name)
|
50
|
-
end
|
51
|
-
|
52
|
-
def get_root_metadata
|
53
|
-
YAML.safe_load_file(register_root_yaml_path)
|
54
|
-
end
|
55
|
-
|
56
|
-
def registries(register_name = nil)
|
57
|
-
if register_name.nil?
|
58
|
-
register_names.reduce({}) do |acc, register_name|
|
59
|
-
acc[register_name] = registries(register_name)
|
60
|
-
acc
|
61
|
-
end
|
62
|
-
else
|
63
|
-
@registries[register_name] ||=
|
64
|
-
Paneron::Register::Register.new(register_root_path,
|
65
|
-
register_name)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def register_metadata_yaml(register_name)
|
70
|
-
registires(register_name).get_metadata_yaml
|
71
|
-
|
72
|
-
YAML.safe_load_file(
|
73
|
-
register_yaml_path(register_name),
|
74
|
-
permitted_classes: [Time],
|
75
|
-
)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|