paneron-register 0.2.0 → 0.3.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.
@@ -1,37 +1,123 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "yaml"
4
-
5
3
  module Paneron
6
4
  module Register
7
5
  module Raw
8
6
  class ItemClass
9
- attr_reader :data_set_path,
10
- :item_class_name, :item_class_path, :extension
7
+ include Writeable
8
+ include Validatable
9
+ include RootFinder
10
+
11
+ attr_reader :item_class_name, :extension
12
+
13
+ attr_accessor :data_set
11
14
 
12
15
  def initialize(
13
- data_set_path,
14
- item_class_name,
15
- extension = "yaml"
16
+ item_class_path = nil,
17
+ extension = "yaml",
18
+ data_set: nil
16
19
  )
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
20
+
21
+ unless item_class_path.nil?
22
+ data_set_path, item_class_name = Hierarchical.split_path(item_class_path)
23
+ end
24
+
25
+ # Deduce parent from self path,
26
+ # if only self path is specified.
27
+ @data_set = if data_set.nil?
28
+ Paneron::Register::Raw::DataSet.new(
29
+ data_set_path,
30
+ )
31
+ else
32
+ data_set
33
+ end
34
+
21
35
  @item_class_name = item_class_name
22
- @item_class_path = item_class_path
36
+ @old_name = @item_class_name
23
37
  @items_uuids = nil
24
38
  @items = {}
39
+ @extension = extension
40
+ end
41
+
42
+ def item_class_path
43
+ File.join(data_set_path, item_class_name)
44
+ end
45
+
46
+ def item_class_name=(new_item_class_name)
47
+ if new_item_class_name.nil? || new_item_class_name.empty?
48
+ raise Paneron::Register::Error, "Item class name cannot be empty"
49
+ end
50
+
51
+ unless new_item_class_name.is_a?(String)
52
+ raise Paneron::Register::Error, "Item class name must be a string"
53
+ end
54
+
55
+ @item_class_name = new_item_class_name
25
56
  end
26
57
 
27
- def self.validate_item_class_path(path)
58
+ def parent
59
+ data_set
60
+ end
61
+
62
+ def self.name
63
+ "Item class"
64
+ end
65
+
66
+ def save_sequence
67
+ # Save self
68
+ require "fileutils"
69
+
70
+ # Move old data set to new path
71
+ old_path = File.join(data_set_path, @old_name)
72
+ if File.directory?(old_path) && @old_name != item_class_name
73
+ FileUtils.mv(old_path, self_path)
74
+ @old_name = item_class_name
75
+ else
76
+ FileUtils.mkdir_p(self_path)
77
+ end
78
+
79
+ # Save items
80
+ item_uuids.each do |item_uuid|
81
+ items(item_uuid).save
82
+ end
83
+ end
84
+
85
+ def self_path
86
+ item_class_path
87
+ end
88
+
89
+ def is_valid?
90
+ data_set.valid?
91
+ end
92
+
93
+ def set_data_set(new_data_set)
94
+ @data_set = new_data_set
95
+ end
96
+
97
+ def data_set_path
98
+ data_set.data_set_path
99
+ end
100
+
101
+ def add_items(new_items)
102
+ new_items = [new_items] unless new_items.is_a?(Enumerable)
103
+ new_items.each do |item|
104
+ item.set_item_class(self)
105
+ @items[item.uuid] = item
106
+ end
107
+ end
108
+
109
+ def self.validate_path_before_saving
110
+ true
111
+ end
112
+
113
+ def self.validate_path(path)
28
114
  unless File.exist?(path)
29
115
  raise Paneron::Register::Error,
30
- "Item class path does not exist"
116
+ "Item class path (#{path}) does not exist"
31
117
  end
32
118
  unless File.directory?(path)
33
119
  raise Paneron::Register::Error,
34
- "Item class path is not a directory"
120
+ "Item class path (#{path}) is not a directory"
35
121
  end
36
122
  end
37
123
 
@@ -42,21 +128,52 @@ module Paneron
42
128
  )
43
129
  end
44
130
 
131
+ def add_item(*new_items)
132
+ new_items = [new_items] unless new_items.is_a?(Enumerable)
133
+ new_items.each do |item|
134
+ item.set_item_class(self)
135
+ @items[item.item_uuid] = item
136
+ end
137
+ end
138
+
139
+ def spawn_item(item_uuid = nil)
140
+ new_item = Paneron::Register::Raw::Item.new(
141
+ item_uuid,
142
+ item_class: self,
143
+ )
144
+
145
+ add_item(new_item)
146
+
147
+ new_item
148
+ end
149
+
45
150
  def item_uuids
46
- @item_uuids ||= Dir.glob(File.join(item_class_path, "*.#{extension}"))
47
- .map { |file| File.basename(file, ".#{extension}") }
151
+ if @items.empty?
152
+ Dir.glob(File.join(item_class_path, "*.#{extension}"))
153
+ .map { |file| File.basename(file, ".#{extension}") }.to_set
154
+ else
155
+ @items.keys
156
+ end
48
157
  end
49
158
 
50
- def items(uuid = nil)
159
+ def items(uuid = nil, refresh: false)
51
160
  if uuid.nil?
52
- item_uuids.reduce({}) do |acc, uuid|
53
- acc[uuid] = items(uuid)
54
- acc
55
- end
161
+ @items = if !refresh && !@items.empty?
162
+ @items
163
+ else
164
+ item_uuids.reduce({}) do |acc, uuid|
165
+ acc[uuid] = items(uuid)
166
+ acc
167
+ end
168
+ end
169
+ elsif refresh
170
+ items[uuid]
56
171
  else
57
172
  @items[uuid] ||=
58
173
  Paneron::Register::Raw::Item.new(
59
- item_class_path, uuid
174
+ uuid,
175
+ item_class_path,
176
+ item_class: self,
60
177
  )
61
178
  end
62
179
  end