paneron-register 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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