localtower 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +38 -0
  3. data/Rakefile +33 -0
  4. data/app/controllers/localtower/application_controller.rb +5 -0
  5. data/app/controllers/localtower/pages_controller.rb +55 -0
  6. data/app/helpers/localtower/application_helper.rb +19 -0
  7. data/app/views/layouts/localtower/application.html.erb +94 -0
  8. data/app/views/localtower/pages/dashboard.html.erb +55 -0
  9. data/app/views/localtower/pages/migrations.html.erb +99 -0
  10. data/app/views/localtower/pages/models.html.erb +78 -0
  11. data/app/views/localtower/pages/relations.html.erb +53 -0
  12. data/config/routes.rb +16 -0
  13. data/lib/localtower.rb +19 -0
  14. data/lib/localtower/engine.rb +9 -0
  15. data/lib/localtower/generators/migration.rb +275 -0
  16. data/lib/localtower/generators/model.rb +36 -0
  17. data/lib/localtower/generators/relation.rb +55 -0
  18. data/lib/localtower/tools.rb +173 -0
  19. data/lib/localtower/version.rb +3 -0
  20. data/lib/tasks/localtower_tasks.rake +4 -0
  21. data/public/css/app.css +29 -0
  22. data/public/js/app.js +106 -0
  23. data/public/light-bootstrap-dashboard-master/assets/css/animate.min.css +6 -0
  24. data/public/light-bootstrap-dashboard-master/assets/css/bootstrap.min.css +5 -0
  25. data/public/light-bootstrap-dashboard-master/assets/css/demo.css +61 -0
  26. data/public/light-bootstrap-dashboard-master/assets/css/light-bootstrap-dashboard.css +2815 -0
  27. data/public/light-bootstrap-dashboard-master/assets/css/pe-icon-7-stroke.css +632 -0
  28. data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.eot +0 -0
  29. data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.svg +212 -0
  30. data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.ttf +0 -0
  31. data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.woff +0 -0
  32. data/public/light-bootstrap-dashboard-master/assets/img/default-avatar.png +0 -0
  33. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-0.jpg +0 -0
  34. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-1.jpg +0 -0
  35. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-2.jpg +0 -0
  36. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-3.jpg +0 -0
  37. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-4.jpg +0 -0
  38. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-5.jpg +0 -0
  39. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-6.jpg +0 -0
  40. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-7.jpg +0 -0
  41. data/public/light-bootstrap-dashboard-master/assets/img/faces/tim_vector.jpe +0 -0
  42. data/public/light-bootstrap-dashboard-master/assets/img/favicon.ico +0 -0
  43. data/public/light-bootstrap-dashboard-master/assets/img/loading-bubbles.svg +14 -0
  44. data/public/light-bootstrap-dashboard-master/assets/img/mask.png +0 -0
  45. data/public/light-bootstrap-dashboard-master/assets/img/new_logo.png +0 -0
  46. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-1.jpg +0 -0
  47. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-2.jpg +0 -0
  48. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-3.jpg +0 -0
  49. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-4.jpg +0 -0
  50. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-5.jpg +0 -0
  51. data/public/light-bootstrap-dashboard-master/assets/img/tim_80x80.png +0 -0
  52. data/public/light-bootstrap-dashboard-master/assets/js/bootstrap-checkbox-radio-switch.js +502 -0
  53. data/public/light-bootstrap-dashboard-master/assets/js/bootstrap-notify.js +404 -0
  54. data/public/light-bootstrap-dashboard-master/assets/js/bootstrap-select.js +438 -0
  55. data/public/light-bootstrap-dashboard-master/assets/js/bootstrap.min.js +7 -0
  56. data/public/light-bootstrap-dashboard-master/assets/js/chartist.min.js +9 -0
  57. data/public/light-bootstrap-dashboard-master/assets/js/demo.js +152 -0
  58. data/public/light-bootstrap-dashboard-master/assets/js/jquery-1.10.2.js +9789 -0
  59. data/public/light-bootstrap-dashboard-master/assets/js/light-bootstrap-dashboard.js +182 -0
  60. data/spec/dummy/Gemfile +33 -0
  61. data/spec/dummy/Gemfile.lock +186 -0
  62. data/spec/dummy/README.md +24 -0
  63. data/spec/dummy/Rakefile +6 -0
  64. data/spec/dummy/app/assets/config/manifest.js +3 -0
  65. data/spec/dummy/app/assets/javascripts/application.js +16 -0
  66. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  67. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  68. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  69. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  70. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  71. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  72. data/spec/dummy/app/jobs/application_job.rb +2 -0
  73. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  74. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  75. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  76. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  77. data/spec/dummy/bin/bundle +3 -0
  78. data/spec/dummy/bin/rails +9 -0
  79. data/spec/dummy/bin/rake +9 -0
  80. data/spec/dummy/bin/setup +34 -0
  81. data/spec/dummy/bin/spring +17 -0
  82. data/spec/dummy/bin/update +29 -0
  83. data/spec/dummy/config.ru +5 -0
  84. data/spec/dummy/config/application.rb +30 -0
  85. data/spec/dummy/config/boot.rb +3 -0
  86. data/spec/dummy/config/cable.yml +9 -0
  87. data/spec/dummy/config/database.yml +18 -0
  88. data/spec/dummy/config/environment.rb +5 -0
  89. data/spec/dummy/config/environments/development.rb +54 -0
  90. data/spec/dummy/config/environments/production.rb +86 -0
  91. data/spec/dummy/config/environments/test.rb +42 -0
  92. data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
  93. data/spec/dummy/config/initializers/assets.rb +11 -0
  94. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  95. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  96. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  97. data/spec/dummy/config/initializers/inflections.rb +16 -0
  98. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  99. data/spec/dummy/config/initializers/new_framework_defaults.rb +24 -0
  100. data/spec/dummy/config/initializers/session_store.rb +3 -0
  101. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  102. data/spec/dummy/config/locales/en.yml +23 -0
  103. data/spec/dummy/config/puma.rb +47 -0
  104. data/spec/dummy/config/routes.rb +5 -0
  105. data/spec/dummy/config/secrets.yml +22 -0
  106. data/spec/dummy/config/spring.rb +6 -0
  107. data/spec/dummy/coverage/assets/0.10.0/application.css +799 -0
  108. data/spec/dummy/coverage/assets/0.10.0/application.js +1707 -0
  109. data/spec/dummy/coverage/assets/0.10.0/colorbox/border.png +0 -0
  110. data/spec/dummy/coverage/assets/0.10.0/colorbox/controls.png +0 -0
  111. data/spec/dummy/coverage/assets/0.10.0/colorbox/loading.gif +0 -0
  112. data/spec/dummy/coverage/assets/0.10.0/colorbox/loading_background.png +0 -0
  113. data/spec/dummy/coverage/assets/0.10.0/favicon_green.png +0 -0
  114. data/spec/dummy/coverage/assets/0.10.0/favicon_red.png +0 -0
  115. data/spec/dummy/coverage/assets/0.10.0/favicon_yellow.png +0 -0
  116. data/spec/dummy/coverage/assets/0.10.0/loading.gif +0 -0
  117. data/spec/dummy/coverage/assets/0.10.0/magnify.png +0 -0
  118. data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  119. data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  120. data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  121. data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  122. data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  123. data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  124. data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  125. data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  126. data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
  127. data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  128. data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
  129. data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
  130. data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  131. data/spec/dummy/coverage/index.html +294 -0
  132. data/spec/dummy/custom_plan.rb +11 -0
  133. data/spec/dummy/db/schema.rb +4 -0
  134. data/spec/dummy/lib/playground.rb +0 -0
  135. data/spec/dummy/log/development.log +22924 -0
  136. data/spec/dummy/log/localtower.log +11352 -0
  137. data/spec/dummy/log/test.log +9166 -0
  138. data/spec/dummy/tmp/restart.txt +0 -0
  139. data/spec/dummy/zeus.json +22 -0
  140. data/spec/factories/migration.rb +140 -0
  141. data/spec/factories/model.rb +36 -0
  142. data/spec/lib/localtower/generators/migration_spec.rb +113 -0
  143. data/spec/lib/localtower/generators/model_spec.rb +43 -0
  144. data/spec/lib/localtower/generators/relation_spec.rb +34 -0
  145. data/spec/lib/localtower/tools_spec.rb +14 -0
  146. data/spec/spec_helper.rb +47 -0
  147. metadata +401 -0
