jungle_path 0.0.8 → 0.0.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ad16b38744825b30f419a0bd7d76632c4d154e96
4
- data.tar.gz: 85a7e79b19b61445e5e2abf22efad6c8cfc7a1fa
3
+ metadata.gz: cf2e30fa1aa99e9ce5445d3edfa94e29930594b8
4
+ data.tar.gz: 58865df8e55ca302f53116c170dbcab565954667
5
5
  SHA512:
6
- metadata.gz: 7fe93d1512702eefbc31677ca36816c5ad016e53228795f60823e7bb32b94bd58fbf01d6a35893cad66ba600a194384a6fb04ee007b5cd5b5d60cdcddd441ab2
7
- data.tar.gz: 12a5fe71f762935bb7eaf584d88ea884a7e92b2fb93245b76d96bbdedf36f2758ff47e00723d4bfabe27e8fb11c77443490b315fc8be6978772547aef6fea2ad
6
+ metadata.gz: 227f6aa4a18ad64b32cf2195daad216079a02670a0749a62d8f6b8b2e85ae4fd8a17cf0ad2e182c8b6db5b0b9c713530b3d8085ec995dafb2d27dc9e47e07317
7
+ data.tar.gz: 3586ccaeda9320cc290131bd231a6e2b70c69e4a4f231cebc3e83128d64e2b8e451d82056e7467fb79337179de8ee87282b1989e09ae888f721f44c4bfa9d51d
@@ -0,0 +1,353 @@
1
+ require 'jungle_path/json'
2
+ require 'jungle_path/db_model'
3
+
4
+ module JunglePath
5
+ module DBModel
6
+ class Table
7
+ @models = {}
8
+ def self.set_columns
9
+ @columns = {}
10
+ @non_audit_columns = {}
11
+ @primary_key_columns = {}
12
+ @alternate_key_columns = {}
13
+ @foreign_key_columns = {}
14
+ @foreign_key_columns_by_table_name = {}
15
+ @references = Set.new
16
+ @secure_columns = {}
17
+ @unique_indexes = []
18
+ @indexes = []
19
+ @table_name = self.name.split('::').last.underscore.to_sym
20
+ @tagged_columns = {}
21
+ @sequence = 0
22
+ end
23
+
24
+ def self.columns
25
+ @columns
26
+ end
27
+
28
+ def self.columns_alphabetical_order
29
+ @columns.values.clone.sort { |a,b| a.name <=> b.name }
30
+ end
31
+
32
+ def self.columns_sequence_order
33
+ @columns.values.clone.sort { |a,b| a.sequence <=> b.sequence }
34
+ end
35
+
36
+ def self.non_audit_columns
37
+ @non_audit_columns
38
+ end
39
+
40
+ def self.primary_key_columns
41
+ @primary_key_columns
42
+ end
43
+
44
+ def self.alternate_key_columns
45
+ @alternate_key_columns
46
+ end
47
+
48
+ def self.foreign_key_columns
49
+ @foreign_key_columns
50
+ end
51
+
52
+ def self.foreign_key_columns_by_table_name
53
+ @foreign_key_columns_by_table_name
54
+ end
55
+
56
+ def self.tagged_columns
57
+ #call like: TableClass.tagged_columns[:my_tag] to return set of columns having given tag.
58
+ @tagged_columns
59
+ end
60
+
61
+ def self.references
62
+ @references
63
+ end
64
+
65
+ def self.has_reference_to?(table)
66
+ @references.member?(table.table_name)
67
+ end
68
+
69
+ def self.has_references?
70
+ !@references.empty?
71
+ end
72
+
73
+ def self.has_no_references?
74
+ !self.has_references?
75
+ end
76
+
77
+ def self.secure_columns
78
+ @secure_columns
79
+ end
80
+
81
+ def self.table_name
82
+ @table_name
83
+ end
84
+
85
+ def self.plural_table_name
86
+ "#{@table_name}s"
87
+ end
88
+
89
+ def self.description
90
+ @description
91
+ end
92
+
93
+ def self.description=(value)
94
+ @description = value
95
+ end
96
+
97
+ def self.is_view?
98
+ if @view_sql
99
+ true
100
+ else
101
+ false
102
+ end
103
+ end
104
+
105
+ def self.view_sql
106
+ @view_sql
107
+ end
108
+
109
+ def self.view_sql=(value)
110
+ @view_sql = value
111
+ end
112
+
113
+ def self.view_references
114
+ if @view_references
115
+ @view_references
116
+ else
117
+ references
118
+ end
119
+ end
120
+
121
+ def self.view_references=(array_of_table_names)
122
+ @view_references = Set.new(array_of_table_names)
123
+ end
124
+
125
+ def self.has_view_reference_to?(table)
126
+ if @view_references
127
+ @view_references.member?(table.table_name)
128
+ else
129
+ has_reference_to?(table)
130
+ end
131
+ end
132
+
133
+ def self.has_view_references?
134
+ if @view_references
135
+ !@view_references.empty?
136
+ else
137
+ has_references?
138
+ end
139
+ end
140
+
141
+ def self.has_no_view_references?
142
+ !self.has_view_references?
143
+ end
144
+
145
+ def self.inherited(sub_class)
146
+ sub_class.set_columns #setup subclass with particular class instance vars.
147
+ @models[sub_class.table_name] = sub_class #keep a list of all subclasses.
148
+ end
149
+
150
+ def self.models
151
+ @models
152
+ end
153
+
154
+ def self.models_alphabetical_order
155
+ @models.values.clone.sort { |a,b| a.table_name <=> b.table_name }
156
+ end
157
+
158
+ def self.models_dependent_order
159
+ result = self.model_sort(@models.values.clone)
160
+ # map array of table names into an array of table (model) classes.
161
+ result.map {|key| @models[key]}
162
+ end
163
+
164
+ def self.model_sort(list, result=Set.new, level=0)
165
+ # return array of table names sorted in dependency order (not alphabetical order).
166
+ #puts "level: #{level}."
167
+ remaining = []
168
+ list.each do |value|
169
+ #puts "\tvalue: #{value.table_name}. references: #{value.references.to_a}."
170
+ if value.has_no_view_references?
171
+ #puts "\tadding: #{value.table_name}."
172
+ result << value.table_name
173
+ elsif value.view_references.subset? result
174
+ #puts "\tadding: #{value.table_name}."
175
+ result << value.table_name
176
+ else
177
+ remaining << value
178
+ end
179
+ end
180
+ #puts "\tresult: #{result.length}: #{result.to_a}."
181
+ #puts "\tremaining: #{remaining.length}: #{remaining}."
182
+ return [] if level > 10 #something is wrong!!!
183
+ result = self.model_sort(remaining, result, level + 1) if remaining.length > 0
184
+ result
185
+ end
186
+
187
+ def self.define(*column_defs)
188
+ set_columns
189
+
190
+ column_defs.each do |column_def|
191
+ # one column_def may produce multiple actual columns:
192
+ columns = Column.get_column_def_columns(column_def, @sequence)
193
+ columns.each do |column|
194
+ @sequence = column.sequence + 1
195
+ self.columns[column.name] = column
196
+ self.primary_key_columns[column.name] = column if column.primary_key?
197
+ self.alternate_key_columns[column.name] = column if column.alternate_key?
198
+ self.foreign_key_columns[column.name] = column if column.foreign_key?
199
+
200
+ if column.foreign_key?
201
+ hash = self.foreign_key_columns_by_table_name
202
+ sub_hash = hash[column.foreign_key_table_name]
203
+ sub_hash = {} unless sub_hash
204
+ sub_hash[column.name] = column
205
+ hash[column.foreign_key_table_name] = sub_hash
206
+ end
207
+
208
+ if column.tags
209
+ column.tags.each do |tag|
210
+ tagged_columns = @tagged_columns[tag] || Set.new
211
+ tagged_columns.add(column)
212
+ @tagged_columns[tag] = tagged_columns
213
+ end
214
+ end
215
+
216
+ self.references << column.foreign_key_table_name if column.foreign_key? and column.foreign_key_table_name != self.table_name
217
+ self.secure_columns[column.name] = column if column.secure?
218
+ self.non_audit_columns[column.name] = column unless column.is_audit_column?
219
+ #attr_accessor column.name
220
+ define_method(column.name) do
221
+ @values[column.name]
222
+ end
223
+ define_method("#{column.name}=") do |value|
224
+ if value != @values[column.name]
225
+ @values[column.name] = value
226
+ @modified.add(column.name)
227
+ end
228
+ end
229
+ end
230
+ self.primary_key_columns.values[0].calculated = true if self.primary_key_columns.length == 1
231
+ end
232
+
233
+ define_method("_values") do
234
+ @values
235
+ end
236
+
237
+ define_method("_modified") do
238
+ @modified
239
+ end
240
+
241
+ define_method("_modified_hash") do
242
+ hash = {}
243
+ @modified.each do |key|
244
+ hash[key] = @values[key]
245
+ end
246
+ hash
247
+ end
248
+
249
+ define_method("_has_value_hash") do
250
+ hash = {}
251
+ @values.each do |key, value|
252
+ hash[key] = value unless value == nil
253
+ end
254
+ hash
255
+ end
256
+
257
+ define_method("_primary_key") do
258
+ primary_key = {}
259
+ _primary_key_columns.keys.each do |key|
260
+ primary_key[key] = @values[key]
261
+ end
262
+ primary_key
263
+ end
264
+
265
+ define_method("_alternate_key") do
266
+ alternate_key = {}
267
+ _alternate_key_columns.keys.each do |key|
268
+ alternate_key[key] = @values[key]
269
+ end
270
+ alternate_key
271
+ end
272
+
273
+ define_method("_consume_hash") do |hash, mark_as_modified_if_changed=true|
274
+ @values.each do |key, value|
275
+ if hash.has_key?(key) and @values[key] != hash[key]
276
+ @values[key] = hash[key]
277
+ @modified.add(key) if mark_as_modified_if_changed
278
+ end
279
+ end
280
+ end
281
+
282
+ define_method("_columns") do
283
+ self.class.columns
284
+ end
285
+
286
+ define_method("_primary_key_columns") do
287
+ self.class.primary_key_columns
288
+ end
289
+
290
+ define_method("_alternate_key_columns") do
291
+ self.class.alternate_key_columns
292
+ end
293
+
294
+ define_method("_foreign_key_columns") do
295
+ self.class.foreign_key_columns
296
+ end
297
+
298
+ define_method("_secure_columns") do
299
+ self.class.secure_columns
300
+ end
301
+
302
+ define_method("_tagged_columns") do
303
+ self.class.tagged_columns
304
+ end
305
+
306
+ define_method("_table_name") do
307
+ self.class.table_name
308
+ end
309
+
310
+ define_method("_secure?") do
311
+ @secure
312
+ end
313
+
314
+ define_method("_secure=") do |value|
315
+ @secure = value
316
+ end
317
+
318
+ define_method("to_hash") do
319
+ #puts "#{_table_name} to_hash."
320
+ return @values.clone if _secure_columns.length == 0 or !_secure?
321
+ hash = {}
322
+ puts "stripping secure columns!"
323
+ @values.each do |key, value|
324
+ hash[key] = value unless _secure_columns.has_key?(key)
325
+ end
326
+ hash
327
+ end
328
+
329
+ define_method("to_h") do
330
+ # ruby way :)
331
+ to_hash
332
+ end
333
+
334
+ define_method("to_json") do |arg=nil|
335
+ #puts "#{_table_name} to_json."
336
+ #puts "to_json - arg: #{arg.class}" if arg
337
+ json = JsonWrap.dump self
338
+ #puts json
339
+ json
340
+ end
341
+ end
342
+
343
+ def initialize(hash=nil, mark_as_modified_if_changed=true, transform_params=false)
344
+ @values = {}
345
+ @secure = true
346
+ _columns.keys.each do |key| @values[key] = nil end
347
+ @modified = Set.new # holds hash keys of modified values.
348
+ hash = DBModel::Params.transform(hash, _columns) if transform_params
349
+ _consume_hash(hash, mark_as_modified_if_changed) if hash
350
+ end
351
+ end
352
+ end
353
+ end
@@ -56,8 +56,8 @@ module JunglePath
56
56
  name = column.name.to_s[0..-4].to_sym # cut off "..._id" from column name and use as node name.
57
57
  symbol = "->"
58
58
  child_table_name = column.foreign_key_table_name
59
- puts "tables_hash: #{tables_hash}"
60
- puts "column.foreign_key_table_name: #{column.foreign_key_table_name}"
59
+ #puts "tables_hash: #{tables_hash}"
60
+ #puts "column.foreign_key_table_name: #{column.foreign_key_table_name}"
61
61
  child_table_join_column_name = tables_hash[column.foreign_key_table_name].primary_key_columns.first[0]
62
62
  parent_table_join_column_name = column.name
63
63
  else
@@ -1,3 +1,3 @@
1
1
  module JunglePath
2
- VERSION = '0.0.8'
2
+ VERSION = '0.0.9'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jungle_path
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael VanZant
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-04-28 00:00:00.000000000 Z
11
+ date: 2017-05-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -140,6 +140,7 @@ files:
140
140
  - lib/jungle_path/db_model/schema.rb
141
141
  - lib/jungle_path/db_model/string.rb
142
142
  - lib/jungle_path/db_model/table.rb
143
+ - lib/jungle_path/db_model/temp.rb
143
144
  - lib/jungle_path/exceptions.rb
144
145
  - lib/jungle_path/file.rb
145
146
  - lib/jungle_path/file/file.rb