refinerycms-core 2.0.10 → 2.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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/refinery/admin.js.erb +126 -234
- data/app/assets/javascripts/refinery/ajaxy_pagination.js.coffee +1 -1
- data/app/assets/javascripts/refinery/boot_wym.js.erb +4 -8
- data/app/assets/javascripts/refinery/core.js +1 -1
- data/app/assets/javascripts/refinery/interface.js.coffee.erb +3 -16
- data/app/assets/javascripts/refinery/modal_dialogs.js.erb +0 -3
- data/app/assets/javascripts/refinery/nestedsortables.js +312 -312
- data/app/assets/javascripts/refinery/refinery.js.erb +14 -15
- data/app/assets/javascripts/refinery/site_bar.js +3 -9
- data/app/assets/javascripts/refinery/sortable_list.js +145 -0
- data/app/assets/javascripts/refinery/sortable_menu.js.coffee +3 -4
- data/app/assets/javascripts/refinery/submit_continue.js.coffee.erb +1 -2
- data/app/assets/javascripts/refinery/tree.js +3 -3
- data/app/assets/javascripts/refinery/wymeditor.js +6 -6
- data/{public → app/assets/javascripts}/wymeditor/GPL-license.txt +0 -0
- data/{public → app/assets/javascripts}/wymeditor/MIT-license.txt +0 -0
- data/{public → app/assets/javascripts}/wymeditor/README +0 -0
- data/app/assets/javascripts/wymeditor/browsers/mozilla.js.erb +10 -11
- data/app/assets/javascripts/wymeditor/browsers/webkit.js.erb +17 -18
- data/app/assets/javascripts/wymeditor/classes.js.erb +3 -5
- data/app/assets/javascripts/wymeditor/functions.js.erb +5 -1
- data/app/assets/javascripts/wymeditor/prototypes.js.erb +0 -3
- data/app/assets/javascripts/wymeditor/setup.js.erb +5 -5
- data/app/assets/javascripts/wymeditor/skins/refinery/skin.js +1 -4
- data/app/assets/javascripts/wymeditor/validators.js.erb +3 -2
- data/app/assets/stylesheets/{formatting.css.scss → refinery/formatting.css.scss} +0 -0
- data/app/assets/stylesheets/refinery/layout.css.scss +41 -11
- data/app/assets/stylesheets/{theme.css.scss → refinery/theme.css.scss} +0 -0
- data/app/controllers/refinery/sitemap_controller.rb +1 -5
- data/app/helpers/refinery/admin_helper.rb +6 -0
- data/app/helpers/refinery/image_helper.rb +2 -1
- data/app/helpers/refinery/menu_helper.rb +0 -49
- data/app/helpers/refinery/meta_helper.rb +7 -3
- data/app/helpers/refinery/site_bar_helper.rb +3 -15
- data/app/models/refinery/core/base_model.rb +2 -0
- data/{lib → app/presenters}/refinery/base_presenter.rb +1 -2
- data/app/views/layouts/application.html.erb +8 -7
- data/app/views/refinery/_content_page.html.erb +1 -1
- data/app/views/refinery/_google_analytics.html.erb +12 -5
- data/app/views/refinery/_head.html.erb +11 -15
- data/app/views/refinery/_header.html.erb +1 -4
- data/app/views/refinery/_javascripts.html.erb +14 -8
- data/app/views/refinery/_site_bar.html.erb +4 -4
- data/app/views/refinery/admin/_form_advanced_options_menu.html.erb +12 -0
- data/app/views/refinery/admin/_javascripts.html.erb +13 -1
- data/app/views/refinery/admin/_locale_picker.html.erb +11 -0
- data/app/views/refinery/admin/_make_sortable.html.erb +8 -5
- data/app/views/refinery/admin/_search.html.erb +1 -7
- data/app/views/refinery/admin/_search_header.html.erb +1 -0
- data/app/views/refinery/admin/_wysiwyg.html.erb +16 -0
- data/config/initializers/will_paginate_monkeypatch.rb +1 -1
- data/config/locales/bg.yml +5 -1
- data/config/locales/cs.yml +5 -1
- data/config/locales/da.yml +5 -1
- data/config/locales/de.yml +7 -3
- data/config/locales/el.yml +5 -1
- data/config/locales/en.yml +7 -1
- data/config/locales/es.yml +5 -1
- data/config/locales/fi.yml +5 -1
- data/config/locales/fr.yml +5 -1
- data/config/locales/hu.yml +82 -0
- data/config/locales/it.yml +38 -34
- data/config/locales/ja.yml +5 -1
- data/config/locales/ko.yml +5 -1
- data/config/locales/lt.yml +5 -1
- data/config/locales/lv.yml +5 -1
- data/config/locales/nb.yml +5 -1
- data/config/locales/nl.yml +36 -29
- data/config/locales/pl.yml +8 -1
- data/config/locales/pt-BR.yml +7 -3
- data/config/locales/pt.yml +82 -0
- data/config/locales/rs.yml +5 -1
- data/config/locales/ru.yml +5 -1
- data/config/locales/sk.yml +10 -3
- data/config/locales/sl.yml +5 -1
- data/config/locales/sv.yml +5 -1
- data/config/locales/tr.yml +82 -0
- data/config/locales/uk.yml +77 -0
- data/config/locales/vi.yml +5 -1
- data/config/locales/zh-CN.yml +5 -1
- data/config/locales/zh-TW.yml +5 -1
- data/config/routes.rb +3 -3
- data/lib/generators/refinery/cms/cms_generator.rb +29 -0
- data/lib/generators/refinery/cms/templates/.gitignore +1 -0
- data/lib/generators/refinery/cms/templates/app/views/sitemap/index.xml.builder +13 -13
- data/lib/generators/refinery/core/templates/config/initializers/refinery/core.rb.erb +8 -12
- data/lib/generators/refinery/dummy/templates/rails/database.yml +3 -3
- data/lib/generators/refinery/engine/engine_generator.rb +8 -12
- data/lib/generators/refinery/engine/templates/Gemfile +5 -39
- data/lib/generators/refinery/engine/templates/app/controllers/refinery/namespace/admin/plural_name_controller.rb.erb +4 -4
- data/lib/generators/refinery/engine/templates/app/models/refinery/namespace/singular_name.rb.erb +2 -3
- data/lib/generators/refinery/engine/templates/app/views/refinery/namespace/admin/plural_name/_actions.html.erb +1 -1
- data/lib/generators/refinery/engine/templates/app/views/refinery/namespace/admin/plural_name/_form.html.erb +31 -33
- data/lib/generators/refinery/engine/templates/app/views/refinery/namespace/admin/plural_name/_records.html.erb +1 -3
- data/lib/generators/refinery/engine/templates/app/views/refinery/namespace/admin/plural_name/_singular_name.html.erb +2 -2
- data/lib/generators/refinery/engine/templates/app/views/refinery/namespace/admin/plural_name/index.html.erb +1 -1
- data/lib/generators/refinery/engine/templates/config/locales/cs.yml +28 -0
- data/lib/generators/refinery/engine/templates/config/locales/it.yml +28 -0
- data/lib/generators/refinery/engine/templates/config/locales/nl.yml +6 -6
- data/lib/generators/refinery/engine/templates/config/locales/tr.yml +28 -0
- data/lib/generators/refinery/engine/templates/config/routes.rb.erb +2 -2
- data/lib/generators/refinery/engine/templates/db/seeds.rb.erb +1 -1
- data/lib/generators/refinery/engine/templates/lib/generators/refinery/extension_plural_name_generator.rb.erb +1 -1
- data/lib/generators/refinery/engine/templates/lib/refinery/plural_name/engine.rb.erb +1 -1
- data/lib/generators/refinery/engine/templates/spec/{requests → features}/refinery/namespace/admin/plural_name_spec.rb.erb +1 -1
- data/lib/generators/refinery/engine/templates/spec/spec_helper.rb +25 -49
- data/lib/generators/refinery/form/form_generator.rb +1 -13
- data/lib/generators/refinery/form/templates/app/models/refinery/namespace/singular_name.rb.erb +0 -4
- data/lib/generators/refinery/form/templates/app/views/refinery/namespace/admin/plural_name/_records.html.erb +2 -2
- data/lib/generators/refinery/form/templates/app/views/refinery/namespace/admin/plural_name/spam.html.erb +7 -6
- data/lib/generators/refinery/form/templates/config/locales/nl.yml +29 -29
- data/lib/generators/refinery/form/templates/config/locales/tr.yml +78 -0
- data/lib/generators/refinery/form/templates/config/routes.rb.erb +1 -1
- data/lib/generators/refinery/form/templates/db/migrate/1_create_plural_name.rb.erb +2 -6
- data/lib/generators/refinery/form/templates/db/seeds.rb.erb +1 -1
- data/lib/generators/refinery/form/templates/lib/refinery/plural_name/engine.rb.erb +1 -1
- data/lib/generators/refinery/form/templates/refinerycms-plural_name.gemspec +2 -5
- data/lib/refinery.rb +191 -0
- data/lib/refinery/admin/base_controller.rb +27 -16
- data/lib/refinery/application_controller.rb +15 -47
- data/lib/refinery/cli.rb +48 -27
- data/lib/refinery/core.rb +7 -183
- data/lib/refinery/core/configuration.rb +17 -9
- data/lib/refinery/core/engine.rb +11 -47
- data/lib/refinery/crud.rb +81 -66
- data/lib/refinery/engine.rb +52 -55
- data/lib/refinery/ext/action_view/helpers/form_builder.rb +2 -0
- data/lib/refinery/extension_generation.rb +208 -110
- data/lib/refinery/menu.rb +16 -7
- data/lib/refinery/menu_item.rb +56 -54
- data/lib/refinery/plugin.rb +11 -3
- data/lib/refinery/plugins.rb +14 -1
- data/lib/refinery/version.rb +3 -3
- data/refinerycms-core.gemspec +11 -10
- data/spec/controllers/refinery/admin/dummy_controller_spec.rb +57 -0
- data/spec/controllers/refinery/admin/refinery_core_controller_spec.rb +3 -4
- data/spec/controllers/refinery/sitemap_controller_spec.rb +1 -14
- data/spec/{requests → features}/refinery/admin/custom_assets_spec.rb +1 -1
- data/spec/{requests → features}/refinery/admin/dialogs_spec.rb +1 -1
- data/spec/features/refinery/admin/xhr_paging_spec.rb +55 -0
- data/spec/features/refinery/application_layout_spec.rb +19 -0
- data/spec/features/refinery/core_spec.rb +14 -0
- data/spec/{requests → features}/refinery/site_bar_spec.rb +1 -1
- data/spec/helpers/refinery/meta_helper_spec.rb +25 -0
- data/spec/lib/generators/refinery/cms/cms_generator_spec.rb +61 -0
- data/spec/lib/generators/refinery/engine/engine_generator_multiple_resources_spec.rb +28 -1
- data/spec/lib/generators/refinery/engine/engine_generator_sanity_check_spec.rb +7 -7
- data/spec/lib/generators/refinery/engine/engine_generator_spec.rb +69 -8
- data/spec/lib/generators/refinery/engine/engine_generator_with_i18n_spec.rb +0 -2
- data/spec/lib/generators/refinery/form/form_generator_spec.rb +9 -1
- data/spec/lib/refinery/application_controller_spec.rb +48 -63
- data/spec/lib/refinery/cli_spec.rb +136 -0
- data/spec/lib/refinery/core/configuration_spec.rb +17 -0
- data/spec/lib/refinery/core_spec.rb +19 -13
- data/spec/lib/refinery/crud_spec.rb +0 -4
- data/spec/lib/refinery/menu_spec.rb +16 -26
- data/spec/support/refinery.rb +6 -1
- data/{app → vendor}/assets/javascripts/jquery/GPL-LICENSE.txt +0 -0
- data/{app → vendor}/assets/javascripts/jquery/MIT-LICENSE.txt +0 -0
- data/vendor/assets/javascripts/jquery/jquery.browser.js +49 -0
- data/{app → vendor}/assets/javascripts/jquery/jquery.html5-placeholder-shim.js +0 -0
- data/{app → vendor}/assets/javascripts/jquery/jquery.jcarousel.js +0 -0
- data/{app → vendor}/assets/javascripts/jquery/jquery.textTruncate.js +0 -0
- data/{app → vendor}/assets/javascripts/jquery/jquery.timers.js +0 -0
- data/{app → vendor}/assets/javascripts/modernizr-min.js +0 -0
- metadata +231 -78
- data/app/assets/images/refinery/resolve_digital_footer_logo.png +0 -0
- data/app/assets/javascripts/dd_belatedpng.js +0 -13
- data/app/assets/javascripts/jquery/jquery.corner.js +0 -345
- data/app/assets/stylesheets/application.css.scss +0 -55
- data/app/assets/stylesheets/home.css.scss +0 -3
- data/app/views/refinery/_ie6check.html.erb +0 -63
- data/app/views/refinery/_menu.html.erb +0 -20
- data/app/views/refinery/_menu_branch.html.erb +0 -19
- data/lib/generators/refinery/engine/templates/Guardfile +0 -27
- data/lib/generators/refinery/engine/templates/app/views/refinery/namespace/admin/plural_name/_locale_picker.html.erb +0 -11
- data/lib/refinery/catch_all_routes.rb +0 -3
- data/lib/tasks/yard.rake +0 -30
- data/spec/requests/refinery/admin/controller_restriction_spec.rb +0 -27
- data/spec/requests/refinery/search_spec.rb +0 -71
|
@@ -8,6 +8,7 @@ module Refinery
|
|
|
8
8
|
class_option :namespace, :type => :string, :default => nil, :banner => 'NAMESPACE', :required => false
|
|
9
9
|
class_option :extension, :type => :string, :default => nil, :banner => 'ENGINE', :required => false
|
|
10
10
|
class_option :i18n, :type => :array, :default => [], :required => false, :banner => "field field", :desc => 'Indicates generated fields'
|
|
11
|
+
class_option :install, :type => :boolean, :default => false, :required => false, :banner => nil, :desc => 'Bundles and runs the generated generator, rake db:migrate, rake db:seed for you'
|
|
11
12
|
|
|
12
13
|
remove_class_option :skip_namespace
|
|
13
14
|
end
|
|
@@ -18,7 +19,13 @@ module Refinery
|
|
|
18
19
|
# Use exactly what the user requested, not a pluralised version.
|
|
19
20
|
options[:namespace].to_s.camelize
|
|
20
21
|
else
|
|
21
|
-
|
|
22
|
+
# If the user has passed an engine, we want to generate it inside of
|
|
23
|
+
# that extension.
|
|
24
|
+
if options[:extension].present?
|
|
25
|
+
options[:extension].to_s.camelize
|
|
26
|
+
else
|
|
27
|
+
class_name.pluralize
|
|
28
|
+
end
|
|
22
29
|
end
|
|
23
30
|
end
|
|
24
31
|
|
|
@@ -83,7 +90,7 @@ module Refinery
|
|
|
83
90
|
end
|
|
84
91
|
end
|
|
85
92
|
|
|
86
|
-
|
|
93
|
+
protected
|
|
87
94
|
|
|
88
95
|
def append_extension_to_gemfile!
|
|
89
96
|
unless Rails.env.test? || (self.behavior != :revoke && extension_in_gemfile?)
|
|
@@ -103,6 +110,24 @@ module Refinery
|
|
|
103
110
|
end
|
|
104
111
|
end
|
|
105
112
|
|
|
113
|
+
def default_generate!
|
|
114
|
+
sanity_check!
|
|
115
|
+
|
|
116
|
+
evaluate_templates!
|
|
117
|
+
|
|
118
|
+
unless options[:pretend]
|
|
119
|
+
merge_existing_files! if existing_extension?
|
|
120
|
+
|
|
121
|
+
copy_or_merge_seeds!
|
|
122
|
+
|
|
123
|
+
append_extension_to_gemfile!
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
install! if options[:install]
|
|
127
|
+
|
|
128
|
+
finalize_extension!
|
|
129
|
+
end
|
|
130
|
+
|
|
106
131
|
def destination_pathname
|
|
107
132
|
@destination_pathname ||= Pathname.new(self.destination_root.to_s)
|
|
108
133
|
end
|
|
@@ -112,44 +137,20 @@ module Refinery
|
|
|
112
137
|
end
|
|
113
138
|
|
|
114
139
|
def extension_path_for(path, extension, apply_tmp = true)
|
|
115
|
-
path = extension_pathname.join
|
|
116
|
-
|
|
117
|
-
path.gsub!('extension_plural_name', extension_plural_name)
|
|
118
|
-
path.gsub!('plural_name', plural_name)
|
|
119
|
-
path.gsub!('singular_name', singular_name)
|
|
120
|
-
path.gsub!('namespace', namespacing.underscore)
|
|
140
|
+
path = extension_pathname.join path.sub(%r{#{source_pathname}/?}, '')
|
|
141
|
+
path = substitute_path_placeholders path
|
|
121
142
|
|
|
122
143
|
if options[:namespace].present? || options[:extension].present?
|
|
123
|
-
|
|
124
|
-
# Only relevant for nested or namespaced extensions, where a previous migration exists
|
|
125
|
-
if %r{/migrate/\d+.*\.rb.erb\z} === path
|
|
126
|
-
if last_migration = Dir["#{destination_pathname.join(path.split(File::SEPARATOR)[0..-2].join(File::SEPARATOR), '*.rb')}"].sort.last
|
|
127
|
-
path.gsub!(%r{\d+_}) { |m| "#{last_migration.match(%r{migrate/(\d+)_})[1].to_i + 1}_" }
|
|
128
|
-
end
|
|
129
|
-
end
|
|
144
|
+
path = increment_migration_timestamp(path)
|
|
130
145
|
|
|
131
146
|
# Detect whether this is a special file that needs to get merged not overwritten.
|
|
132
147
|
# This is important only when nesting extensions.
|
|
133
148
|
# Routes and #{gem_name}\.rb have an .erb extension as path points to the generator template
|
|
134
149
|
# We have to exclude it when checking if the file already exists and include it in the regexps
|
|
135
|
-
if extension.present?
|
|
136
|
-
if %r{/locales/.*\.yml$} === path ||
|
|
137
|
-
%r{/routes\.rb\.erb$} === path ||
|
|
138
|
-
%r{/#{gem_name}\.rb\.erb$} === path
|
|
139
|
-
# put new translations into a tmp directory
|
|
140
|
-
if apply_tmp
|
|
141
|
-
path = path.split(File::SEPARATOR).insert(-2, "tmp").
|
|
142
|
-
join(File::SEPARATOR)
|
|
143
|
-
end
|
|
144
|
-
elsif %r{/readme.md$} === path || %r{/#{plural_name}.rb$} === path
|
|
145
|
-
path = nil
|
|
146
|
-
end
|
|
147
|
-
elsif extension.present? and path =~ /lib\/#{plural_name}.rb$/
|
|
148
|
-
path = nil
|
|
149
|
-
end
|
|
150
|
+
path = extension_path_for_nested_extension(path, apply_tmp) if extension.present?
|
|
150
151
|
end
|
|
151
152
|
|
|
152
|
-
path
|
|
153
|
+
path
|
|
153
154
|
end
|
|
154
155
|
|
|
155
156
|
def erase_destination!
|
|
@@ -160,18 +161,12 @@ module Refinery
|
|
|
160
161
|
end
|
|
161
162
|
|
|
162
163
|
def evaluate_templates!
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}.sort.each do |path|
|
|
166
|
-
if (template_path = extension_path_for(path, extension_name)).present?
|
|
167
|
-
next if path.to_s =~ /seeds.rb.erb/
|
|
168
|
-
|
|
169
|
-
unless path.to_s =~ /views/
|
|
170
|
-
template_path = template_path.to_s.sub(".erb", "")
|
|
171
|
-
end
|
|
164
|
+
viable_templates.each do |source_path, destination_path|
|
|
165
|
+
next if /seeds.rb.erb/ === source_path.to_s
|
|
172
166
|
|
|
173
|
-
|
|
174
|
-
|
|
167
|
+
destination_path.sub!('.erb', '') if source_path.to_s !~ /views/
|
|
168
|
+
|
|
169
|
+
template source_path, destination_path
|
|
175
170
|
end
|
|
176
171
|
end
|
|
177
172
|
|
|
@@ -189,8 +184,8 @@ module Refinery
|
|
|
189
184
|
end
|
|
190
185
|
|
|
191
186
|
def finalize_extension!
|
|
192
|
-
if self.behavior != :revoke
|
|
193
|
-
|
|
187
|
+
if self.behavior != :revoke && !self.options['pretend']
|
|
188
|
+
instruct_user!
|
|
194
189
|
else
|
|
195
190
|
erase_destination!
|
|
196
191
|
end
|
|
@@ -210,79 +205,47 @@ module Refinery
|
|
|
210
205
|
raise "You must override the method 'generator_command' in your generator."
|
|
211
206
|
end
|
|
212
207
|
|
|
213
|
-
def
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
# Both the new and current paths need to strip the .erb portion from the generator template
|
|
220
|
-
new_file_path = Pathname.new extension_path_for(path, extension_name).to_s.gsub(/\.erb$/, "")
|
|
221
|
-
tmp_directories << Pathname.new(new_file_path.to_s.split(File::SEPARATOR)[0..-2].join(File::SEPARATOR)) # save for later
|
|
222
|
-
# get the path to the existing file and perform a deep hash merge.
|
|
223
|
-
current_path = Pathname.new extension_path_for(path, extension_name, false).to_s.gsub(/\.erb$/, "")
|
|
224
|
-
new_contents = nil
|
|
225
|
-
|
|
226
|
-
if File.exist?(new_file_path) && %r{.yml$} === new_file_path.to_s
|
|
227
|
-
# merge translation files together.
|
|
228
|
-
new_contents = YAML::load(new_file_path.read).deep_merge(
|
|
229
|
-
YAML::load(current_path.read)
|
|
230
|
-
).to_yaml.gsub(%r{^---\n}, '')
|
|
231
|
-
elsif %r{/routes.rb$} === new_file_path.to_s
|
|
232
|
-
# append any routes from the new file to the current one.
|
|
233
|
-
routes_file = [(file_parts = current_path.read.to_s.split("\n")).first]
|
|
234
|
-
routes_file += file_parts[1..-2]
|
|
235
|
-
routes_file += new_file_path.read.to_s.split("\n")[1..-2]
|
|
236
|
-
routes_file << file_parts.last
|
|
237
|
-
new_contents = routes_file.join("\n")
|
|
238
|
-
elsif %r{/#{gem_name}.rb$} === new_file_path.to_s
|
|
239
|
-
new_contents = current_path.read + new_file_path.read
|
|
240
|
-
end
|
|
241
|
-
# write to current file the merged results.
|
|
242
|
-
current_path.open('w+') { |file| file.puts new_contents } if new_contents
|
|
243
|
-
end
|
|
208
|
+
def install!
|
|
209
|
+
run "bundle install"
|
|
210
|
+
run "rails generate refinery:#{extension_plural_name}"
|
|
211
|
+
run "rake db:migrate"
|
|
212
|
+
run "rake db:seed"
|
|
213
|
+
end
|
|
244
214
|
|
|
245
|
-
|
|
215
|
+
def merge_existing_files!
|
|
216
|
+
# go through all of the temporary files and merge what we need into the current files.
|
|
217
|
+
tmp_directories = []
|
|
218
|
+
globs = %w[config/locales/*.yml config/routes.rb.erb lib/refinerycms-extension_plural_name.rb.erb]
|
|
219
|
+
Pathname.glob(source_pathname.join("{#{globs.join(',')}}"), File::FNM_DOTMATCH).each do |path|
|
|
220
|
+
# get the path to the current tmp file.
|
|
221
|
+
# Both the new and current paths need to strip the .erb portion from the generator template
|
|
222
|
+
new_file_path = extension_path_for(path, extension_name).sub(/\.erb$/, '')
|
|
223
|
+
tmp_directories << new_file_path.split.first
|
|
224
|
+
current_path = extension_path_for(path, extension_name, false).sub(/\.erb$/, '')
|
|
225
|
+
|
|
226
|
+
FileMerger.new(self, current_path, new_file_path, :to => current_path, :mode => 'w+').call
|
|
246
227
|
end
|
|
228
|
+
|
|
229
|
+
tmp_directories.uniq.each(&:rmtree)
|
|
247
230
|
end
|
|
248
231
|
|
|
249
232
|
def copy_or_merge_seeds!
|
|
250
|
-
source_seed_file
|
|
251
|
-
destination_seed_file = destination_pathname.join(
|
|
252
|
-
extension_path_for(
|
|
253
|
-
source_seed_file.to_s.sub(".erb", ""), extension_name
|
|
254
|
-
)
|
|
255
|
-
)
|
|
256
|
-
|
|
257
|
-
if existing_extension?
|
|
258
|
-
# create temp seeds file
|
|
259
|
-
temp_seed_file = destination_pathname.join(
|
|
260
|
-
extension_path_for("tmp/seeds.rb", extension_name)
|
|
261
|
-
)
|
|
262
|
-
|
|
263
|
-
# copy/evaluate seeds template to temp file
|
|
264
|
-
template source_seed_file, temp_seed_file, :verbose => false
|
|
265
|
-
|
|
266
|
-
# append temp seeds file content to extension seeds file
|
|
267
|
-
destination_seed_file.open('a+') { |file|
|
|
268
|
-
file.puts temp_seed_file.read.to_s
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
# remove temp file
|
|
272
|
-
FileUtils.rm_rf temp_seed_file
|
|
273
|
-
else
|
|
274
|
-
template source_seed_file, destination_seed_file
|
|
275
|
-
end
|
|
233
|
+
FileMerger.new(self, source_seed_file, destination_seed_file).call
|
|
276
234
|
end
|
|
277
235
|
|
|
278
|
-
def
|
|
236
|
+
def instruct_user!
|
|
279
237
|
unless Rails.env.test?
|
|
280
238
|
puts "------------------------"
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
239
|
+
if options[:install]
|
|
240
|
+
puts "Your extension has been generated and installed."
|
|
241
|
+
else
|
|
242
|
+
puts "Now run:"
|
|
243
|
+
puts "bundle install"
|
|
244
|
+
puts "rails generate refinery:#{extension_plural_name}"
|
|
245
|
+
puts "rake db:migrate"
|
|
246
|
+
puts "rake db:seed"
|
|
247
|
+
end
|
|
248
|
+
puts "Please restart your rails server."
|
|
286
249
|
puts "------------------------"
|
|
287
250
|
end
|
|
288
251
|
end
|
|
@@ -296,10 +259,47 @@ module Refinery
|
|
|
296
259
|
end
|
|
297
260
|
|
|
298
261
|
def sanity_check!
|
|
262
|
+
prevent_clashes!
|
|
263
|
+
prevent_uncountability!
|
|
264
|
+
prevent_empty_attributes!
|
|
265
|
+
prevent_invalid_extension!
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def source_pathname
|
|
269
|
+
@source_pathname ||= Pathname.new(self.class.source_root.to_s)
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
private
|
|
273
|
+
def extension_path_for_nested_extension(path, apply_tmp)
|
|
274
|
+
return nil if !path.sub(/\.erb$/, '').file? &&
|
|
275
|
+
%r{readme.md|(lib/)?#{plural_name}.rb$} === path.to_s
|
|
276
|
+
|
|
277
|
+
if apply_tmp && %r{(locales/.*\.yml)|((config/routes|#{gem_name})\.rb\.erb)$} === path.to_s
|
|
278
|
+
path = path.dirname + 'tmp' + path.basename
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
path
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def increment_migration_timestamp(path)
|
|
285
|
+
# Increment the migration file leading number
|
|
286
|
+
# Only relevant for nested or namespaced extensions, where a previous migration exists
|
|
287
|
+
return path unless %r{/migrate/\d+.*\.rb.erb\z} === path.to_s && last_migration_file(path)
|
|
288
|
+
|
|
289
|
+
path.sub(%r{\d+_}) { |m| "#{last_migration_file(path).match(%r{migrate/(\d+)_})[1].to_i + 1}_" }
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
def last_migration_file(path)
|
|
293
|
+
Dir[destination_pathname.join(path.dirname + '*.rb')].sort.last
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
def prevent_clashes!
|
|
299
297
|
if clash_keywords.member?(singular_name.downcase)
|
|
300
298
|
exit_with_message!("Please choose a different name. The generated code would fail for class '#{singular_name}' as it conflicts with a reserved keyword.")
|
|
301
299
|
end
|
|
300
|
+
end
|
|
302
301
|
|
|
302
|
+
def prevent_uncountability!
|
|
303
303
|
if singular_name == plural_name
|
|
304
304
|
message = if singular_name.singularize == singular_name
|
|
305
305
|
"The extension name you specified will not work as the singular name is equal to the plural name."
|
|
@@ -308,21 +308,119 @@ module Refinery
|
|
|
308
308
|
end
|
|
309
309
|
exit_with_message! message
|
|
310
310
|
end
|
|
311
|
+
end
|
|
311
312
|
|
|
313
|
+
def prevent_empty_attributes!
|
|
312
314
|
if attributes.empty? && self.behavior != :revoke
|
|
313
315
|
exit_with_message! "You must specify a name and at least one field." \
|
|
314
316
|
"\nFor help, run: #{generator_command}"
|
|
315
317
|
end
|
|
318
|
+
end
|
|
316
319
|
|
|
320
|
+
def prevent_invalid_extension!
|
|
317
321
|
if options[:extension].present? && !extension_pathname.directory?
|
|
318
322
|
exit_with_message! "You can't use '--extension #{options[:extension]}' option because" \
|
|
319
323
|
" extension with name #{options[:extension]} doesn't exist."
|
|
320
324
|
end
|
|
321
325
|
end
|
|
322
326
|
|
|
323
|
-
def
|
|
324
|
-
|
|
327
|
+
def source_seed_file
|
|
328
|
+
source_pathname.join 'db', 'seeds.rb.erb'
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def destination_seed_file
|
|
332
|
+
destination_pathname.join extension_path_for(source_seed_file.sub('.erb', ''), extension_name)
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def substitute_path_placeholders(path)
|
|
336
|
+
Pathname.new path.to_s.gsub('extension_plural_name', extension_plural_name).
|
|
337
|
+
gsub('plural_name', plural_name).
|
|
338
|
+
gsub('singular_name', singular_name).
|
|
339
|
+
gsub('namespace', namespacing.underscore)
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
def viable_templates
|
|
343
|
+
@viable_templates ||= begin
|
|
344
|
+
all_templates.reject(&method(:reject_template?)).inject({}) do |hash, path|
|
|
345
|
+
if (destination_path = extension_path_for(path, extension_name)).present?
|
|
346
|
+
hash[path.to_s] = destination_path.to_s
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
hash
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
def all_templates
|
|
355
|
+
Pathname.glob source_pathname.join('**', '**')
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
class FileMerger
|
|
359
|
+
def initialize(templater, source, destination, options = {})
|
|
360
|
+
@templater = templater
|
|
361
|
+
@source = source
|
|
362
|
+
@destination = destination
|
|
363
|
+
@options = {:to => @destination, :mode => 'a+'}.merge(options)
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
def call
|
|
367
|
+
if %r{\.erb$} === @source.basename.to_s
|
|
368
|
+
templated_merge!
|
|
369
|
+
else
|
|
370
|
+
merge!
|
|
371
|
+
end
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
def contents
|
|
375
|
+
merged_file_contents
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
private
|
|
379
|
+
def merge!(contents = merged_file_contents)
|
|
380
|
+
@options[:to].open(@options[:mode]) { |file| file.puts contents }
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
def merged_file_contents
|
|
384
|
+
case @destination.to_s
|
|
385
|
+
# merge translation files together.
|
|
386
|
+
when %r{.yml$} then merge_yaml
|
|
387
|
+
# append any routes from the new file to the current one.
|
|
388
|
+
when %r{/routes.rb$} then merge_rb
|
|
389
|
+
# simply append the file contents
|
|
390
|
+
else @source.read + @destination.read
|
|
391
|
+
end
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
def templated_merge!
|
|
395
|
+
Dir.mktmpdir do |tmp|
|
|
396
|
+
tmp = Pathname.new(tmp)
|
|
397
|
+
@templater.template @source, tmp.join(@source.basename), :verbose => false
|
|
398
|
+
merge! tmp.join(@source.basename).read.to_s
|
|
399
|
+
end
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
def merge_rb
|
|
403
|
+
(source_lines[0..-2] + destination_lines[1..-2] + [source_lines.last]).join "\n"
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
def merge_yaml
|
|
407
|
+
YAML::load(@destination.read).deep_merge(YAML::load(@source.read)).
|
|
408
|
+
to_yaml.gsub(%r{^---\n}, '')
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
def source_lines
|
|
412
|
+
@source_lines ||= read_lines @source
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
def destination_lines
|
|
416
|
+
@destination_lines ||= read_lines @destination
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
def read_lines(file)
|
|
420
|
+
file.read.to_s.split "\n"
|
|
421
|
+
end
|
|
325
422
|
end
|
|
423
|
+
private_constant :FileMerger
|
|
326
424
|
|
|
327
425
|
end
|
|
328
426
|
end
|
data/lib/refinery/menu.rb
CHANGED
|
@@ -2,10 +2,14 @@ module Refinery
|
|
|
2
2
|
class Menu
|
|
3
3
|
|
|
4
4
|
def initialize(objects = nil)
|
|
5
|
-
|
|
5
|
+
append(objects)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def append(objects)
|
|
9
|
+
Array(objects).each do |item|
|
|
6
10
|
item = item.to_refinery_menu_item if item.respond_to?(:to_refinery_menu_item)
|
|
7
|
-
items << MenuItem.new(item
|
|
8
|
-
end
|
|
11
|
+
items << MenuItem.new(self, item)
|
|
12
|
+
end
|
|
9
13
|
end
|
|
10
14
|
|
|
11
15
|
attr_accessor :items
|
|
@@ -15,14 +19,19 @@ module Refinery
|
|
|
15
19
|
end
|
|
16
20
|
|
|
17
21
|
def roots
|
|
18
|
-
@roots ||=
|
|
22
|
+
@roots ||= select {|item| item.orphan? && item.depth == minimum_depth }
|
|
19
23
|
end
|
|
20
24
|
|
|
21
25
|
def to_s
|
|
22
|
-
|
|
26
|
+
map(&:title).join(' ')
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
delegate :inspect, :map, :select, :detect, :first, :last, :length, :size, :to => :items
|
|
30
|
+
|
|
31
|
+
protected
|
|
32
|
+
def minimum_depth
|
|
33
|
+
map(&:depth).min
|
|
23
34
|
end
|
|
24
35
|
|
|
25
|
-
# The delegation is specified so crazily so that it works on 1.8.x and 1.9.x
|
|
26
|
-
delegate *((Array.instance_methods - Object.instance_methods) << {:to => :items})
|
|
27
36
|
end
|
|
28
37
|
end
|