@@ -0,0 +1,53 @@
1
+ <% content_for :title do %>Relations<% end %>
2
+
3
+ <div class="row">
4
+ <div class="col-md-12">
5
+ <div class="card">
6
+ <div class="header">
7
+ <h4 class="title"></h4>
8
+ </div>
9
+
10
+ <div class="content">
11
+
12
+ <%= form_tag relations_path, class: "form" do %>
13
+ <div class="row">
14
+ <div class="form-group">
15
+ <div class="col-md-5">
16
+ <label>Model 1:</label>
17
+
18
+ <%= select("relations", "model_one_name", ::Localtower::Tools.models.collect {|p| [ p, p ] }, {include_blank: false}, class: "form-control") %>
19
+ </div>
20
+
21
+ <div class="col-md-2">
22
+ <div class="text-center">
23
+ <br>
24
+ <i class="pe-7s-loop" style="font-size: 3em;"></i>
25
+ </div>
26
+ </div>
27
+
28
+ <div class="col-md-5">
29
+ <label>Model 2:</label>
30
+ <%= select("relations", "model_two_name", ::Localtower::Tools.models.collect {|p| [ p, p ] }, {include_blank: false}, class: "form-control") %>
31
+ </div>
32
+ </div>
33
+ </div>
34
+
35
+ <hr>
36
+
37
+ <div class="row">
38
+ <div class="col-md-12 text-center">
39
+ <button name="relations[run_migrate]" type="submit" value="false" class="btn btn-warning" data-selector="submit">
40
+ Create the relation
41
+ </button>
42
+
43
+ <button name="relations[run_migrate]" type="submit" value="true" class="btn btn-success" data-selector="submit">
44
+ Create the relation and <b>migrate</b>
45
+ </button>
46
+ </div>
47
+ </div>
48
+
49
+ <% end %>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </div>
data/config/routes.rb ADDED
@@ -0,0 +1,16 @@
1
+ Localtower::Engine.routes.draw do
2
+ get "migrations", to: "pages#migrations", as: :migrations
3
+ post "migrations", to: "pages#post_migrations"
4
+
5
+ get "models", to: "pages#models", as: :models
6
+ post "models", to: "pages#post_models"
7
+
8
+ get "relations", to: "pages#relations", as: :relations
9
+ post "relations", to: "pages#post_relations"
10
+
11
+ # get ':v/:asset', to: 'pages#asset_render', as: 'asset_render', :constraints => { :v => /[^\/]*/, :asset => /[^\/]*/ }
12
+
13
+ get 'dashboard', to: 'pages#dashboard', as: 'dashboard'
14
+
15
+ root :to => redirect('dashboard')
16
+ end
data/lib/localtower.rb ADDED
@@ -0,0 +1,19 @@
1
+ module Localtower
2
+ end
3
+
4
+ # EXTERNAL GEM
5
+ require 'thor'
6
+ require 'active_link_to'
7
+ require 'zip'
8
+ require 'pg'
9
+ require 'sqlite3'
10
+
11
+ begin
12
+ require "pry"
13
+ rescue Exception => e
14
+ puts "No Pry."
15
+ end
16
+
17
+ root = File.expand_path(File.dirname(__FILE__))
18
+ Dir["#{root}/localtower/*.rb"].sort.each { |file| require file }
19
+ Dir["#{root}/localtower/generators/**/*.rb"].each { |file| require file }
@@ -0,0 +1,9 @@
1
+ module Localtower
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Localtower
4
+
5
+ initializer 'static assets' do |app|
6
+ app.middleware.use ::ActionDispatch::Static, "#{root}/public"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,275 @@
1
+ module Localtower
2
+ module Generators
3
+ class ThorGeneratorMigration < Thor
4
+ include Thor::Base
5
+ include Thor::Actions
6
+
7
+ no_commands do
8
+ def migration_add_column(data)
9
+ file = data["last_migration_file"]
10
+
11
+ if %w(array).include?(data["column_type"])
12
+ line = " add_column :#{data['table_name']}, :#{data['column']}, :text"
13
+ line << ", default: []"
14
+ line << ", array: true"
15
+
16
+ # Add an gin inde as well:
17
+ line << "\n"
18
+ line << " add_index :#{data['table_name']}, :#{data['column']}, using: :gin"
19
+ else
20
+ line = " add_column :#{data['table_name']}, :#{data['column']}, :#{data['column_type']}"
21
+ line << ", default: #{data['default']}" if data['default'].present?
22
+ line << ", null: false" if not data['nullable']
23
+ line << ", index: true" if data['index'] == true
24
+ end
25
+
26
+ line << "\n"
27
+
28
+ inject_in_migration(file, line)
29
+ end
30
+
31
+ def migration_remove_column(data)
32
+ file = data['last_migration_file']
33
+
34
+ line = " remove_column :#{data['table_name']}, :#{data['column']}\n"
35
+
36
+ inject_in_migration(file, line)
37
+ end
38
+
39
+ def migration_rename_column(data)
40
+ file = data['last_migration_file']
41
+
42
+ line = " rename_column :#{data['table_name']}, :#{data['column']}, :#{data['new_column_name']}\n"
43
+
44
+ inject_in_migration(file, line)
45
+ end
46
+
47
+ def migration_change_column_type(data)
48
+ file = data['last_migration_file']
49
+
50
+ line = " change_column :#{data['table_name']}, :#{data['column']}, :#{data['new_column_type']}\n"
51
+
52
+ inject_in_migration(file, line)
53
+ end
54
+
55
+ def migration_add_index_to_column(data)
56
+ file = data['last_migration_file']
57
+
58
+ line = " add_index :#{data["table_name"]}, :#{data["column"]}\n"
59
+
60
+ inject_in_migration(file, line)
61
+ end
62
+
63
+ # def migration_add_index_to_column_combined(data)
64
+ # file = data["last_migration_file"]
65
+ # attr_names = data["column"].split(",")
66
+
67
+ # # add_index :relationships, [:follower_id, :followed_id], unique: true
68
+ # line = " add_index :#{data["table_name"]}, [#{attr_names.map { |i| ":#{i}"}.join(', ')}]"
69
+ # line << ", unique: true" if data["unique"]
70
+ # line << "\n"
71
+
72
+ # inject_in_migration(file, line)
73
+ # end
74
+
75
+ def migration_remove_index_to_column(data)
76
+ file = data["last_migration_file"]
77
+
78
+ line = " remove_index :#{data["table_name"]}, :#{data["column"]}\n"
79
+
80
+ inject_in_migration(file, line)
81
+ end
82
+
83
+ def migration_create_table(data)
84
+ file = data["last_migration_file"]
85
+
86
+ line = " create_table :#{data["table_name"]}\n"
87
+
88
+ inject_in_migration(file, line)
89
+ end
90
+
91
+ def migration_drop_table(data)
92
+ file = data["last_migration_file"]
93
+
94
+ line = " drop_table :#{data["table_name"]}, force: :cascade\n"
95
+
96
+ inject_in_migration(file, line)
97
+ end
98
+
99
+ private
100
+
101
+ def inject_in_migration(file, line)
102
+ inject_into_file(file, line, after: "def change\n")
103
+ end
104
+ end
105
+ end
106
+
107
+ class Migration
108
+ TYPES = %w(string datetime text integer float json jsonb decimal binary boolean array references).freeze
109
+ ACTIONS = [
110
+ 'add_column',
111
+ 'remove_column',
112
+ 'rename_column',
113
+ 'change_column_type',
114
+ 'add_index_to_column',
115
+ # 'add_index_to_column_combined',
116
+ 'remove_index_to_column',
117
+ # 'create_table',
118
+ 'drop_table',
119
+ ].freeze
120
+
121
+ # @opts =
122
+ def initialize(opts)
123
+ @thor = ThorGeneratorMigration.new
124
+ @opts = opts.deep_stringify_keys
125
+ end
126
+
127
+ def remove_all_migrations
128
+ Dir["#{Rails.root}/db/migrate/*"].each { |migration_file| File.delete(migration_file) }
129
+
130
+ content_schema = """
131
+ ActiveRecord::Schema.define(version: 0) do
132
+ end
133
+ """
134
+
135
+ File.open("#{Rails.root}/db/schema.rb", "w") do |f|
136
+ f.write(content_schema)
137
+ end
138
+ end
139
+
140
+ def run
141
+ cmd = "ChangeTheModel#{@opts['migration_name']}AtTime#{Time.now.to_i}"
142
+ ::Localtower::Tools.perform_migration(cmd, true)
143
+
144
+ @opts['migrations'].each do |action_line|
145
+ next unless action_line['action'].present?
146
+
147
+ # table_name = action_line['table_name']
148
+ # column = action_line['column']
149
+ # index = action_line['index']
150
+ # default = action_line['default']
151
+ # null = action_line['null']
152
+ # unique = action_line['unique']
153
+ # column_type = action_line['column_type']
154
+ # new_column_type = action_line['new_column_type']
155
+ # new_column_name = action_line['new_column_name']
156
+ action_line["last_migration_file"] = last_migration_file
157
+
158
+ {
159
+ 'add_column' => -> { add_column(action_line) },
160
+ 'remove_column' => -> { remove_column(action_line) },
161
+ 'rename_column' => -> { rename_column(action_line) },
162
+ 'change_column_type' => -> { change_column_type(action_line) },
163
+ 'add_index_to_column' => -> { add_index_to_column(action_line) },
164
+ # 'add_index_to_column_combined' => -> { add_index_to_column_combined(action_line) },
165
+ 'remove_index_to_column' => -> { remove_index_to_column(action_line) },
166
+ 'create_table' => -> { create_table(action_line) },
167
+ 'drop_table' => -> { drop_table(action_line) }
168
+ }[action_line['action'].downcase].call
169
+ end
170
+
171
+ if @opts['run_migrate']
172
+ run_migration_or_nil
173
+ end
174
+ end
175
+
176
+ #====================================
177
+ def last_migration_file
178
+ Dir["#{Rails.root}/db/migrate/*"].sort.last
179
+ end
180
+
181
+ # VALIDATION before continuing:
182
+ private
183
+
184
+ def add_column(data)
185
+ if not data["table_name"].present? \
186
+ or not data["column"].present? \
187
+ or not data["column_type"].present?
188
+ return nil
189
+ end
190
+
191
+ @thor.migration_add_column(data)
192
+ end
193
+
194
+ def remove_column(data)
195
+ if not data["table_name"].present? \
196
+ or not data["column"].present?
197
+ return nil
198
+ end
199
+
200
+ @thor.migration_remove_column(data)
201
+ end
202
+
203
+ def rename_column(data)
204
+ if not data["table_name"].present? \
205
+ or not data["column"].present? \
206
+ or not data["new_column_name"].present?
207
+ return nil
208
+ end
209
+
210
+ @thor.migration_rename_column(data)
211
+ end
212
+
213
+ def change_column_type(data)
214
+ if not data["table_name"].present? \
215
+ or not data["column"].present? \
216
+ or not data["new_column_type"].present?
217
+ return nil
218
+ end
219
+
220
+ @thor.migration_change_column_type(data)
221
+ end
222
+
223
+ def add_index_to_column(data)
224
+ if not data["table_name"].present? \
225
+ or not data["column"].present?
226
+ return nil
227
+ end
228
+
229
+ @thor.migration_add_index_to_column(data)
230
+ end
231
+
232
+ # def add_index_to_column_combined(data)
233
+ # @thor.migration_add_index_to_column_combined(data)
234
+ # end
235
+
236
+ def remove_index_to_column(data)
237
+ if not data["table_name"].present? \
238
+ or not data["column"].present?
239
+ return nil
240
+ end
241
+
242
+ @thor.migration_remove_index_to_column(data)
243
+ end
244
+
245
+ def create_table(data)
246
+ if not data["table_name"].present?
247
+ return nil
248
+ end
249
+
250
+ @thor.migration_create_table(data)
251
+ end
252
+
253
+ def drop_table(data)
254
+ if not data["table_name"].present?
255
+ return nil
256
+ end
257
+
258
+ @thor.migration_drop_table(data)
259
+ end
260
+
261
+ def run_migration_or_nil
262
+ if last_migration_changed?
263
+ ::Localtower::Tools.perform_cmd('rake db:migrate')
264
+ else
265
+ File.delete(last_migration_file)
266
+ nil
267
+ end
268
+ end
269
+
270
+ def last_migration_changed?
271
+ File.readlines(last_migration_file).join != ~ /def change\n end/
272
+ end
273
+ end
274
+ end
275
+ end
@@ -0,0 +1,36 @@
1
+ module Localtower
2
+ module Generators
3
+ class Model
4
+ def initialize(opts)
5
+ @opts = opts.deep_stringify_keys
6
+ end
7
+
8
+ def run
9
+ if not @opts['attributes'] or not @opts['model_name'].present?
10
+ return nil
11
+ end
12
+
13
+ attributes_list = []
14
+
15
+ @opts['attributes'].each do |attribute_data|
16
+ str = "#{attribute_data["attribute_name"]}:#{attribute_data["attribute_type"]}"
17
+ str << ":index" if attribute_data["index"]
18
+
19
+ attributes_list << str
20
+ end
21
+
22
+ attributes_str = attributes_list.join(" ")
23
+ cmd = "rails g model #{@opts['model_name'].camelize} #{attributes_str}"
24
+
25
+ ::Localtower::Tools.perform_cmd(cmd, false)
26
+
27
+ if @opts['run_migrate']
28
+ ::Localtower::Tools.perform_cmd('rake db:migrate', false)
29
+ ::Localtower::Tools.perform_cmd('rake db:migrate RAILS_ENV=test', false)
30
+ end
31
+
32
+ self
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,55 @@
1
+ module Localtower
2
+ module Generators
3
+ class Relation
4
+ def initialize(opts)
5
+ @opts = opts.deep_stringify_keys
6
+ end
7
+
8
+ def run
9
+ model_one_name = @opts["model_one_name"]
10
+ model_two_name = @opts["model_two_name"]
11
+
12
+ if not model_one_name.present? and not model_two_name.present?
13
+ return nil
14
+ end
15
+
16
+ model_name = "#{model_one_name.capitalize}#{model_two_name.capitalize}"
17
+
18
+ data = {
19
+ run_migrate: true,
20
+ model_name: model_name,
21
+ attributes: [
22
+ {
23
+ attribute_name: model_one_name.downcase,
24
+ attribute_type: "references"
25
+ },
26
+ {
27
+ attribute_name: model_two_name.downcase,
28
+ attribute_type: "references"
29
+ },
30
+ ]
31
+ }
32
+
33
+ ::Localtower::Generators::Model.new(data.deep_stringify_keys).run
34
+
35
+ # model 1:
36
+ file = "#{Rails.root}/app/models/#{model_one_name.underscore}.rb"
37
+ after = /class #{model_one_name} < ApplicationRecord\n/
38
+ line1 = " has_many :#{model_name.pluralize.underscore}\n"
39
+ line2 = " has_many :#{model_two_name.pluralize.underscore}, through: :#{model_name.pluralize.underscore}\n"
40
+
41
+ ::Localtower::Tools::ThorTools.new.insert_after_word(file, after, line1)
42
+ ::Localtower::Tools::ThorTools.new.insert_after_word(file, after, line2)
43
+
44
+ # model 2:
45
+ file = "#{Rails.root}/app/models/#{model_two_name.underscore}.rb"
46
+ after = /class #{model_two_name} < ApplicationRecord\n/
47
+ line1 = " has_many :#{model_name.pluralize.underscore}\n"
48
+ line2 = " has_many :#{model_one_name.pluralize.underscore}, through: :#{model_name.pluralize.underscore}\n"
49
+
50
+ ::Localtower::Tools::ThorTools.new.insert_after_word(file, after, line1)
51
+ ::Localtower::Tools::ThorTools.new.insert_after_word(file, after, line2)
52
+ end
53
+ end
54
+ end
55
+ end