localtower 0.1.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.
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