rails_db_objects 0.0.4 → 1.0.1
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 +5 -5
- data/Rakefile +0 -6
- data/lib/rails_db_objects/db_objects_creator.rb +271 -180
- data/lib/rails_db_objects/railtie.rb +4 -4
- data/lib/rails_db_objects/version.rb +1 -1
- data/lib/tasks/rails_db_objects_tasks.rake +15 -16
- data/test/dummy/Rakefile +1 -1
- data/test/dummy/bin/bundle +1 -1
- data/test/dummy/bin/rails +1 -1
- data/test/dummy/bin/setup +8 -8
- data/test/dummy/config/application.rb +2 -3
- data/test/dummy/config/boot.rb +2 -2
- data/test/dummy/config/environment.rb +1 -1
- data/test/rails_db_objects_test.rb +1 -1
- data/test/test_helper.rb +5 -5
- metadata +55 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 143af972ad8ea77cc95795ebc4a66a25ca5ba9304274b24fa0d14c242777271e
|
4
|
+
data.tar.gz: af6b3a46babeec69fec292539f06b47a587358ecb73fed09624ce10ba8d158e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2766067a2980382e9055ab4c7caf5d73da8741f074037d23cd9cb6bcf31c1af87a31c6d6e1ae2c919b2b26ed44b83459e7ffe06370823f17ad45907d24b73a5
|
7
|
+
data.tar.gz: 0574b8ec3120c5b8d942be92b66ee9f952fd1e63a974d5a35fd55f9415f4114a41504c7fa50559f22b9502d25e8e9657e370d2143806c239f48855606ca74022
|
data/Rakefile
CHANGED
@@ -14,11 +14,6 @@ RDoc::Task.new(:rdoc) do |rdoc|
|
|
14
14
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
17
|
Bundler::GemHelper.install_tasks
|
23
18
|
|
24
19
|
require 'rake/testtask'
|
@@ -30,5 +25,4 @@ Rake::TestTask.new(:test) do |t|
|
|
30
25
|
t.verbose = false
|
31
26
|
end
|
32
27
|
|
33
|
-
|
34
28
|
task default: :test
|
@@ -1,227 +1,318 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
module RailsDbObjects
|
2
|
+
class DbObjectsCreator
|
3
|
+
attr_reader :objects
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
5
|
+
def initialize
|
6
|
+
@objects = {}
|
7
|
+
end
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
@objects[object_type] ||= {}
|
14
|
-
|
15
|
-
content = File.read(file)
|
16
|
-
content_lines = content.split("\n")
|
17
|
-
|
18
|
-
# Reject the commented lines from the file
|
19
|
-
sql_content = content_lines.reject{ |x| x.strip =~ /^--/ || x.strip =~ /^#/ }.join("\n")
|
20
|
-
|
21
|
-
file_obj = {
|
22
|
-
path: file,
|
23
|
-
sql_content: sql_content,
|
24
|
-
status: :none,
|
25
|
-
requires: [],
|
26
|
-
silent: false,
|
27
|
-
keep: false,
|
28
|
-
deleted: false,
|
29
|
-
dbschema: Rails.configuration.rails_db_objects[:objects_dbschema],
|
30
|
-
dropsql: [],
|
31
|
-
createsql: [],
|
32
|
-
vanilla: false,
|
33
|
-
condition: []
|
34
|
-
}
|
35
|
-
|
36
|
-
# Detect directives in commentary
|
37
|
-
directives = content_lines.select{ |x| x.strip =~ /^--/ || x.strip =~ /^#/ }.map(&:strip).map{ |x|
|
38
|
-
x =~ /^--/ ? x[2..-1] : x[1..-1]
|
39
|
-
}.select{|x| x =~ /^!/ }
|
40
|
-
|
41
|
-
#puts "directives: #{directives.inspect}"
|
42
|
-
directives.each do |directive|
|
43
|
-
if directive =~ /^!require /
|
44
|
-
file_obj[:requires] += directive.split(" ")[1..-1]
|
45
|
-
end
|
46
|
-
if directive =~ /^!vanilla/
|
47
|
-
file_obj[:vanilla] = true
|
48
|
-
end
|
49
|
-
if directive =~ /^!deleted/
|
50
|
-
file_obj[:skip_post] = true
|
51
|
-
end
|
52
|
-
if directive =~ /^!silent/
|
53
|
-
file_obj[:silent] = true
|
54
|
-
end
|
55
|
-
if directive =~ /^!keep/
|
56
|
-
file_obj[:skip_pre] = true
|
57
|
-
end
|
58
|
-
if directive =~ /^!schema/
|
59
|
-
file_obj[:dbschema] = directive.split(" ")[1..-1]
|
60
|
-
end
|
61
|
-
if directive =~ /^!condition /
|
62
|
-
file_obj[:condition] << directive.split(" ")[1..-1].join(" ")
|
63
|
-
end
|
64
|
-
if directive =~ /^!dropsql /
|
65
|
-
file_obj[:dropsql] << directive.split(" ")[1..-1].join(" ")
|
66
|
-
end
|
67
|
-
if directive =~ /^!createsql /
|
68
|
-
file_obj[:createsql] << directive.split(" ")[1..-1].join(" ")
|
69
|
-
end
|
70
|
-
end
|
9
|
+
def register_files(files)
|
10
|
+
files.each do |file|
|
11
|
+
object_name = File.basename(file, File.extname(file))
|
12
|
+
object_type = File.dirname(file.to_s).to_s.split('/').last.upcase
|
71
13
|
|
72
|
-
|
73
|
-
|
74
|
-
|
14
|
+
@objects[object_type] ||= {}
|
15
|
+
|
16
|
+
content = File.read(file)
|
17
|
+
content_lines = content.split("\n")
|
18
|
+
|
19
|
+
# Reject the commented lines from the file
|
20
|
+
sql_content = content_lines.reject { |x| x.strip =~ /^--/ || x.strip =~ /^#/ }.join("\n")
|
21
|
+
|
22
|
+
file_obj = {
|
23
|
+
name: object_name,
|
24
|
+
type: object_type,
|
25
|
+
debug: false,
|
26
|
+
directives: [],
|
27
|
+
path: file,
|
28
|
+
sql_content: sql_content,
|
29
|
+
status: :none,
|
30
|
+
requires: [],
|
31
|
+
silent: false,
|
32
|
+
keep: false,
|
33
|
+
nodrop: false,
|
34
|
+
deleted: false,
|
35
|
+
nocreate: false,
|
36
|
+
dbschema: Rails.configuration.rails_db_objects[:objects_dbschema],
|
37
|
+
dropsql: [],
|
38
|
+
createsql: [],
|
39
|
+
vanilla: false,
|
40
|
+
condition: [],
|
41
|
+
dropconditionruby: [],
|
42
|
+
createconditionruby: [],
|
43
|
+
beforedropruby: [],
|
44
|
+
beforedropsql: [],
|
45
|
+
afterdropruby: [],
|
46
|
+
afterdropsql: [],
|
47
|
+
beforecreateruby: [],
|
48
|
+
beforecreatesql: [],
|
49
|
+
aftercreateruby: [],
|
50
|
+
aftercreatesql: []
|
51
|
+
}
|
52
|
+
|
53
|
+
# Detect directives in commentary
|
54
|
+
directives = extract_from_comments(content_lines)
|
75
55
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
drop_object(object_type, name, object) unless object[:skip_pre]
|
56
|
+
# puts "directives: #{directives.inspect}"
|
57
|
+
directives.each { |directive| prepare_directive(file_obj, directive) }
|
58
|
+
|
59
|
+
@objects[object_type][object_name] = file_obj
|
81
60
|
end
|
82
61
|
end
|
83
|
-
end
|
84
62
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
63
|
+
def drop_objects
|
64
|
+
reset_objects_status!
|
65
|
+
@objects.keys.each do |object_type|
|
66
|
+
@objects[object_type].each do |_name, object|
|
67
|
+
drop_object(object)
|
68
|
+
end
|
90
69
|
end
|
91
70
|
end
|
92
|
-
end
|
93
71
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
72
|
+
def create_objects
|
73
|
+
reset_objects_status!
|
74
|
+
@objects.keys.each do |object_type|
|
75
|
+
@objects[object_type].each do |_name, object|
|
76
|
+
create_object(object)
|
77
|
+
end
|
99
78
|
end
|
100
79
|
end
|
101
|
-
end
|
102
80
|
|
81
|
+
private
|
82
|
+
|
83
|
+
def full(name)
|
84
|
+
prefix = @dbschema.blank? ? '' : "#{@dbschema}."
|
85
|
+
"#{prefix}#{wrap_name(name)}"
|
86
|
+
end
|
87
|
+
|
88
|
+
def wrap_name(name)
|
89
|
+
adapter_name = ActiveRecord::Base.connection.adapter_name
|
103
90
|
|
104
|
-
|
105
|
-
|
91
|
+
case adapter_name
|
92
|
+
when 'PostgreSQL'
|
93
|
+
"\"#{name}\""
|
94
|
+
when 'MySQL'
|
95
|
+
"`#{name}`"
|
96
|
+
when 'SQLServer'
|
97
|
+
"[#{name}]"
|
98
|
+
end
|
99
|
+
end
|
106
100
|
|
107
|
-
|
108
|
-
|
101
|
+
def extract_from_comments(content_lines)
|
102
|
+
dir_lines = content_lines.select { |x| x.strip =~ /^--/ || x.strip =~ /^#/ }.map(&:strip)
|
103
|
+
dir_lines.map { |x| /^--/.match?(x) ? x[2..-1] : x[1..-1] }.select { |x| x =~ /^!/ }
|
109
104
|
end
|
110
105
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
106
|
+
# rubocop:disable Metrics/AbcSize
|
107
|
+
def prepare_directive(file_obj, directive)
|
108
|
+
file_obj[:debug] = /^!debug/.match?(directive) unless file_obj[:debug]
|
109
|
+
file_obj[:directives] << directive
|
110
|
+
file_obj[:requires] += directive.split(' ')[1..-1] if /^!require /.match?(directive)
|
111
|
+
file_obj[:vanilla] = /^!vanilla/.match?(directive) unless file_obj[:vanilla]
|
112
|
+
file_obj[:nocreate] = file_obj[:deleted] = /^!deleted/.match?(directive) unless file_obj[:deleted]
|
113
|
+
file_obj[:silent] = /^!silent/.match?(directive) unless file_obj[:silent]
|
114
|
+
file_obj[:nodrop] = file_obj[:keep] = /^!keep/.match?(directive) unless file_obj[:keep]
|
115
|
+
file_obj[:dbschema] = directive.split(' ')[1..-1] if /^!schema/.match?(directive)
|
116
|
+
file_obj[:dropconditionruby] << directive.split(' ')[1..-1].join(' ') if /^!dropconditionruby /.match?(directive)
|
117
|
+
file_obj[:createconditionruby] << directive.split(' ')[1..-1].join(' ') if /^!createconditionruby /.match?(directive)
|
118
|
+
file_obj[:condition] << directive.split(' ')[1..-1].join(' ') if /^!condition /.match?(directive)
|
119
|
+
file_obj[:beforedropsql] << directive.split(' ')[1..-1].join(' ') if /^!beforedropsql /.match?(directive)
|
120
|
+
file_obj[:dropsql] << directive.split(' ')[1..-1].join(' ') if /^!dropsql /.match?(directive)
|
121
|
+
file_obj[:afterdropsql] << directive.split(' ')[1..-1].join(' ') if /^!afterdropsql /.match?(directive)
|
122
|
+
file_obj[:beforecreatesql] << directive.split(' ')[1..-1].join(' ') if /^!beforecreatesql /.match?(directive)
|
123
|
+
file_obj[:createsql] << directive.split(' ')[1..-1].join(' ') if /^!createsql /.match?(directive)
|
124
|
+
file_obj[:aftercreatesql] << directive.split(' ')[1..-1].join(' ') if /^!aftercreatesql /.match?(directive)
|
117
125
|
end
|
126
|
+
# rubocop:enable Metrics/AbcSize
|
118
127
|
|
119
|
-
|
120
|
-
|
128
|
+
def reset_objects_status!
|
129
|
+
@objects.keys.each do |object_type|
|
130
|
+
@objects[object_type].each do |_name, object|
|
131
|
+
object[:status] = :none
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
121
135
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
136
|
+
def conditional_ruby(condition, object)
|
137
|
+
interpolated_command = object.instance_eval('"' + condition.gsub(/\"/, '\"') + '"')
|
138
|
+
condition = object.instance_eval(interpolated_command)
|
139
|
+
if object[:debug]
|
140
|
+
puts '=' * 80
|
141
|
+
puts "interpolated_command: #{interpolated_command}"
|
142
|
+
puts '=' * 80
|
143
|
+
puts "condition: #{condition.inspect}"
|
144
|
+
puts '=' * 80
|
129
145
|
end
|
146
|
+
condition ? true : false
|
130
147
|
end
|
131
148
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
149
|
+
def interpolate_sql(sql, object)
|
150
|
+
object.instance_eval('"' + sql.gsub(/\"/, '\"') + '"')
|
151
|
+
end
|
152
|
+
|
153
|
+
# rubocop:disable Metrics/AbcSize
|
154
|
+
def drop_object(object)
|
155
|
+
return if object[:nodrop]
|
156
|
+
|
157
|
+
return if object[:status] == :loaded
|
158
|
+
|
159
|
+
object_type = object[:type]
|
160
|
+
name = object[:name]
|
161
|
+
@dbschema = (object[:dbschema] || []).clone
|
162
|
+
|
163
|
+
raise "Error: Circular file reference! (#{object_type} #{name})" if object[:status] == :inprogress
|
164
|
+
|
165
|
+
full_name = full(name)
|
166
|
+
|
167
|
+
if object[:dropconditionruby].compact.any?
|
168
|
+
condition = conditional_ruby(object[:dropconditionruby].join("\n"), object)
|
169
|
+
if condition
|
170
|
+
puts "RUBY CONDITION MET FOR #{object_type} #{full_name} #{condition}"
|
171
|
+
else
|
172
|
+
puts "RUBY CONDITION NOT MET FOR #{object_type} #{full_name} #{condition}"
|
137
173
|
return
|
174
|
+
end
|
175
|
+
elsif object[:condition].compact.any?
|
176
|
+
condition = !ActiveRecord::Base.connection.select_rows(object[:condition].join("\n")).empty?
|
177
|
+
if condition
|
178
|
+
puts "SQL CONDITION MET FOR #{object_type} #{full_name}"
|
138
179
|
else
|
139
|
-
puts "CONDITION MET FOR #{object_type} #{full_name}"
|
180
|
+
puts "SQL CONDITION NOT MET FOR #{object_type} #{full_name}"
|
181
|
+
return
|
140
182
|
end
|
141
183
|
end
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
puts
|
147
|
-
puts
|
148
|
-
|
149
|
-
#puts "#{e.backtrace}"
|
150
|
-
puts "#"*80
|
151
|
-
puts "WARNING: #{sql}... ERROR"
|
152
|
-
puts "#"*80
|
153
|
-
# else
|
154
|
-
# puts "WARNING: #{sql}... SILENT"
|
184
|
+
|
185
|
+
if object[:debug]
|
186
|
+
puts '=' * 80
|
187
|
+
puts "DROP OBJECT #{name} / #{object[:path]}"
|
188
|
+
puts '=' * 80
|
189
|
+
puts object.to_json
|
190
|
+
puts '=' * 80
|
155
191
|
end
|
156
|
-
end
|
157
192
|
|
158
|
-
|
159
|
-
|
193
|
+
object[:requires].each do |requirement|
|
194
|
+
requires = requirement.split('/', 2)
|
195
|
+
required_object = requires.last
|
196
|
+
required_type = requires.first.upcase if requires.length == 2
|
197
|
+
required_type ||= object_type
|
198
|
+
drop_object @objects[required_type.upcase][required_object]
|
199
|
+
end
|
160
200
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
end
|
201
|
+
sql = if object[:dropsql].compact.empty? && !object[:vanilla]
|
202
|
+
"DROP #{object_type} #{full_name};"
|
203
|
+
else
|
204
|
+
interpolate_sql(object[:dropsql].compact.join(";\n"), object)
|
205
|
+
end
|
167
206
|
|
168
|
-
|
169
|
-
|
207
|
+
begin
|
208
|
+
conditional_ruby(object[:beforedropruby].join("\n"), object) unless object[:beforedropruby].empty?
|
209
|
+
ActiveRecord::Base.connection.exec_query(object[:beforedropsql].join("\n")) unless object[:beforedropsql].empty?
|
210
|
+
ActiveRecord::Base.connection.exec_query(sql)
|
211
|
+
ActiveRecord::Base.connection.exec_query(object[:afterdropsql].join("\n")) unless object[:afterdropsql].empty?
|
212
|
+
puts "DROP #{object_type} #{full_name}... OK"
|
213
|
+
conditional_ruby(object[:afterdropruby].join("\n"), object) unless object[:afterdropruby].empty?
|
214
|
+
rescue StandardError => e
|
215
|
+
unless object[:debug]
|
216
|
+
puts '#' * 80
|
217
|
+
puts e.message.to_s
|
218
|
+
puts "-"*80
|
219
|
+
#puts "#{e.backtrace}"
|
220
|
+
#puts '-' * 80
|
221
|
+
puts "WARNING: >>#{sql}<<... ERROR"
|
222
|
+
puts '#' * 80
|
223
|
+
end
|
224
|
+
end
|
170
225
|
|
171
|
-
|
172
|
-
raise "Error: Circular file reference! (#{object_type} #{name})"
|
226
|
+
object[:status] = :loaded
|
173
227
|
end
|
174
228
|
|
175
|
-
object
|
229
|
+
def create_object(object)
|
230
|
+
return if object[:nocreate]
|
176
231
|
|
177
|
-
|
178
|
-
requires = requirement.split('/', 2)
|
179
|
-
required_object = requires.last
|
180
|
-
required_type = requires.first.upcase if requires.length==2
|
181
|
-
required_type ||= object_type
|
182
|
-
create_object required_type, required_object, @objects[required_type.upcase][required_object]
|
183
|
-
end
|
232
|
+
return if object[:status] == :loaded
|
184
233
|
|
185
|
-
|
186
|
-
|
234
|
+
object_type = object[:type]
|
235
|
+
name = object[:name]
|
187
236
|
|
188
|
-
|
189
|
-
sql = object[:sql_content]
|
190
|
-
else
|
191
|
-
unless object[:createsql].compact.empty?
|
192
|
-
sql = object[:createsql].compact.join("\n")
|
193
|
-
else
|
194
|
-
sql = "CREATE #{object_type} #{full_name}\n#{object[:sql_content]}"
|
195
|
-
end
|
196
|
-
end
|
237
|
+
raise "Error: Circular file reference! (#{object_type} #{name})" if object[:status] == :inprogress
|
197
238
|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
239
|
+
object[:status] = :inprogress
|
240
|
+
@dbschema = (object[:dbschema] || []).clone
|
241
|
+
|
242
|
+
full_name = full(name)
|
243
|
+
|
244
|
+
if object[:createconditionruby].compact.any?
|
245
|
+
condition = conditional_ruby(object[:createconditionruby].join("\n"), object)
|
246
|
+
if condition
|
247
|
+
puts "RUBY CONDITION MET FOR #{object_type} #{full_name} / #{condition}"
|
248
|
+
else
|
249
|
+
puts "RUBY CONDITION NOT MET FOR #{object_type} #{full_name}"
|
203
250
|
return
|
251
|
+
end
|
252
|
+
elsif object[:condition].compact.any?
|
253
|
+
condition = ActiveRecord::Base.connection.select_rows(object[:condition].join("\n")).empty?
|
254
|
+
if condition
|
255
|
+
puts "CONDITION MET FOR #{object_type} #{full_name}"
|
204
256
|
else
|
205
|
-
puts "CONDITION MET FOR #{object_type} #{full_name}"
|
257
|
+
puts "CONDITION NOT MET FOR #{object_type} #{full_name}"
|
258
|
+
return
|
206
259
|
end
|
207
260
|
end
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
puts
|
213
|
-
puts
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
puts "#"
|
219
|
-
|
220
|
-
# puts "WARNING: CREATE #{object_type} #{full_name}... SILENT"
|
261
|
+
|
262
|
+
if object[:debug]
|
263
|
+
puts '=' * 80
|
264
|
+
puts "CREATE OBJECT #{name} / #{object[:path]}"
|
265
|
+
puts '=' * 80
|
266
|
+
puts object.to_json
|
267
|
+
puts '=' * 80
|
268
|
+
end
|
269
|
+
# skip empty sql content
|
270
|
+
if object[:sql_content].strip.blank?
|
271
|
+
puts "#{object_type} #{name} EMPTY... SKIPPING"
|
272
|
+
return
|
221
273
|
end
|
274
|
+
|
275
|
+
create_dependencies(object, object_type)
|
276
|
+
|
277
|
+
sql = if object[:vanilla]
|
278
|
+
interpolate_sql(object[:sql_content], object)
|
279
|
+
elsif object[:createsql].compact.empty?
|
280
|
+
"CREATE #{object_type} #{full_name}\n#{object[:sql_content]}"
|
281
|
+
else
|
282
|
+
interpolate_sql(object[:createsql].compact.join(";\n"), object)
|
283
|
+
end
|
284
|
+
|
285
|
+
begin
|
286
|
+
conditional_ruby(object[:beforecreateruby].join("\n"), object) unless object[:beforecreateruby].empty?
|
287
|
+
ActiveRecord::Base.connection.exec_query(object[:beforecreatesql].join("\n")) unless object[:beforecreatesql].empty?
|
288
|
+
ActiveRecord::Base.connection.exec_query(sql.to_s)
|
289
|
+
ActiveRecord::Base.connection.exec_query(object[:aftercreatesql].join("\n")) unless object[:aftercreatesql].empty?
|
290
|
+
conditional_ruby(object[:aftercreateruby].join("\n"), object) unless object[:aftercreateruby].empty?
|
291
|
+
puts "CREATE #{object_type} #{full_name}... OK"
|
292
|
+
rescue StandardError => e
|
293
|
+
unless object[:silent]
|
294
|
+
puts '#' * 80
|
295
|
+
puts e.message.to_s
|
296
|
+
puts '-' * 80
|
297
|
+
puts sql.to_s
|
298
|
+
puts '-' * 80
|
299
|
+
puts "WARNING: CREATE #{object_type} #{full_name}... ERROR"
|
300
|
+
puts '#' * 80
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
object[:status] = :loaded
|
222
305
|
end
|
306
|
+
# rubocop:enable Metrics/AbcSize
|
223
307
|
|
224
|
-
object
|
308
|
+
def create_dependencies(object, object_type)
|
309
|
+
object[:requires].each do |requirement|
|
310
|
+
requires = requirement.split('/', 2)
|
311
|
+
required_object = requires.last
|
312
|
+
required_type = requires.first.upcase if requires.length == 2
|
313
|
+
required_type ||= object_type
|
314
|
+
create_object(@objects[required_type.upcase][required_object])
|
315
|
+
end
|
316
|
+
end
|
225
317
|
end
|
226
|
-
|
227
318
|
end
|
@@ -3,13 +3,13 @@ class Railtie < Rails::Railtie
|
|
3
3
|
|
4
4
|
config.rails_db_objects = ActiveSupport::OrderedHash.new
|
5
5
|
|
6
|
-
initializer
|
7
|
-
app.config.rails_db_objects[:objects_path] = %w
|
8
|
-
app.config.rails_db_objects[:objects_ext] =
|
6
|
+
initializer 'rails_db_objects.initialize' do |app|
|
7
|
+
app.config.rails_db_objects[:objects_path] = %w[db/objects/**/]
|
8
|
+
app.config.rails_db_objects[:objects_ext] = '*.sql'
|
9
9
|
app.config.rails_db_objects[:objects_dbschema] = ['dbo']
|
10
10
|
end
|
11
11
|
|
12
12
|
rake_tasks do
|
13
|
-
load
|
13
|
+
load 'tasks/rails_db_objects_tasks.rake'
|
14
14
|
end
|
15
15
|
end
|
@@ -1,28 +1,27 @@
|
|
1
1
|
namespace :db do
|
2
|
-
|
3
|
-
|
4
|
-
task :create_objects => :environment do
|
2
|
+
desc 'Generate all the database objects of the current project'
|
3
|
+
task create_objects: :environment do
|
5
4
|
creator = RailsDbObjects::DbObjectsCreator.new
|
6
5
|
|
7
|
-
objects_path
|
6
|
+
objects_path = Rails.configuration.rails_db_objects[:objects_path]
|
7
|
+
objects_ext = Rails.configuration.rails_db_objects[:objects_ext]
|
8
8
|
|
9
9
|
objects_path.each do |path|
|
10
|
-
creator.register_files
|
11
|
-
File.expand_path(x)
|
12
|
-
}
|
10
|
+
creator.register_files(Dir[File.join(path, objects_ext)].map { |x| File.expand_path(x) })
|
13
11
|
end
|
14
12
|
|
15
13
|
creator.create_objects
|
16
14
|
end
|
17
15
|
|
18
|
-
desc
|
19
|
-
task :
|
16
|
+
desc 'Drop all the database objects of the current project'
|
17
|
+
task drop_objects: :environment do
|
20
18
|
creator = RailsDbObjects::DbObjectsCreator.new
|
21
19
|
|
22
|
-
objects_path
|
20
|
+
objects_path = Rails.configuration.rails_db_objects[:objects_path]
|
21
|
+
objects_ext = Rails.configuration.rails_db_objects[:objects_ext]
|
23
22
|
|
24
23
|
objects_path.each do |path|
|
25
|
-
creator.register_files
|
24
|
+
creator.register_files(Dir[File.join(path, objects_ext)].map { |x| File.expand_path(x) })
|
26
25
|
end
|
27
26
|
|
28
27
|
creator.drop_objects
|
@@ -31,16 +30,16 @@ end
|
|
31
30
|
|
32
31
|
require 'rake/hooks'
|
33
32
|
|
34
|
-
before
|
33
|
+
before 'db:migrate' do
|
35
34
|
Rake::Task['db:drop_objects'].invoke
|
36
35
|
end
|
37
|
-
before
|
36
|
+
before 'db:rollback' do
|
38
37
|
Rake::Task['db:drop_objects'].invoke
|
39
38
|
end
|
40
39
|
|
41
|
-
after
|
40
|
+
after 'db:migrate' do
|
42
41
|
Rake::Task['db:create_objects'].invoke
|
43
42
|
end
|
44
|
-
after
|
43
|
+
after 'db:rollback' do
|
45
44
|
Rake::Task['db:create_objects'].invoke
|
46
|
-
end
|
45
|
+
end
|
data/test/dummy/Rakefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
2
2
|
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
3
3
|
|
4
|
-
require File.expand_path('
|
4
|
+
require File.expand_path('config/application', __dir__)
|
5
5
|
|
6
6
|
Rails.application.load_tasks
|
data/test/dummy/bin/bundle
CHANGED
data/test/dummy/bin/rails
CHANGED
data/test/dummy/bin/setup
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
require 'pathname'
|
3
3
|
|
4
4
|
# path to your application root.
|
5
|
-
APP_ROOT = Pathname.new File.expand_path('
|
5
|
+
APP_ROOT = Pathname.new File.expand_path('..', __dir__)
|
6
6
|
|
7
7
|
Dir.chdir APP_ROOT do
|
8
8
|
# This script is a starting point to setup your application.
|
9
9
|
# Add necessary setup steps to this file:
|
10
10
|
|
11
|
-
puts
|
12
|
-
system
|
13
|
-
system
|
11
|
+
puts '== Installing dependencies =='
|
12
|
+
system 'gem install bundler --conservative'
|
13
|
+
system 'bundle check || bundle install'
|
14
14
|
|
15
15
|
# puts "\n== Copying sample files =="
|
16
16
|
# unless File.exist?("config/database.yml")
|
@@ -18,12 +18,12 @@ Dir.chdir APP_ROOT do
|
|
18
18
|
# end
|
19
19
|
|
20
20
|
puts "\n== Preparing database =="
|
21
|
-
system
|
21
|
+
system 'bin/rake db:setup'
|
22
22
|
|
23
23
|
puts "\n== Removing old logs and tempfiles =="
|
24
|
-
system
|
25
|
-
system
|
24
|
+
system 'rm -f log/*'
|
25
|
+
system 'rm -rf tmp/cache'
|
26
26
|
|
27
27
|
puts "\n== Restarting application server =="
|
28
|
-
system
|
28
|
+
system 'touch tmp/restart.txt'
|
29
29
|
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require File.expand_path('
|
1
|
+
require File.expand_path('boot', __dir__)
|
2
2
|
|
3
3
|
require 'rails/all'
|
4
4
|
|
5
5
|
Bundler.require(*Rails.groups)
|
6
|
-
require
|
6
|
+
require 'rails_db_objects'
|
7
7
|
|
8
8
|
module Dummy
|
9
9
|
class Application < Rails::Application
|
@@ -23,4 +23,3 @@ module Dummy
|
|
23
23
|
config.active_record.raise_in_transactional_callbacks = true
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
data/test/dummy/config/boot.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Set up gems listed in the Gemfile.
|
2
|
-
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('
|
2
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../Gemfile', __dir__)
|
3
3
|
|
4
4
|
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
5
|
-
$LOAD_PATH.unshift File.expand_path('
|
5
|
+
$LOAD_PATH.unshift File.expand_path('../../../lib', __dir__)
|
data/test/test_helper.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# Configure Rails Environment
|
2
|
-
ENV[
|
2
|
+
ENV['RAILS_ENV'] = 'test'
|
3
3
|
|
4
|
-
require File.expand_path(
|
5
|
-
ActiveRecord::Migrator.migrations_paths = [File.expand_path(
|
6
|
-
require
|
4
|
+
require File.expand_path('../test/dummy/config/environment.rb', __dir__)
|
5
|
+
ActiveRecord::Migrator.migrations_paths = [File.expand_path('../test/dummy/db/migrate', __dir__)]
|
6
|
+
require 'rails/test_help'
|
7
7
|
|
8
8
|
# Filter out Minitest backtrace while allowing backtrace from other libraries
|
9
9
|
# to be shown.
|
@@ -14,7 +14,7 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
|
14
14
|
|
15
15
|
# Load fixtures from the engine
|
16
16
|
if ActiveSupport::TestCase.respond_to?(:fixture_path=)
|
17
|
-
ActiveSupport::TestCase.fixture_path = File.expand_path(
|
17
|
+
ActiveSupport::TestCase.fixture_path = File.expand_path('fixtures', __dir__)
|
18
18
|
ActionDispatch::IntegrationTest.fixture_path = ActiveSupport::TestCase.fixture_path
|
19
19
|
ActiveSupport::TestCase.fixtures :all
|
20
20
|
end
|
metadata
CHANGED
@@ -1,19 +1,61 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_db_objects
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ''
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
date: 2022-06-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake-hooks
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.2.3
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.2.3
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubocop
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.30.1
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.30.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rubocop-rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 2.11.1
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 2.11.1
|
55
|
+
description: |-
|
56
|
+
A tool to manage database objects like views, functions, triggers, stored procedures or assemblies.
|
57
|
+
Inspired by the rails_db_views gem (which you can find at https://github.com/anykeyh/rails_db_views)
|
58
|
+
and re-using a lot of the code from there.
|
17
59
|
email:
|
18
60
|
- ''
|
19
61
|
executables: []
|
@@ -67,7 +109,7 @@ homepage: https://github.com/neongrau/rails_db_objects
|
|
67
109
|
licenses:
|
68
110
|
- MIT
|
69
111
|
metadata: {}
|
70
|
-
post_install_message:
|
112
|
+
post_install_message:
|
71
113
|
rdoc_options: []
|
72
114
|
require_paths:
|
73
115
|
- lib
|
@@ -82,13 +124,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
82
124
|
- !ruby/object:Gem::Version
|
83
125
|
version: '0'
|
84
126
|
requirements: []
|
85
|
-
|
86
|
-
|
87
|
-
signing_key:
|
127
|
+
rubygems_version: 3.2.32
|
128
|
+
signing_key:
|
88
129
|
specification_version: 4
|
89
130
|
summary: Drops and Creates database objects via rake/hook before and after any rake
|
90
131
|
db:migrate call.
|
91
132
|
test_files:
|
133
|
+
- test/dummy/README.rdoc
|
134
|
+
- test/dummy/Rakefile
|
92
135
|
- test/dummy/app/assets/javascripts/application.js
|
93
136
|
- test/dummy/app/assets/stylesheets/application.css
|
94
137
|
- test/dummy/app/controllers/application_controller.rb
|
@@ -121,7 +164,5 @@ test_files:
|
|
121
164
|
- test/dummy/public/422.html
|
122
165
|
- test/dummy/public/500.html
|
123
166
|
- test/dummy/public/favicon.ico
|
124
|
-
- test/dummy/Rakefile
|
125
|
-
- test/dummy/README.rdoc
|
126
167
|
- test/rails_db_objects_test.rb
|
127
168
|
- test/test_helper.rb
|