jungle_path 0.0.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 +7 -0
- data/.gitignore +21 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +22 -0
- data/README.md +5 -0
- data/jungle_path.gemspec +43 -0
- data/lib/jungle_path/api/helpers/auth.rb +45 -0
- data/lib/jungle_path/api/helpers/auth_local_user.rb +284 -0
- data/lib/jungle_path/api/helpers/auth_old.rb +232 -0
- data/lib/jungle_path/api/helpers/data_cache.rb +20 -0
- data/lib/jungle_path/api/helpers/defaults.rb +83 -0
- data/lib/jungle_path/api/helpers/logging.rb +36 -0
- data/lib/jungle_path/api/helpers/query_filters.rb +15 -0
- data/lib/jungle_path/api/helpers/rescues.rb +15 -0
- data/lib/jungle_path/api/helpers/result.rb +16 -0
- data/lib/jungle_path/api/helpers/standard_apis.rb +280 -0
- data/lib/jungle_path/api/helpers.rb +16 -0
- data/lib/jungle_path/api/template.erb +35 -0
- data/lib/jungle_path/api.rb +5 -0
- data/lib/jungle_path/app/a.gitignore +1 -0
- data/lib/jungle_path/app/api/server_base.rb +95 -0
- data/lib/jungle_path/app/api/server_custom.rb +121 -0
- data/lib/jungle_path/app/api/server_gen.rb +11 -0
- data/lib/jungle_path/app/auth/authorization.rb +96 -0
- data/lib/jungle_path/app/config/a.gitignore +1 -0
- data/lib/jungle_path/app/config/config.rb +240 -0
- data/lib/jungle_path/app/config/override.rb +3 -0
- data/lib/jungle_path/app/config.ru +28 -0
- data/lib/jungle_path/app/logs/log_files_go_here +0 -0
- data/lib/jungle_path/app/run.sh +4 -0
- data/lib/jungle_path/app/schemas/schema.rb +21 -0
- data/lib/jungle_path/app/schemas/schema_all_in_one.rb +181 -0
- data/lib/jungle_path/app.rb +8 -0
- data/lib/jungle_path/authentication/auth_provider/default.rb +83 -0
- data/lib/jungle_path/authentication/auth_provider.rb +7 -0
- data/lib/jungle_path/authentication/data_provider/default.rb +144 -0
- data/lib/jungle_path/authentication/data_provider.rb +7 -0
- data/lib/jungle_path/authentication/helpers.rb +19 -0
- data/lib/jungle_path/authentication/identity.rb +30 -0
- data/lib/jungle_path/authentication/password_hash.rb +124 -0
- data/lib/jungle_path/authentication.rb +9 -0
- data/lib/jungle_path/authorization/filter.rb +106 -0
- data/lib/jungle_path/authorization/paths.rb +71 -0
- data/lib/jungle_path/authorization.rb +5 -0
- data/lib/jungle_path/cache.rb +36 -0
- data/lib/jungle_path/config.rb +65 -0
- data/lib/jungle_path/controller/authentication.rb +129 -0
- data/lib/jungle_path/controller/base.rb +193 -0
- data/lib/jungle_path/controller/helpers.rb +47 -0
- data/lib/jungle_path/controller/template.erb +14 -0
- data/lib/jungle_path/controller.rb +7 -0
- data/lib/jungle_path/db_access/import/db_dir.rb +74 -0
- data/lib/jungle_path/db_access/import/delete.rb +30 -0
- data/lib/jungle_path/db_access/import/insert.rb +168 -0
- data/lib/jungle_path/db_access/import/schema.rb +34 -0
- data/lib/jungle_path/db_access/import/select.rb +68 -0
- data/lib/jungle_path/db_access/import.rb +15 -0
- data/lib/jungle_path/db_access/io/chunked_file_reader.rb +62 -0
- data/lib/jungle_path/db_access/io/config.rb +19 -0
- data/lib/jungle_path/db_access/io/copy.rb +73 -0
- data/lib/jungle_path/db_access/io/db.rb +82 -0
- data/lib/jungle_path/db_access/io/delete.rb +23 -0
- data/lib/jungle_path/db_access/io/init_db.rb +39 -0
- data/lib/jungle_path/db_access/io/insert.rb +24 -0
- data/lib/jungle_path/db_access/io/schema.rb +21 -0
- data/lib/jungle_path/db_access/io/select.rb +44 -0
- data/lib/jungle_path/db_access/io/update.rb +36 -0
- data/lib/jungle_path/db_access/io.rb +104 -0
- data/lib/jungle_path/db_model/column.rb +186 -0
- data/lib/jungle_path/db_model/params.rb +60 -0
- data/lib/jungle_path/db_model/schema.rb +100 -0
- data/lib/jungle_path/db_model/string.rb +9 -0
- data/lib/jungle_path/db_model/table.rb +307 -0
- data/lib/jungle_path/db_model.rb +34 -0
- data/lib/jungle_path/exceptions.rb +10 -0
- data/lib/jungle_path/gen/api.rb +52 -0
- data/lib/jungle_path/gen/controller.rb +0 -0
- data/lib/jungle_path/gen/db.rb +0 -0
- data/lib/jungle_path/gen/schema.rb +47 -0
- data/lib/jungle_path/gen/schema_tree/filter.rb +33 -0
- data/lib/jungle_path/gen/schema_tree/match_columns.rb +54 -0
- data/lib/jungle_path/gen/schema_tree/match_table_data.rb +22 -0
- data/lib/jungle_path/gen/schema_tree/match_tables.rb +70 -0
- data/lib/jungle_path/gen/schema_tree/node.rb +39 -0
- data/lib/jungle_path/gen/schema_tree.rb +105 -0
- data/lib/jungle_path/gen.rb +9 -0
- data/lib/jungle_path/json/base.rb +29 -0
- data/lib/jungle_path/json/time.rb +8 -0
- data/lib/jungle_path/json.rb +6 -0
- data/lib/jungle_path/logging.rb +23 -0
- data/lib/jungle_path/query/alias_info.rb +16 -0
- data/lib/jungle_path/query/engine.rb +878 -0
- data/lib/jungle_path/query/entity.rb +141 -0
- data/lib/jungle_path/query/field.rb +28 -0
- data/lib/jungle_path/query/field_primary_key.rb +27 -0
- data/lib/jungle_path/query/filter.rb +34 -0
- data/lib/jungle_path/query/float_value.rb +16 -0
- data/lib/jungle_path/query/from.rb +33 -0
- data/lib/jungle_path/query/int_value.rb +16 -0
- data/lib/jungle_path/query/limit.rb +19 -0
- data/lib/jungle_path/query/nested_hash_sorter.rb +94 -0
- data/lib/jungle_path/query/operator.rb +17 -0
- data/lib/jungle_path/query/query.rb +23 -0
- data/lib/jungle_path/query/sort_field.rb +34 -0
- data/lib/jungle_path/query/sql_string.rb +145 -0
- data/lib/jungle_path/query/string_value.rb +16 -0
- data/lib/jungle_path/query.rb +19 -0
- data/lib/jungle_path/rack/basic_credentials.rb +70 -0
- data/lib/jungle_path/rack/json_body_parser.rb +41 -0
- data/lib/jungle_path/rack.rb +6 -0
- data/lib/jungle_path/schema/auth.rb +83 -0
- data/lib/jungle_path/schema/base.rb +6 -0
- data/lib/jungle_path/schema/db.rb +10 -0
- data/lib/jungle_path/schema/version.rb +19 -0
- data/lib/jungle_path/schema.rb +8 -0
- data/lib/jungle_path/sql/auth_local_user.rb +5 -0
- data/lib/jungle_path/sql/general.rb +10 -0
- data/lib/jungle_path/sql/helpers.rb +11 -0
- data/lib/jungle_path/sql/key.rb +107 -0
- data/lib/jungle_path/sql/query_filter.rb +5 -0
- data/lib/jungle_path/sql/role.rb +5 -0
- data/lib/jungle_path/sql/user.rb +35 -0
- data/lib/jungle_path/sql/user_role.rb +5 -0
- data/lib/jungle_path/sql.rb +12 -0
- data/lib/jungle_path.rb +13 -0
- data/test.rb +33 -0
- data/test2.rb +15 -0
- metadata +200 -0
@@ -0,0 +1,307 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'jungle_path/json'
|
3
|
+
require 'jungle_path/db_model'
|
4
|
+
|
5
|
+
module JunglePath
|
6
|
+
module DBModel
|
7
|
+
class Table
|
8
|
+
@models = {}
|
9
|
+
def self.set_columns
|
10
|
+
@columns = {}
|
11
|
+
@non_audit_columns = {}
|
12
|
+
@primary_key_columns = {}
|
13
|
+
@alternate_key_columns = {}
|
14
|
+
@foreign_key_columns = {}
|
15
|
+
@foreign_key_columns_by_table_name = {}
|
16
|
+
@references = Set.new
|
17
|
+
@secure_columns = {}
|
18
|
+
@unique_indexes = []
|
19
|
+
@indexes = []
|
20
|
+
@table_name = self.name.split('::').last.underscore.to_sym
|
21
|
+
@tagged_columns = {}
|
22
|
+
@sequence = 0
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.columns
|
26
|
+
@columns
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.columns_alphabetical_order
|
30
|
+
@columns.values.clone.sort { |a,b| a.name <=> b.name }
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.columns_sequence_order
|
34
|
+
@columns.values.clone.sort { |a,b| a.sequence <=> b.sequence }
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.non_audit_columns
|
38
|
+
@non_audit_columns
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.primary_key_columns
|
42
|
+
@primary_key_columns
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.alternate_key_columns
|
46
|
+
@alternate_key_columns
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.foreign_key_columns
|
50
|
+
@foreign_key_columns
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.foreign_key_columns_by_table_name
|
54
|
+
@foreign_key_columns_by_table_name
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.tagged_columns
|
58
|
+
#call like: TableClass.tagged_columns[:my_tag] to return set of columns having given tag.
|
59
|
+
@tagged_columns
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.references
|
63
|
+
@references
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.has_reference_to?(table)
|
67
|
+
@references.member?(table.table_name)
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.has_references?
|
71
|
+
!@references.empty?
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.has_no_references?
|
75
|
+
!self.has_references?
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.secure_columns
|
79
|
+
@secure_columns
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.table_name
|
83
|
+
@table_name
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.plural_table_name
|
87
|
+
"#{@table_name}s"
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.description
|
91
|
+
@description
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.description=(value)
|
95
|
+
@description = value
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.inherited(sub_class)
|
99
|
+
sub_class.set_columns #setup subclass with particular class instance vars.
|
100
|
+
@models = {} unless @models
|
101
|
+
@models[sub_class.table_name] = sub_class #keep a list of all subclasses.
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.models
|
105
|
+
@models
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.models_alphabetical_order
|
109
|
+
@models.values.clone.sort { |a,b| a.table_name <=> b.table_name }
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.models_dependent_order
|
113
|
+
result = self.model_sort(@models.values.clone)
|
114
|
+
# map array of table names into an array of table (model) classes.
|
115
|
+
result.map {|key| @models[key]}
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.model_sort(list, result=Set.new, level=0)
|
119
|
+
# return array of table names sorted in dependency order (not alphabetical order).
|
120
|
+
puts "level: #{level}."
|
121
|
+
remaining = []
|
122
|
+
list.each do |value|
|
123
|
+
puts "\tvalue: #{value.table_name}. references: #{value.references.to_a}."
|
124
|
+
if value.has_no_references?
|
125
|
+
puts "\tadding: #{value.table_name}."
|
126
|
+
result << value.table_name
|
127
|
+
elsif value.references.subset? result
|
128
|
+
puts "\tadding: #{value.table_name}."
|
129
|
+
result << value.table_name
|
130
|
+
else
|
131
|
+
remaining << value
|
132
|
+
end
|
133
|
+
end
|
134
|
+
puts "\tresult: #{result.length}: #{result.to_a}."
|
135
|
+
puts "\tremaining: #{remaining.length}: #{remaining}."
|
136
|
+
return [] if level > 10 #something is wrong!!!
|
137
|
+
result = self.model_sort(remaining, result, level + 1) if remaining.length > 0
|
138
|
+
result
|
139
|
+
end
|
140
|
+
|
141
|
+
def self.define(*column_defs)
|
142
|
+
set_columns
|
143
|
+
|
144
|
+
column_defs.each do |column_def|
|
145
|
+
# one column_def may produce multiple actual columns:
|
146
|
+
columns = Column.get_column_def_columns(column_def, @sequence)
|
147
|
+
columns.each do |column|
|
148
|
+
@sequence = column.sequence + 1
|
149
|
+
self.columns[column.name] = column
|
150
|
+
self.primary_key_columns[column.name] = column if column.primary_key?
|
151
|
+
self.alternate_key_columns[column.name] = column if column.alternate_key?
|
152
|
+
self.foreign_key_columns[column.name] = column if column.foreign_key?
|
153
|
+
|
154
|
+
if column.foreign_key?
|
155
|
+
hash = self.foreign_key_columns_by_table_name
|
156
|
+
sub_hash = hash[column.foreign_key_table_name]
|
157
|
+
sub_hash = {} unless sub_hash
|
158
|
+
sub_hash[column.name] = column
|
159
|
+
hash[column.foreign_key_table_name] = sub_hash
|
160
|
+
end
|
161
|
+
|
162
|
+
if column.tags
|
163
|
+
column.tags.each do |tag|
|
164
|
+
tagged_columns = @tagged_columns[tag] || Set.new
|
165
|
+
tagged_columns.add(column)
|
166
|
+
@tagged_columns[tag] = tagged_columns
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
self.references << column.foreign_key_table_name if column.foreign_key? and column.foreign_key_table_name != self.table_name
|
171
|
+
self.secure_columns[column.name] = column if column.secure?
|
172
|
+
self.non_audit_columns[column.name] = column unless column.is_audit_column?
|
173
|
+
#attr_accessor column.name
|
174
|
+
define_method(column.name) do
|
175
|
+
@values[column.name]
|
176
|
+
end
|
177
|
+
define_method("#{column.name}=") do |value|
|
178
|
+
if value != @values[column.name]
|
179
|
+
@values[column.name] = value
|
180
|
+
@modified.add(column.name)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
self.primary_key_columns.values[0].calculated = true if self.primary_key_columns.length == 1
|
185
|
+
end
|
186
|
+
|
187
|
+
define_method("_values") do
|
188
|
+
@values
|
189
|
+
end
|
190
|
+
|
191
|
+
define_method("_modified") do
|
192
|
+
@modified
|
193
|
+
end
|
194
|
+
|
195
|
+
define_method("_modified_hash") do
|
196
|
+
hash = {}
|
197
|
+
@modified.each do |key|
|
198
|
+
hash[key] = @values[key]
|
199
|
+
end
|
200
|
+
hash
|
201
|
+
end
|
202
|
+
|
203
|
+
define_method("_has_value_hash") do
|
204
|
+
hash = {}
|
205
|
+
@values.each do |key, value|
|
206
|
+
hash[key] = value unless value == nil
|
207
|
+
end
|
208
|
+
hash
|
209
|
+
end
|
210
|
+
|
211
|
+
define_method("_primary_key") do
|
212
|
+
primary_key = {}
|
213
|
+
_primary_key_columns.keys.each do |key|
|
214
|
+
primary_key[key] = @values[key]
|
215
|
+
end
|
216
|
+
primary_key
|
217
|
+
end
|
218
|
+
|
219
|
+
define_method("_alternate_key") do
|
220
|
+
alternate_key = {}
|
221
|
+
_alternate_key_columns.keys.each do |key|
|
222
|
+
alternate_key[key] = @values[key]
|
223
|
+
end
|
224
|
+
alternate_key
|
225
|
+
end
|
226
|
+
|
227
|
+
define_method("_consume_hash") do |hash, mark_as_modified_if_changed=true|
|
228
|
+
@values.each do |key, value|
|
229
|
+
if hash.has_key?(key) and @values[key] != hash[key]
|
230
|
+
@values[key] = hash[key]
|
231
|
+
@modified.add(key) if mark_as_modified_if_changed
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
define_method("_columns") do
|
237
|
+
self.class.columns
|
238
|
+
end
|
239
|
+
|
240
|
+
define_method("_primary_key_columns") do
|
241
|
+
self.class.primary_key_columns
|
242
|
+
end
|
243
|
+
|
244
|
+
define_method("_alternate_key_columns") do
|
245
|
+
self.class.alternate_key_columns
|
246
|
+
end
|
247
|
+
|
248
|
+
define_method("_foreign_key_columns") do
|
249
|
+
self.class.foreign_key_columns
|
250
|
+
end
|
251
|
+
|
252
|
+
define_method("_secure_columns") do
|
253
|
+
self.class.secure_columns
|
254
|
+
end
|
255
|
+
|
256
|
+
define_method("_tagged_columns") do
|
257
|
+
self.class.tagged_columns
|
258
|
+
end
|
259
|
+
|
260
|
+
define_method("_table_name") do
|
261
|
+
self.class.table_name
|
262
|
+
end
|
263
|
+
|
264
|
+
define_method("_secure?") do
|
265
|
+
@secure
|
266
|
+
end
|
267
|
+
|
268
|
+
define_method("_secure=") do |value|
|
269
|
+
@secure = value
|
270
|
+
end
|
271
|
+
|
272
|
+
define_method("to_hash") do
|
273
|
+
#puts "#{_table_name} to_hash."
|
274
|
+
return @values.clone if _secure_columns.length == 0 or !_secure?
|
275
|
+
hash = {}
|
276
|
+
puts "stripping secure columns!"
|
277
|
+
@values.each do |key, value|
|
278
|
+
hash[key] = value unless _secure_columns.has_key?(key)
|
279
|
+
end
|
280
|
+
hash
|
281
|
+
end
|
282
|
+
|
283
|
+
define_method("to_h") do
|
284
|
+
# ruby way :)
|
285
|
+
to_hash
|
286
|
+
end
|
287
|
+
|
288
|
+
define_method("to_json") do |arg=nil|
|
289
|
+
#puts "#{_table_name} to_json."
|
290
|
+
#puts "to_json - arg: #{arg.class}" if arg
|
291
|
+
json = JsonWrap.dump self
|
292
|
+
#puts json
|
293
|
+
json
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
def initialize(hash=nil, mark_as_modified_if_changed=true, transform_params=false)
|
298
|
+
@values = {}
|
299
|
+
@secure = true
|
300
|
+
_columns.keys.each do |key| @values[key] = nil end
|
301
|
+
@modified = Set.new # holds hash keys of modified values.
|
302
|
+
hash = DBModel::Params.transform(hash, _columns) if transform_params
|
303
|
+
_consume_hash(hash, mark_as_modified_if_changed) if hash
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# db_model.rb
|
2
|
+
# db_model
|
3
|
+
# Create ruby classes (models) based on database table definitions.
|
4
|
+
# Schema class (using the Sequel gem) can generate database tables from your models.
|
5
|
+
#
|
6
|
+
# Example from gbwho app's schema.rb file:
|
7
|
+
#
|
8
|
+
# require_relative '../lib/db_model'
|
9
|
+
#
|
10
|
+
# module Schema
|
11
|
+
# class User < DBModel::Table
|
12
|
+
# define(
|
13
|
+
# [:id, :primary_key],
|
14
|
+
# [:user_name, :string, :unique, :not_null, :alternate_key],
|
15
|
+
# [:hash, :string, :not_null, :secure, :calculated, :desc, "See password_hash.rb for details."],
|
16
|
+
# [:name, :string, :not_null, :desc, "Your human name! :)"],
|
17
|
+
# [:email, :string, :not_null],
|
18
|
+
# [:audit])
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
|
22
|
+
require 'set'
|
23
|
+
#require_relative 'json_wrap'
|
24
|
+
require 'jungle_path/json'
|
25
|
+
|
26
|
+
module JunglePath
|
27
|
+
module DBModel
|
28
|
+
require 'jungle_path/db_model/string'
|
29
|
+
require 'jungle_path/db_model/column'
|
30
|
+
require 'jungle_path/db_model/table'
|
31
|
+
require 'jungle_path/db_model/schema'
|
32
|
+
require 'jungle_path/db_model/params'
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module JunglePath
|
2
|
+
module Exceptions
|
3
|
+
# Exception classes:
|
4
|
+
class InvalidAPIKeyException < RuntimeError; end
|
5
|
+
class InvalidPassword < RuntimeError; end
|
6
|
+
class MissingRequiredFields < RuntimeError; end
|
7
|
+
class NotFoundException < RuntimeError; end
|
8
|
+
class TestException < RuntimeError; end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'jungle_path/db_model/table'
|
3
|
+
|
4
|
+
module JunglePath
|
5
|
+
module DBModel
|
6
|
+
class Table
|
7
|
+
# Adds useful methods to Table class for use when generating API and Model code:
|
8
|
+
|
9
|
+
def self.template_new
|
10
|
+
"#{self.name}.new"
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.template_pk_url
|
14
|
+
pk = self.primary_key_columns.keys.map {|key| "/:#{key}"}
|
15
|
+
pk.join
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.template_model_name
|
19
|
+
"Model::#{self.name.split('::').last}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.template_params_pk_hash
|
23
|
+
#{id: p[:id]}
|
24
|
+
array = []
|
25
|
+
self.primary_key_columns.keys.each do |key|
|
26
|
+
array << "#{key}: p[:#{key}]"
|
27
|
+
end
|
28
|
+
"{#{array.join(',')}}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
module JunglePath
|
35
|
+
module Gen
|
36
|
+
def self.api(app_root_path, tables, output_file='./api/api_gen.rb', name_space='ServerAPI', controller_name_space='Controller', template_file=nil)
|
37
|
+
if template_file
|
38
|
+
template_file = ::File.expand_path(template_file, app_root_path)
|
39
|
+
else
|
40
|
+
template_file = ::File.expand_path('./api_template.erb', ::File.dirname(__FILE__))
|
41
|
+
end
|
42
|
+
|
43
|
+
# template uses name_space and controller_name_space vars:``
|
44
|
+
template = ERB.new(File.read(template_file))
|
45
|
+
|
46
|
+
output_file = ::File.expand_path(output_file, app_root_path)
|
47
|
+
result = template.result(binding)
|
48
|
+
#puts result
|
49
|
+
File.write(output_file, result)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# gen_schema.rb -- creates a database schema from a set of DBModel::Table (sub)classes.
|
2
|
+
require 'logger'
|
3
|
+
require 'sequel'
|
4
|
+
require 'jungle_path/db_model'
|
5
|
+
require 'jungle_path/db_access'
|
6
|
+
|
7
|
+
# todo: fix ! vs "" vs ? method calls...
|
8
|
+
module JunglePath
|
9
|
+
module Gen
|
10
|
+
module Schema
|
11
|
+
def self.create(table_subclasses, db_config, logger=$stdout)
|
12
|
+
puts "Gen::Schema.create..."
|
13
|
+
db = JunglePath::DBAccess.connection_from_config(db_config)
|
14
|
+
db.loggers << Logger.new(logger)
|
15
|
+
schema = JunglePath::DBModel::Schema.new(db)
|
16
|
+
table_subclasses.each do |table|
|
17
|
+
puts "create table: #{table.table_name}"
|
18
|
+
schema.create_table table
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.set_version schema_info_class, db_config, schema_initial_version
|
23
|
+
# set starting version numnber
|
24
|
+
db = JunglePath::DBAccess::DB.new(db_config)
|
25
|
+
db.schema.create_table schema_info_class
|
26
|
+
if schema_initial_version
|
27
|
+
schema_info = schema_info_class.new({version: schema_initial_version})
|
28
|
+
db.insert._model(schema_info)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.set_version_to_latest schema_info_class, db_config, migrations_path
|
33
|
+
version = 0
|
34
|
+
migration_files = Dir.glob(File.join(migrations_path, "*.rb"))
|
35
|
+
migration_files.each do |file_name|
|
36
|
+
puts file_name
|
37
|
+
parts = File.basename(file_name).split('_')
|
38
|
+
if parts.length > 0
|
39
|
+
value = parts[0].to_i
|
40
|
+
version = value if value > version
|
41
|
+
end
|
42
|
+
end
|
43
|
+
set_version schema_info_class, db_config, version
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module JunglePath
|
2
|
+
module Gen
|
3
|
+
module SchemaTree
|
4
|
+
class Filter
|
5
|
+
def initialize hash=nil
|
6
|
+
throw "Invalid data parameter: expected a hash, but got this: #{hash}" unless hash.class == Hash or hash == nil
|
7
|
+
allow = hash[:allow] if hash
|
8
|
+
deny = hash[:deny] if hash
|
9
|
+
@match_tables_allow = MatchTables.new allow
|
10
|
+
@match_tables_deny = MatchTables.new deny
|
11
|
+
end
|
12
|
+
def allow? table_name, column_name=nil
|
13
|
+
if @match_tables_allow.matched?(table_name, column_name)
|
14
|
+
if column_name and @match_tables_deny.matched?(table_name, column_name)
|
15
|
+
return false
|
16
|
+
end
|
17
|
+
if column_name and !@match_tables_deny.matched?(table_name, column_name)
|
18
|
+
return true
|
19
|
+
end
|
20
|
+
if !column_name and @match_tables_deny.matched?(table_name) and !@match_tables_deny.includes_columns?(table_name)
|
21
|
+
return false
|
22
|
+
end
|
23
|
+
if !column_name and @match_tables_deny.includes_columns?(table_name)
|
24
|
+
return true
|
25
|
+
end
|
26
|
+
return true
|
27
|
+
end
|
28
|
+
false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module JunglePath
|
2
|
+
module Gen
|
3
|
+
module SchemaTree
|
4
|
+
class MatchColumns
|
5
|
+
attr_reader :is_nil
|
6
|
+
def initialize columns
|
7
|
+
@is_nil = false
|
8
|
+
@hash = {}
|
9
|
+
@regexes = []
|
10
|
+
if columns
|
11
|
+
if columns.class == Symbol
|
12
|
+
@hash[columns] = true
|
13
|
+
elsif columns.class == String
|
14
|
+
@hash[columns.to_sym] = true
|
15
|
+
elsif columns.class == Regexp
|
16
|
+
@regexes << columns
|
17
|
+
elsif columns.class == Array and columns.length > 0
|
18
|
+
columns.each do |col|
|
19
|
+
if col.class == Symbol
|
20
|
+
@hash[col] = true
|
21
|
+
elsif columns.class == String
|
22
|
+
@hash[col.to_sym] = true
|
23
|
+
elsif col.class == Regexp
|
24
|
+
@regexes << col
|
25
|
+
else
|
26
|
+
throw "Invalid type for col array item: #{col.class}, value: #{col}."
|
27
|
+
end
|
28
|
+
end
|
29
|
+
elsif columns.class == Array
|
30
|
+
@is_nil = true
|
31
|
+
else
|
32
|
+
throw "Invalid type for columns parameter: #{columns.class}, value: #{columns}."
|
33
|
+
end
|
34
|
+
else
|
35
|
+
@is_nil = true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def matched? column_name
|
40
|
+
return true if @is_nil
|
41
|
+
return true if @hash[column_name.to_sym]
|
42
|
+
@regexes.each do |regx|
|
43
|
+
return true if regx =~ column_name.to_s
|
44
|
+
end
|
45
|
+
false
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_s
|
49
|
+
"is_nil: #{@is_nil}, hash: #{@hash}, regexes: #{@regexes}."
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module JunglePath
|
2
|
+
module Gen
|
3
|
+
module SchemaTree
|
4
|
+
class MatchTableData
|
5
|
+
attr_reader :name, :columns, :regexp
|
6
|
+
def initialize name, columns
|
7
|
+
@name = name
|
8
|
+
@columns = MatchColumns.new(columns)
|
9
|
+
@regexp = @name if @name and @name.class == Regexp
|
10
|
+
end
|
11
|
+
|
12
|
+
def nil_columns?
|
13
|
+
@columns.is_nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
"name: #{@name}, columns: #{@columns}, regexp: #{@regexp}."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module JunglePath
|
2
|
+
module Gen
|
3
|
+
module SchemaTree
|
4
|
+
class MatchTables
|
5
|
+
def initialize data
|
6
|
+
@hash = {}
|
7
|
+
@match_data = []
|
8
|
+
throw "Invalid data parameter: expected an array, but got this: #{data}" unless data.class == Array or data == nil
|
9
|
+
if data
|
10
|
+
data.each do |h|
|
11
|
+
if h.class == Hash
|
12
|
+
table = h[:table]
|
13
|
+
puts "table: #{table}."
|
14
|
+
columns = h[:columns]
|
15
|
+
puts "columns: #{columns}."
|
16
|
+
if table
|
17
|
+
mtd = MatchTableData.new(table, columns)
|
18
|
+
puts "mtd: #{mtd}."
|
19
|
+
@hash[mtd.name] = mtd
|
20
|
+
@match_data << mtd if mtd.regexp
|
21
|
+
else
|
22
|
+
throw "Invalid hash -- missing key :table. Got this: #{h}."
|
23
|
+
end
|
24
|
+
else
|
25
|
+
throw "Invalid data item. Expected hash got this: #{h}."
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def matched? table_name, column_name=nil
|
32
|
+
if table_name
|
33
|
+
match_table_data = get_match_table_data(table_name)
|
34
|
+
if match_table_data
|
35
|
+
if column_name
|
36
|
+
return match_table_data.columns.matched?(column_name)
|
37
|
+
else
|
38
|
+
return true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
false
|
43
|
+
end
|
44
|
+
|
45
|
+
def includes_columns? table_name
|
46
|
+
if table_name
|
47
|
+
match_table_data = get_match_table_data(table_name)
|
48
|
+
return !match_table_data.nil_columns? if match_table_data
|
49
|
+
end
|
50
|
+
false
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_s
|
54
|
+
"@hash: #{@hash}\n@match_data: #{@match_data}."
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def get_match_table_data table_name
|
60
|
+
match_table_data = @hash[table_name.to_sym]
|
61
|
+
return match_table_data if match_table_data
|
62
|
+
@match_data.each do |mtd|
|
63
|
+
return mtd if mtd.regexp =~ table_name.to_s
|
64
|
+
end
|
65
|
+
nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module JunglePath
|
2
|
+
module Gen
|
3
|
+
module SchemaTree
|
4
|
+
class Node
|
5
|
+
attr_accessor :name, :symbol, :child_table_name, :child_table_join_column_name, :parent_table_join_column_name, :nodes, :tables_hash
|
6
|
+
|
7
|
+
def initialize(name, symbol=nil, child_table_name=nil, child_table_join_column_name=nil, parent_table_join_column_name=nil)
|
8
|
+
@name = name
|
9
|
+
@symbol = symbol
|
10
|
+
@child_table_name = child_table_name
|
11
|
+
@child_table_join_column_name = child_table_join_column_name
|
12
|
+
@parent_table_join_column_name = parent_table_join_column_name
|
13
|
+
@nodes = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def str_name
|
17
|
+
return "#{name} #{symbol} #{child_table_name}.#{child_table_join_column_name.to_s[0..-4]}" if (child_table_join_column_name and (symbol == "<=" or symbol == "<-"))
|
18
|
+
return "#{name} #{symbol} #{child_table_name}" if symbol
|
19
|
+
"#{name}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_str(level=0)
|
23
|
+
indent = " " * level
|
24
|
+
result = ["#{indent}#{str_name}"]
|
25
|
+
nodes.each do |k, v|
|
26
|
+
if v.class == ::Array
|
27
|
+
v.each do |item|
|
28
|
+
result << item.to_str(level + 1)
|
29
|
+
end
|
30
|
+
else
|
31
|
+
result << v.to_str(level + 1)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
result.join("\n")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|