poros 0.2.2 → 0.2.3
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/lib/poros/class_methods.rb +136 -134
- data/lib/poros/instance_methods.rb +20 -18
- data/lib/poros/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb33cb3edeb46a15e44bb915e71420a9c92ed99234ee52ab3d083b2e963b9807
|
4
|
+
data.tar.gz: 503c54369c8579a4a0d7fa41a2ae5bdb3cbdd59e8b4a4c999ad531d104858825
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02f0e7d5fbb462f9e4e29595c8d2e22fc775410b4b7782e1db43c787f078c4b8b07c61ebb2b57c4ea35215a4f1074faadc1bdbd297be29dd409f493c5a5bf31b
|
7
|
+
data.tar.gz: 95c434c7a70309d7bf2181dfbee83c9e0856969bff04051353b8b06c1c0391768e7802e3fe37457b712893b7950af959f75e7f0a75b1cfb866ccfc92fb256752
|
data/lib/poros/class_methods.rb
CHANGED
@@ -1,169 +1,171 @@
|
|
1
|
-
module Poros
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def poro_attrs
|
12
|
-
@poro_attrs ||= []
|
13
|
-
end
|
14
|
-
|
15
|
-
def poro_index(*attrs)
|
16
|
-
@poro_indexes ||= []
|
17
|
-
@poro_indexes += attrs
|
18
|
-
end
|
19
|
-
|
20
|
-
def poro_indexes
|
21
|
-
@poro_indexes ||= []
|
22
|
-
end
|
1
|
+
module Poros
|
2
|
+
module ClassMethods
|
3
|
+
attr_accessor :in_transaction, :data_changed
|
4
|
+
|
5
|
+
def poro_attr(*attrs)
|
6
|
+
@poro_attrs = [:uuid] | attrs
|
7
|
+
attrs.each { |column|
|
8
|
+
class_eval "attr_accessor :#{column}"
|
9
|
+
}
|
10
|
+
end
|
23
11
|
|
24
|
-
|
25
|
-
|
26
|
-
|
12
|
+
def poro_attrs
|
13
|
+
@poro_attrs ||= []
|
14
|
+
end
|
27
15
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
16
|
+
def poro_index(*attrs)
|
17
|
+
@poro_indexes ||= []
|
18
|
+
@poro_indexes += attrs
|
19
|
+
end
|
32
20
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
21
|
+
def poro_indexes
|
22
|
+
@poro_indexes ||= []
|
23
|
+
end
|
37
24
|
|
38
|
-
|
39
|
-
|
40
|
-
|
25
|
+
def find(uuid)
|
26
|
+
attrs = YAML.load(File.read(file_path(uuid)))
|
27
|
+
attrs.delete(:uuid)
|
41
28
|
|
42
|
-
|
43
|
-
|
44
|
-
|
29
|
+
object = new(attrs)
|
30
|
+
object.uuid = uuid
|
31
|
+
object
|
32
|
+
end
|
45
33
|
|
46
|
-
|
47
|
-
|
48
|
-
|
34
|
+
def file_path(uuid)
|
35
|
+
FileUtils.mkdir_p(data_directory) unless File.exist?(data_directory)
|
36
|
+
File.join(data_directory, file_name(uuid))
|
37
|
+
end
|
49
38
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
data = YAML.load(File.read(file))
|
54
|
-
find(data[:uuid])
|
55
|
-
}.compact
|
56
|
-
end
|
39
|
+
def data_directory
|
40
|
+
"./db/#{self}/"
|
41
|
+
end
|
57
42
|
|
58
|
-
|
59
|
-
|
43
|
+
def file_name(uuid)
|
44
|
+
"#{uuid}.yml"
|
45
|
+
end
|
60
46
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
index_data[key].keys.flat_map { |value_name|
|
65
|
-
index_data[key][value_name] if value =~ value_name
|
66
|
-
}.compact
|
67
|
-
when Array
|
68
|
-
value.flat_map { |value_name| index_data[key][value_name] }
|
69
|
-
when Proc
|
70
|
-
index_data[key].keys.flat_map { |value_name|
|
71
|
-
index_data[key][value_name] if value.call(value_name)
|
72
|
-
}.compact
|
73
|
-
else
|
74
|
-
index_data[key].has_key?(value) ?
|
75
|
-
index_data[key][value] : []
|
76
|
-
end
|
77
|
-
}.inject(:&)
|
47
|
+
def index_file
|
48
|
+
File.join(data_directory, "indexes.yml")
|
49
|
+
end
|
78
50
|
|
79
|
-
|
80
|
-
|
51
|
+
def all
|
52
|
+
Dir.glob(File.join(data_directory, '*.yml')).map { |file|
|
81
53
|
next if file == index_file
|
82
54
|
data = YAML.load(File.read(file))
|
83
|
-
data[:uuid]
|
84
|
-
case value
|
85
|
-
when Regexp
|
86
|
-
value =~ data[key]
|
87
|
-
when Array
|
88
|
-
value.include?(data[key])
|
89
|
-
when Proc
|
90
|
-
value.call(data[key])
|
91
|
-
else
|
92
|
-
data[key] == value
|
93
|
-
end
|
94
|
-
}
|
55
|
+
find(data[:uuid])
|
95
56
|
}.compact
|
96
57
|
end
|
97
58
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
59
|
+
def where(query)
|
60
|
+
indexed, table_scan = query.partition { |index, key| poro_indexes.include?(index) }
|
61
|
+
|
62
|
+
indexed_results = indexed.map { |key, value|
|
63
|
+
case value
|
64
|
+
when Regexp
|
65
|
+
index_data[key].keys.flat_map { |value_name|
|
66
|
+
index_data[key][value_name] if value =~ value_name
|
67
|
+
}.compact
|
68
|
+
when Array
|
69
|
+
value.flat_map { |value_name| index_data[key][value_name] }
|
70
|
+
when Proc
|
71
|
+
index_data[key].keys.flat_map { |value_name|
|
72
|
+
index_data[key][value_name] if value.call(value_name)
|
73
|
+
}.compact
|
74
|
+
else
|
75
|
+
index_data[key].has_key?(value) ?
|
76
|
+
index_data[key][value] : []
|
77
|
+
end
|
78
|
+
}.inject(:&)
|
79
|
+
|
80
|
+
if table_scan.size > 0
|
81
|
+
scanned_results = Dir.glob(File.join(data_directory, '*.yml')).map { |file|
|
82
|
+
next if file == index_file
|
83
|
+
data = YAML.load(File.read(file))
|
84
|
+
data[:uuid] if table_scan.all? { |key, value|
|
85
|
+
case value
|
86
|
+
when Regexp
|
87
|
+
value =~ data[key]
|
88
|
+
when Array
|
89
|
+
value.include?(data[key])
|
90
|
+
when Proc
|
91
|
+
value.call(data[key])
|
92
|
+
else
|
93
|
+
data[key] == value
|
94
|
+
end
|
95
|
+
}
|
96
|
+
}.compact
|
97
|
+
end
|
98
|
+
|
99
|
+
if indexed.size > 0 && table_scan.size > 0
|
100
|
+
results = indexed_results & scanned_results
|
101
|
+
elsif indexed.size > 0
|
102
|
+
results = indexed_results
|
103
|
+
else
|
104
|
+
results = scanned_results
|
105
|
+
end
|
106
|
+
|
107
|
+
results.map { |uuid| find(uuid) }
|
104
108
|
end
|
105
109
|
|
106
|
-
|
107
|
-
|
110
|
+
def index_data
|
111
|
+
return @index_data if @index_data
|
108
112
|
|
109
|
-
|
110
|
-
|
113
|
+
data = File.exist?(index_file) ? YAML.load(File.read(index_file)) : {}
|
114
|
+
# Make sure we always have every index as a key
|
115
|
+
poro_indexes.each do |index|
|
116
|
+
data[index] = {} unless data.has_key?(index)
|
117
|
+
end
|
111
118
|
|
112
|
-
|
113
|
-
# Make sure we always have every index as a key
|
114
|
-
poro_indexes.each do |index|
|
115
|
-
data[index] = {} unless data.has_key?(index)
|
119
|
+
@index_data = data
|
116
120
|
end
|
117
121
|
|
118
|
-
|
119
|
-
|
122
|
+
def write_index_data
|
123
|
+
File.write(index_file, @index_data.to_yaml)
|
124
|
+
end
|
120
125
|
|
121
|
-
|
122
|
-
|
123
|
-
end
|
126
|
+
def update_index(object)
|
127
|
+
remove_from_index(object, false)
|
124
128
|
|
125
|
-
|
126
|
-
remove_from_index(object, false)
|
129
|
+
index_data
|
127
130
|
|
128
|
-
|
131
|
+
poro_indexes.each do |index|
|
132
|
+
@index_data[index] = {} unless @index_data.has_key?(index)
|
133
|
+
value = object.send(index)
|
134
|
+
@index_data[index][value] ||= []
|
135
|
+
@index_data[index][value] = @index_data[index][value] | [object.uuid]
|
136
|
+
end
|
129
137
|
|
130
|
-
|
131
|
-
@index_data[index] = {} unless @index_data.has_key?(index)
|
132
|
-
value = object.send(index)
|
133
|
-
@index_data[index][value] ||= []
|
134
|
-
@index_data[index][value] = @index_data[index][value] | [object.uuid]
|
138
|
+
write_index_data unless @in_transaction
|
135
139
|
end
|
136
140
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
def remove_from_index(object, perist = true)
|
141
|
-
index_data
|
141
|
+
def remove_from_index(object, perist = true)
|
142
|
+
index_data
|
142
143
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
144
|
+
poro_indexes.each do |index|
|
145
|
+
@index_data[index] = {} unless @index_data.has_key?(index)
|
146
|
+
@index_data[index].keys.each do |value|
|
147
|
+
@index_data[index][value] ||= []
|
148
|
+
@index_data[index][value] -= [object.uuid]
|
149
|
+
end
|
148
150
|
end
|
151
|
+
write_index_data if !@in_transaction && perist
|
149
152
|
end
|
150
|
-
write_index_data if !@in_transaction && perist
|
151
|
-
end
|
152
153
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
154
|
+
def rebuild_indexes
|
155
|
+
transaction do
|
156
|
+
@data_changed = true
|
157
|
+
@index_data = {}
|
158
|
+
File.delete(index_file) if File.exist?(index_file)
|
159
|
+
all.each { |object| update_index(object) }
|
160
|
+
end
|
159
161
|
end
|
160
|
-
end
|
161
162
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
163
|
+
def transaction(&block)
|
164
|
+
@in_transaction = true
|
165
|
+
@data_changed = false
|
166
|
+
block.call
|
167
|
+
@in_transaction = false
|
168
|
+
write_index_data if @data_changed
|
169
|
+
end
|
168
170
|
end
|
169
171
|
end
|
@@ -1,25 +1,27 @@
|
|
1
1
|
require 'poros/info'
|
2
2
|
|
3
|
-
module Poros
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
module Poros
|
4
|
+
module InstanceMethods
|
5
|
+
attr_accessor :uuid
|
6
|
+
def uuid
|
7
|
+
@uuid ||= SecureRandom.uuid
|
8
|
+
end
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
def poros
|
11
|
+
@poros ||= Poros::Info.new(self)
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
def destroy
|
15
|
+
File.delete(poros.file_path)
|
16
|
+
self.class.remove_from_index(self)
|
17
|
+
self
|
18
|
+
end
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
def save
|
21
|
+
File.write(poros.file_path, poros.to_h.to_yaml)
|
22
|
+
self.class.data_changed = true
|
23
|
+
self.class.update_index(self)
|
24
|
+
self
|
25
|
+
end
|
24
26
|
end
|
25
27
|
end
|
data/lib/poros/version.rb
CHANGED