localtower 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +38 -0
- data/Rakefile +33 -0
- data/app/controllers/localtower/application_controller.rb +5 -0
- data/app/controllers/localtower/pages_controller.rb +55 -0
- data/app/helpers/localtower/application_helper.rb +19 -0
- data/app/views/layouts/localtower/application.html.erb +94 -0
- data/app/views/localtower/pages/dashboard.html.erb +55 -0
- data/app/views/localtower/pages/migrations.html.erb +99 -0
- data/app/views/localtower/pages/models.html.erb +78 -0
- data/app/views/localtower/pages/relations.html.erb +53 -0
- data/config/routes.rb +16 -0
- data/lib/localtower.rb +19 -0
- data/lib/localtower/engine.rb +9 -0
- data/lib/localtower/generators/migration.rb +275 -0
- data/lib/localtower/generators/model.rb +36 -0
- data/lib/localtower/generators/relation.rb +55 -0
- data/lib/localtower/tools.rb +173 -0
- data/lib/localtower/version.rb +3 -0
- data/lib/tasks/localtower_tasks.rake +4 -0
- data/public/css/app.css +29 -0
- data/public/js/app.js +106 -0
- data/public/light-bootstrap-dashboard-master/assets/css/animate.min.css +6 -0
- data/public/light-bootstrap-dashboard-master/assets/css/bootstrap.min.css +5 -0
- data/public/light-bootstrap-dashboard-master/assets/css/demo.css +61 -0
- data/public/light-bootstrap-dashboard-master/assets/css/light-bootstrap-dashboard.css +2815 -0
- data/public/light-bootstrap-dashboard-master/assets/css/pe-icon-7-stroke.css +632 -0
- data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.eot +0 -0
- data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.svg +212 -0
- data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.ttf +0 -0
- data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.woff +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/default-avatar.png +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/faces/face-0.jpg +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/faces/face-1.jpg +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/faces/face-2.jpg +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/faces/face-3.jpg +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/faces/face-4.jpg +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/faces/face-5.jpg +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/faces/face-6.jpg +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/faces/face-7.jpg +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/faces/tim_vector.jpe +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/favicon.ico +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/loading-bubbles.svg +14 -0
- data/public/light-bootstrap-dashboard-master/assets/img/mask.png +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/new_logo.png +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/sidebar-1.jpg +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/sidebar-2.jpg +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/sidebar-3.jpg +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/sidebar-4.jpg +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/sidebar-5.jpg +0 -0
- data/public/light-bootstrap-dashboard-master/assets/img/tim_80x80.png +0 -0
- data/public/light-bootstrap-dashboard-master/assets/js/bootstrap-checkbox-radio-switch.js +502 -0
- data/public/light-bootstrap-dashboard-master/assets/js/bootstrap-notify.js +404 -0
- data/public/light-bootstrap-dashboard-master/assets/js/bootstrap-select.js +438 -0
- data/public/light-bootstrap-dashboard-master/assets/js/bootstrap.min.js +7 -0
- data/public/light-bootstrap-dashboard-master/assets/js/chartist.min.js +9 -0
- data/public/light-bootstrap-dashboard-master/assets/js/demo.js +152 -0
- data/public/light-bootstrap-dashboard-master/assets/js/jquery-1.10.2.js +9789 -0
- data/public/light-bootstrap-dashboard-master/assets/js/light-bootstrap-dashboard.js +182 -0
- data/spec/dummy/Gemfile +33 -0
- data/spec/dummy/Gemfile.lock +186 -0
- data/spec/dummy/README.md +24 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/config/manifest.js +3 -0
- data/spec/dummy/app/assets/javascripts/application.js +16 -0
- data/spec/dummy/app/assets/javascripts/cable.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
- data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/jobs/application_job.rb +2 -0
- data/spec/dummy/app/mailers/application_mailer.rb +4 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +9 -0
- data/spec/dummy/bin/rake +9 -0
- data/spec/dummy/bin/setup +34 -0
- data/spec/dummy/bin/spring +17 -0
- data/spec/dummy/bin/update +29 -0
- data/spec/dummy/config.ru +5 -0
- data/spec/dummy/config/application.rb +30 -0
- data/spec/dummy/config/boot.rb +3 -0
- data/spec/dummy/config/cable.yml +9 -0
- data/spec/dummy/config/database.yml +18 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +54 -0
- data/spec/dummy/config/environments/production.rb +86 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/new_framework_defaults.rb +24 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/puma.rb +47 -0
- data/spec/dummy/config/routes.rb +5 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/config/spring.rb +6 -0
- data/spec/dummy/coverage/assets/0.10.0/application.css +799 -0
- data/spec/dummy/coverage/assets/0.10.0/application.js +1707 -0
- data/spec/dummy/coverage/assets/0.10.0/colorbox/border.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/colorbox/controls.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/colorbox/loading.gif +0 -0
- data/spec/dummy/coverage/assets/0.10.0/colorbox/loading_background.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/favicon_green.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/favicon_red.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/favicon_yellow.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/loading.gif +0 -0
- data/spec/dummy/coverage/assets/0.10.0/magnify.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/spec/dummy/coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/spec/dummy/coverage/index.html +294 -0
- data/spec/dummy/custom_plan.rb +11 -0
- data/spec/dummy/db/schema.rb +4 -0
- data/spec/dummy/lib/playground.rb +0 -0
- data/spec/dummy/log/development.log +22924 -0
- data/spec/dummy/log/localtower.log +11352 -0
- data/spec/dummy/log/test.log +9166 -0
- data/spec/dummy/tmp/restart.txt +0 -0
- data/spec/dummy/zeus.json +22 -0
- data/spec/factories/migration.rb +140 -0
- data/spec/factories/model.rb +36 -0
- data/spec/lib/localtower/generators/migration_spec.rb +113 -0
- data/spec/lib/localtower/generators/model_spec.rb +43 -0
- data/spec/lib/localtower/generators/relation_spec.rb +34 -0
- data/spec/lib/localtower/tools_spec.rb +14 -0
- data/spec/spec_helper.rb +47 -0
- 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,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
|