cmsimple 0.2.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.
- data/.gitignore +31 -0
- data/.rspec +1 -0
- data/.travis.yml +16 -0
- data/Gemfile +20 -0
- data/Gemfile.ci +5 -0
- data/LICENSE +19 -0
- data/README.md +118 -0
- data/Rakefile +47 -0
- data/app/assets/javascripts/cmsimple.js +61 -0
- data/app/assets/javascripts/cmsimple/controllers/editor.coffee +102 -0
- data/app/assets/javascripts/cmsimple/lib/namespaces.coffee +3 -0
- data/app/assets/javascripts/cmsimple/lib/support.coffee +4 -0
- data/app/assets/javascripts/cmsimple/mercury/config.js +462 -0
- data/app/assets/javascripts/cmsimple/mercury/handlers.coffee +9 -0
- data/app/assets/javascripts/cmsimple/models/image.coffee +49 -0
- data/app/assets/javascripts/cmsimple/models/page.coffee +106 -0
- data/app/assets/javascripts/cmsimple/models/path.coffee +31 -0
- data/app/assets/javascripts/cmsimple/models/version.coffee +29 -0
- data/app/assets/javascripts/cmsimple/panels/images/index.coffee +2 -0
- data/app/assets/javascripts/cmsimple/panels/images/list.coffee +48 -0
- data/app/assets/javascripts/cmsimple/panels/images/panel.coffee +69 -0
- data/app/assets/javascripts/cmsimple/panels/images/selection.coffee +52 -0
- data/app/assets/javascripts/cmsimple/panels/page_metadata.coffee +42 -0
- data/app/assets/javascripts/cmsimple/panels/publish.coffee +32 -0
- data/app/assets/javascripts/cmsimple/panels/redirects/form.coffee +51 -0
- data/app/assets/javascripts/cmsimple/panels/redirects/index.coffee +2 -0
- data/app/assets/javascripts/cmsimple/panels/redirects/list.coffee +34 -0
- data/app/assets/javascripts/cmsimple/panels/redirects/panel.coffee +39 -0
- data/app/assets/javascripts/cmsimple/panels/sitemap/index.coffee +2 -0
- data/app/assets/javascripts/cmsimple/panels/sitemap/panel.coffee +40 -0
- data/app/assets/javascripts/cmsimple/panels/sitemap/sortable.coffee +55 -0
- data/app/assets/javascripts/cmsimple/panels/sitemap/tree.coffee +61 -0
- data/app/assets/javascripts/cmsimple/panels/versions/index.coffee +2 -0
- data/app/assets/javascripts/cmsimple/panels/versions/list.coffee +51 -0
- data/app/assets/javascripts/cmsimple/panels/versions/panel.coffee +53 -0
- data/app/assets/javascripts/cmsimple/views/image_library/_item.jst.hamlc +24 -0
- data/app/assets/javascripts/cmsimple/views/image_library/list.jst.hamlc +8 -0
- data/app/assets/javascripts/cmsimple/views/redirects/_path.jst.hamlc +6 -0
- data/app/assets/javascripts/cmsimple/views/redirects/list.jst.hamlc +19 -0
- data/app/assets/javascripts/cmsimple/views/sitemap/_page.jst.hamlc +9 -0
- data/app/assets/javascripts/cmsimple/views/sitemap/tree.jst.hamlc +5 -0
- data/app/assets/javascripts/cmsimple/views/versions/_item.jst.hamlc +6 -0
- data/app/assets/javascripts/cmsimple/views/versions/list.jst.hamlc +4 -0
- data/app/assets/stylesheets/cmsimple.css +15 -0
- data/app/assets/stylesheets/cmsimple/forms.css +10 -0
- data/app/assets/stylesheets/cmsimple/panels.css +399 -0
- data/app/assets/stylesheets/cmsimple/toolbar-images.css +27 -0
- data/app/assets/stylesheets/mercury_overrides.css +2 -0
- data/app/controllers/cmsimple/front_controller.rb +38 -0
- data/app/controllers/cmsimple/images_controller.rb +28 -0
- data/app/controllers/cmsimple/mercury_controller.rb +7 -0
- data/app/controllers/cmsimple/pages_controller.rb +89 -0
- data/app/controllers/cmsimple/paths_controller.rb +23 -0
- data/app/controllers/cmsimple/snippets_controller.rb +23 -0
- data/app/controllers/cmsimple/versions_controller.rb +17 -0
- data/app/helpers/cmsimple/regions_helper.rb +38 -0
- data/app/models/cmsimple/image.rb +19 -0
- data/app/models/cmsimple/page.rb +203 -0
- data/app/models/cmsimple/path.rb +63 -0
- data/app/models/cmsimple/region.rb +43 -0
- data/app/models/cmsimple/snippet.rb +64 -0
- data/app/models/cmsimple/version.rb +18 -0
- data/app/uploaders/image_attachment_uploader.rb +53 -0
- data/app/views/cmsimple/images/_form.html.haml +13 -0
- data/app/views/cmsimple/images/new.html.haml +5 -0
- data/app/views/cmsimple/pages/_form.html.haml +49 -0
- data/app/views/cmsimple/pages/_form_extras.html.haml +2 -0
- data/app/views/cmsimple/pages/edit.html.haml +3 -0
- data/app/views/cmsimple/pages/new.html.haml +3 -0
- data/app/views/cmsimple/pages/publish.html.haml +12 -0
- data/app/views/cmsimple/snippets/index.html.haml +5 -0
- data/app/views/cmsimple/templates/default.html.haml +4 -0
- data/app/views/layouts/editor.html.haml +12 -0
- data/app/views/layouts/panel.html.haml +9 -0
- data/cmsimple.gemspec +44 -0
- data/config.ru +4 -0
- data/config/application.rb +1 -0
- data/config/cucumber.yml +8 -0
- data/config/environment.rb +2 -0
- data/config/routes.rb +34 -0
- data/db/migrate/20120201221410_create_cmsimple_pages.rb +10 -0
- data/db/migrate/20120222185901_add_title_parent_id_and_position_to_pages.rb +10 -0
- data/db/migrate/20120229185214_add_slug_to_pages.rb +7 -0
- data/db/migrate/20120323200439_add_is_root_to_page.rb +5 -0
- data/db/migrate/20120328174339_add_meta_info_to_cmsimple_pages.rb +9 -0
- data/db/migrate/20120329172857_create_cmsimple_path.rb +11 -0
- data/db/migrate/20120407024752_create_cmsimple_images.rb +13 -0
- data/db/migrate/20120410041105_add_timestamps_to_cmsimple_pages.rb +7 -0
- data/db/migrate/20120425211937_add_published_at_to_cmsimple_pages.rb +6 -0
- data/db/migrate/20120430175047_create_cmsimple_versions.rb +13 -0
- data/db/migrate/20120831233927_rename_path_to_current_uri_on_paths.rb +5 -0
- data/features/create.feature +18 -0
- data/features/delete.feature +12 -0
- data/features/edit.feature +54 -0
- data/features/publishing.feature +31 -0
- data/features/redirects.feature +27 -0
- data/features/step_definitions/mercury_steps.rb +440 -0
- data/features/step_definitions/page_steps.rb +269 -0
- data/features/step_definitions/web_steps.rb +254 -0
- data/features/support/env.rb +77 -0
- data/features/support/mercury_content.rb +25 -0
- data/features/support/mercury_selectors.rb +148 -0
- data/features/support/paths.rb +16 -0
- data/features/support/selectors.rb +26 -0
- data/features/support/utils.rb +18 -0
- data/features/versioning.feature +27 -0
- data/features/visit.feature +7 -0
- data/lib/cmsimple.rb +22 -0
- data/lib/cmsimple/configuration.rb +65 -0
- data/lib/cmsimple/exts/to_bool.rb +25 -0
- data/lib/cmsimple/page_responder.rb +46 -0
- data/lib/cmsimple/rails.rb +5 -0
- data/lib/cmsimple/regions_proxy.rb +32 -0
- data/lib/cmsimple/template_resolver.rb +14 -0
- data/lib/cmsimple/template_responder.rb +12 -0
- data/lib/cmsimple/version.rb +3 -0
- data/lib/generators/cmsimple/install/install_generator.rb +46 -0
- data/lib/generators/cmsimple/install/templates/default.html.erb +10 -0
- data/lib/generators/cmsimple/install/templates/default.html.haml +6 -0
- data/lib/generators/cmsimple/install/templates/initializer.rb +22 -0
- data/lib/generators/cmsimple/snippet/snippet_generator.rb +56 -0
- data/lib/generators/cmsimple/snippet/templates/cell.rb +18 -0
- data/lib/generators/cmsimple/snippet/templates/display.html.erb +14 -0
- data/lib/generators/cmsimple/snippet/templates/display.html.haml +11 -0
- data/lib/generators/cmsimple/snippet/templates/options.html.erb +18 -0
- data/lib/generators/cmsimple/snippet/templates/options.html.haml +12 -0
- data/script/app +2 -0
- data/script/migrate +2 -0
- data/script/rails +8 -0
- data/spec/fixtures/rails.png +0 -0
- data/spec/helpers/regions_helper_spec.rb +62 -0
- data/spec/javascripts/controllers/editor_spec.coffee +57 -0
- data/spec/javascripts/models/image_geometry_spec.coffee +64 -0
- data/spec/javascripts/models/image_spec.coffee +4 -0
- data/spec/javascripts/models/page_spec.coffee +121 -0
- data/spec/javascripts/models/path_spec.coffee +39 -0
- data/spec/javascripts/models/version_spec.coffee +31 -0
- data/spec/javascripts/panels/images/selection_spec.coffee +104 -0
- data/spec/javascripts/panels/sitemap/panel_spec.coffee +10 -0
- data/spec/javascripts/panels/sitemap/sortable_spec.coffee +63 -0
- data/spec/javascripts/panels/sitemap/tree_spec.coffee +62 -0
- data/spec/javascripts/spec_helper.coffee +25 -0
- data/spec/javascripts/support/stubs.coffee +16 -0
- data/spec/lib/page_responder_spec.rb +58 -0
- data/spec/lib/regions_proxy_spec.rb +47 -0
- data/spec/models/image_spec.rb +46 -0
- data/spec/models/page_spec.rb +237 -0
- data/spec/models/path_spec.rb +71 -0
- data/spec/models/region_spec.rb +14 -0
- data/spec/models/snippet_spec.rb +57 -0
- data/spec/models/version_spec.rb +7 -0
- data/spec/rails_app/.gitignore +33 -0
- data/spec/rails_app/Rakefile +7 -0
- data/spec/rails_app/app/assets/images/rails.png +0 -0
- data/spec/rails_app/app/assets/javascripts/application.js +9 -0
- data/spec/rails_app/app/assets/stylesheets/application.css +7 -0
- data/spec/rails_app/app/cells/example/display.html.haml +2 -0
- data/spec/rails_app/app/cells/example/options.html.haml +15 -0
- data/spec/rails_app/app/cells/example_cell.rb +19 -0
- data/spec/rails_app/app/cells/image_example/display.html.haml +4 -0
- data/spec/rails_app/app/cells/image_example/options.html.haml +15 -0
- data/spec/rails_app/app/cells/image_example_cell.rb +18 -0
- data/spec/rails_app/app/controllers/application_controller.rb +3 -0
- data/spec/rails_app/app/helpers/application_helper.rb +2 -0
- data/spec/rails_app/app/mailers/.gitkeep +0 -0
- data/spec/rails_app/app/models/.gitkeep +0 -0
- data/spec/rails_app/app/views/cmsimple/_snippet_list.html.haml +8 -0
- data/spec/rails_app/app/views/cmsimple/templates/default.html.haml +19 -0
- data/spec/rails_app/app/views/cmsimple/templates/test.html.haml +2 -0
- data/spec/rails_app/app/views/layouts/application.html.haml +13 -0
- data/spec/rails_app/config.ru +4 -0
- data/spec/rails_app/config/application.rb +65 -0
- data/spec/rails_app/config/boot.rb +9 -0
- data/spec/rails_app/config/database.example.yml +22 -0
- data/spec/rails_app/config/database.travis.yml +8 -0
- data/spec/rails_app/config/environment.rb +5 -0
- data/spec/rails_app/config/environments/development.rb +30 -0
- data/spec/rails_app/config/environments/test.rb +39 -0
- data/spec/rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/rails_app/config/initializers/cells.rb +1 -0
- data/spec/rails_app/config/initializers/cmsimple.rb +3 -0
- data/spec/rails_app/config/initializers/inflections.rb +10 -0
- data/spec/rails_app/config/initializers/mime_types.rb +5 -0
- data/spec/rails_app/config/initializers/secret_token.rb +7 -0
- data/spec/rails_app/config/initializers/session_store.rb +8 -0
- data/spec/rails_app/config/initializers/teabag.rb +58 -0
- data/spec/rails_app/config/initializers/wrap_parameters.rb +14 -0
- data/spec/rails_app/config/locales/en.yml +5 -0
- data/spec/rails_app/config/routes.rb +61 -0
- data/spec/rails_app/db/seeds.rb +11 -0
- data/spec/rails_app/lib/assets/.gitkeep +0 -0
- data/spec/rails_app/lib/tasks/.gitkeep +0 -0
- data/spec/rails_app/public/404.html +26 -0
- data/spec/rails_app/public/422.html +26 -0
- data/spec/rails_app/public/500.html +26 -0
- data/spec/rails_app/public/robots.txt +5 -0
- data/spec/rails_app/script/rails +6 -0
- data/spec/rails_app/vendor/assets/stylesheets/.gitkeep +0 -0
- data/spec/rails_app/vendor/plugins/.gitkeep +0 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/support/active_model_lint_example.rb +14 -0
- data/spec/teabag_env.rb +28 -0
- data/vendor/assets/images/sitemap/has-changes.png +0 -0
- data/vendor/assets/images/sitemap/published.png +0 -0
- data/vendor/assets/images/sitemap/unpublished.png +0 -0
- data/vendor/assets/images/toolbar/metadata.png +0 -0
- data/vendor/assets/images/toolbar/publish.png +0 -0
- data/vendor/assets/images/toolbar/redirect.png +0 -0
- data/vendor/assets/images/toolbar/sitemap.png +0 -0
- data/vendor/assets/images/toolbar/snippets.png +0 -0
- data/vendor/assets/images/toolbar/unpublished.png +0 -0
- data/vendor/assets/images/tree-line-horizontal-last.png +0 -0
- data/vendor/assets/images/tree-line-horizontal.png +0 -0
- data/vendor/assets/images/tree-line-vertical.png +0 -0
- data/vendor/assets/javascripts/jquery-serializeObject.js +107 -0
- data/vendor/assets/javascripts/jquery.to-json.js +74 -0
- data/vendor/assets/javascripts/jquery.ui.nestedSortable-1.3.4.js +391 -0
- data/vendor/assets/javascripts/moment-1.6.2.js +918 -0
- data/vendor/assets/javascripts/underscore-1.3.1.js +31 -0
- data/vendor/assets/stylesheets/jasmine-modified.css +216 -0
- metadata +686 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
|
|
2
|
+
# It is recommended to regenerate this file in the future when you upgrade to a
|
|
3
|
+
# newer version of cucumber-rails. Consider adding your own code to a new file
|
|
4
|
+
# instead of editing this one. Cucumber will automatically load all features/**/*.rb
|
|
5
|
+
# files.
|
|
6
|
+
ENV['RAILS_ENV'] = 'test'
|
|
7
|
+
|
|
8
|
+
require 'cucumber/rails'
|
|
9
|
+
require 'capybara/rails'
|
|
10
|
+
|
|
11
|
+
Capybara.register_driver :selenium do |app|
|
|
12
|
+
Capybara::Selenium::Driver.new(app, :resynchronize => true)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In
|
|
16
|
+
# order to ease the transition to Capybara we set the default here. If you'd
|
|
17
|
+
# prefer to use XPath just remove this line and adjust any selectors in your
|
|
18
|
+
# steps to use the XPath syntax.
|
|
19
|
+
Capybara.default_selector = :css
|
|
20
|
+
Capybara.ignore_hidden_elements = true
|
|
21
|
+
|
|
22
|
+
Capybara.default_wait_time = ENV['CI_WAIT_TIME'].try(:to_i) || 4
|
|
23
|
+
|
|
24
|
+
# By default, any exception happening in your Rails application will bubble up
|
|
25
|
+
# to Cucumber so that your scenario will fail. This is a different from how
|
|
26
|
+
# your application behaves in the production environment, where an error page will
|
|
27
|
+
# be rendered instead.
|
|
28
|
+
#
|
|
29
|
+
# Sometimes we want to override this default behaviour and allow Rails to rescue
|
|
30
|
+
# exceptions and display an error page (just like when the app is running in production).
|
|
31
|
+
# Typical scenarios where you want to do this is when you test your error pages.
|
|
32
|
+
# There are two ways to allow Rails to rescue exceptions:
|
|
33
|
+
#
|
|
34
|
+
# 1) Tag your scenario (or feature) with @allow-rescue
|
|
35
|
+
#
|
|
36
|
+
# 2) Set the value below to true. Beware that doing this globally is not
|
|
37
|
+
# recommended as it will mask a lot of errors for you!
|
|
38
|
+
#
|
|
39
|
+
ActionController::Base.allow_rescue = true
|
|
40
|
+
|
|
41
|
+
# Remove/comment out the lines below if your app doesn't have a database.
|
|
42
|
+
# For some databases (like MongoDB and CouchDB) you may need to use :truncation instead.
|
|
43
|
+
begin
|
|
44
|
+
DatabaseCleaner.strategy = :transaction
|
|
45
|
+
rescue NameError
|
|
46
|
+
raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it."
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# You may also want to configure DatabaseCleaner to use different strategies for certain features and scenarios.
|
|
50
|
+
# See the DatabaseCleaner documentation for details. Example:
|
|
51
|
+
#
|
|
52
|
+
# Before('@no-txn,@selenium,@culerity,@celerity,@javascript') do
|
|
53
|
+
# DatabaseCleaner.strategy = :truncation, {:except => %w[widgets]}
|
|
54
|
+
# end
|
|
55
|
+
#
|
|
56
|
+
# Before('~@no-txn', '~@selenium', '~@culerity', '~@celerity', '~@javascript') do
|
|
57
|
+
# DatabaseCleaner.strategy = :transaction
|
|
58
|
+
# end
|
|
59
|
+
#
|
|
60
|
+
|
|
61
|
+
# Possible values are :truncation and :transaction
|
|
62
|
+
# The :transaction strategy is faster, but might give you threading problems.
|
|
63
|
+
# See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature
|
|
64
|
+
Cucumber::Rails::Database.javascript_strategy = :truncation
|
|
65
|
+
|
|
66
|
+
Before('@allow_hidden_elements') do
|
|
67
|
+
Capybara.ignore_hidden_elements = false
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
After('@allow_hidden_elements') do
|
|
71
|
+
Capybara.ignore_hidden_elements = true
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Always run maximized so the toolbar is showing
|
|
75
|
+
Before('@javascript') do
|
|
76
|
+
page.driver.browser.manage.window.maximize
|
|
77
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module MercuryContentsHelpers
|
|
2
|
+
def contents_for(name)
|
|
3
|
+
case name
|
|
4
|
+
when 'simple content' then "this is <span>simple</span> <b>content</b>"
|
|
5
|
+
when 'justifiable content' then "<div>first line</div><br/>this is <span>justifiable</span> <b>content</b>"
|
|
6
|
+
when 'wrapped content' then "<span>this <a href='http://google.com'>is</a> <i>wrapped</i> <b>content</b></span>"
|
|
7
|
+
when 'an image' then "this is <img src='/assets/mercury/temp-logo.png'> <b>content</b>"
|
|
8
|
+
when 'a table' then "this is a <table><tr><td><span>1</span></td><td><span>2</span></td></tr><tr><td><span>3</span></td><td><span>4</span></td></tr></table> <b>content</b>"
|
|
9
|
+
when 'the snippet', 'that snippet' then "<div class='mercury-snippet' data-snippet='#{@snippet_id || 'snippet_42'}'>#{@snippet_id || 'snippet_42'}</div> <b>content</b>"
|
|
10
|
+
|
|
11
|
+
else name
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def parse_snippet_options_from(options_string)
|
|
16
|
+
json = []
|
|
17
|
+
options_string.scan(/(?:,\s)?([^:]*): ("[^"]*")/).each do |pair|
|
|
18
|
+
json << %Q{'options[#{pair[0]}]': #{pair[1]}}
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
"{#{json.join(', ')}}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
World(MercuryContentsHelpers)
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
module MercurySelectorsHelpers
|
|
2
|
+
|
|
3
|
+
def mercury_selector_for(locator)
|
|
4
|
+
case locator
|
|
5
|
+
|
|
6
|
+
# toolbar selectors
|
|
7
|
+
when 'the toolbar' then '.mercury-toolbar-container'
|
|
8
|
+
|
|
9
|
+
when /^the "(.*?)" button$/
|
|
10
|
+
".mercury-primary-toolbar .mercury-#{mercury_button_mapping_for($1)}-button, .mercury-primary-expander .mercury-expander-button[data-button='#{mercury_button_mapping_for($1)}']"
|
|
11
|
+
|
|
12
|
+
when /^the (.*?) editor (button|dropdown|palette)$/
|
|
13
|
+
".mercury-editable-toolbar .mercury-#{mercury_button_mapping_for($1)}-button"
|
|
14
|
+
|
|
15
|
+
when /^the (.*?) toolbar button$/
|
|
16
|
+
".mercury-snippet-toolbar .mercury-#{mercury_button_mapping_for($1)}-button"
|
|
17
|
+
|
|
18
|
+
when /^the (.*?) select$/
|
|
19
|
+
".mercury-#{mercury_button_mapping_for($1)}-select"
|
|
20
|
+
|
|
21
|
+
when /^the (.*?) palette$/
|
|
22
|
+
".mercury-#{mercury_button_mapping_for($1)}-palette"
|
|
23
|
+
|
|
24
|
+
# palette / select dropdown
|
|
25
|
+
when 'the color red' then '.mercury-palette .picker:nth-child(22n)'
|
|
26
|
+
|
|
27
|
+
when 'the red style' then '.mercury-select-options .red'
|
|
28
|
+
when 'the heading 2 block' then '.mercury-select-options h2'
|
|
29
|
+
|
|
30
|
+
# statusbar selectors
|
|
31
|
+
when 'the statusbar' then '.mercury-statusbar'
|
|
32
|
+
when 'the about the editor link' then 'a.mercury-statusbar-about'
|
|
33
|
+
|
|
34
|
+
# panel selectors
|
|
35
|
+
when 'the panel', /^the (.*?) panel$/ then '.mercury-panel'
|
|
36
|
+
|
|
37
|
+
# modal window selectors
|
|
38
|
+
when 'the modal', 'the modal window', /^the (.*?) modal$/ then '.mercury-modal'
|
|
39
|
+
when 'the modal overlay' then '.mercury-modal-overlay'
|
|
40
|
+
when 'the modal title' then '.mercury-modal h1.mercury-modal-title'
|
|
41
|
+
when 'the modal close button' then '.mercury-modal h1.mercury-modal-title a'
|
|
42
|
+
|
|
43
|
+
when 'the sweet snowman' then '.mercury-modal .character:nth-child(247n)'
|
|
44
|
+
|
|
45
|
+
when 'the first cell in the first row' then '.mercury-modal tr:nth-child(1n) td:nth-child(1n)'
|
|
46
|
+
when 'the third cell in the first row' then '.mercury-modal tr:nth-child(1n) td:nth-child(3n)'
|
|
47
|
+
when 'the forth cell in the first row' then '.mercury-modal tr:nth-child(1n) td:nth-child(4n)'
|
|
48
|
+
when 'the second cell in the second row' then '.mercury-modal tr:nth-child(2n) td:nth-child(2n)'
|
|
49
|
+
when 'the forth cell in the second row' then '.mercury-modal tr:nth-child(2n) td:nth-child(4n)'
|
|
50
|
+
|
|
51
|
+
when 'a selected cell' then '.mercury-modal td.selected'
|
|
52
|
+
|
|
53
|
+
# lightview selectors
|
|
54
|
+
when 'the lightview', 'the lightview window', /^the (.*?) lightview$/ then '.mercury-lightview'
|
|
55
|
+
when 'the lightview overlay' then '.mercury-lightview-overlay'
|
|
56
|
+
when 'the lightview title' then '.mercury-lightview h1.mercury-lightview-title'
|
|
57
|
+
when 'the lightview close button' then '.mercury-lightview h1.mercury-lightview-title a'
|
|
58
|
+
|
|
59
|
+
# snippet selectors
|
|
60
|
+
when 'the snippet toolbar' then '.mercury-snippet-toolbar'
|
|
61
|
+
when 'the snippet', 'that snippet' then "div[data-snippet=#{@snippet_id || 'snippet_0'}]"
|
|
62
|
+
|
|
63
|
+
# other selectors
|
|
64
|
+
when 'the first image' then 'img:nth-child(1n)'
|
|
65
|
+
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def mercury_button_mapping_for(locator)
|
|
70
|
+
case locator.downcase
|
|
71
|
+
|
|
72
|
+
# primary toolbar
|
|
73
|
+
when 'save' then 'save'
|
|
74
|
+
when 'preview' then 'preview'
|
|
75
|
+
when 'undo' then 'undo'
|
|
76
|
+
when 'redo' then 'redo'
|
|
77
|
+
when 'link', 'insert link' then 'insertLink'
|
|
78
|
+
when 'media', 'insert media' then 'insertMedia'
|
|
79
|
+
when 'table', 'insert table' then 'insertTable'
|
|
80
|
+
when 'character', 'insert character' then 'insertCharacter'
|
|
81
|
+
when 'snippet', 'insert snippet' then 'snippetPanel'
|
|
82
|
+
when 'history', 'view history' then 'historyPanel'
|
|
83
|
+
when 'notes', 'view notes' then 'notesPanel'
|
|
84
|
+
|
|
85
|
+
# editor toolbar
|
|
86
|
+
when 'predefined styles' then 'style'
|
|
87
|
+
when 'block format' then 'formatblock'
|
|
88
|
+
when 'backcolor', 'background color' then 'backColor'
|
|
89
|
+
when 'forecolor', 'foreground color' then 'foreColor'
|
|
90
|
+
when 'italicize' then 'italic'
|
|
91
|
+
when 'overline' then 'overline'
|
|
92
|
+
when 'strike through' then 'strikethrough'
|
|
93
|
+
when 'underline' then 'underline'
|
|
94
|
+
when 'subscript' then 'subscript'
|
|
95
|
+
when 'superscript' then 'superscript'
|
|
96
|
+
when 'justify left', 'left justify' then 'justifyLeft'
|
|
97
|
+
when 'justify center', 'center justify' then 'justifyCenter'
|
|
98
|
+
when 'justify right', 'right justify' then 'justifyRight'
|
|
99
|
+
when 'justify full', 'full justification' then 'justifyFull'
|
|
100
|
+
when 'unordered list', 'insert unordered list' then 'insertUnorderedList'
|
|
101
|
+
when 'ordered list', 'insert ordered list' then 'insertOrderedList'
|
|
102
|
+
when 'hr', 'insert hr', 'horizontal rule', 'insert horizontal rule' then 'horizontalRule'
|
|
103
|
+
when 'clean formatting', 'remove formatting' then 'removeFormatting'
|
|
104
|
+
when 'html editor' then 'htmlEditor'
|
|
105
|
+
|
|
106
|
+
# table context buttons
|
|
107
|
+
when 'add row before', 'insert row before' then 'insertRowBefore'
|
|
108
|
+
when 'add row after', 'insert row after' then 'insertRowAfter'
|
|
109
|
+
when 'delete row' then 'deleteRow'
|
|
110
|
+
when 'add column before', 'insert column before' then 'insertColumnBefore'
|
|
111
|
+
when 'add column after', 'insert column after' then 'insertColumnAfter'
|
|
112
|
+
when 'delete column' then 'deleteColumn'
|
|
113
|
+
when 'increase colspan' then 'increaseColspan'
|
|
114
|
+
when 'decrease colspan' then 'decreaseColspan'
|
|
115
|
+
when 'increase rowspan' then 'increaseRowspan'
|
|
116
|
+
when 'decrease rowspan' then 'decreaseRowspan'
|
|
117
|
+
|
|
118
|
+
# snippet toolbar
|
|
119
|
+
when 'edit snippet settings', 'edit snippet' then 'editSnippet'
|
|
120
|
+
when 'remove snippet' then 'removeSnippet'
|
|
121
|
+
|
|
122
|
+
else locator
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def region_selector_for(locator)
|
|
127
|
+
case locator.downcase
|
|
128
|
+
|
|
129
|
+
when 'the first editable region', 'the editable region' then '#editable1'
|
|
130
|
+
when 'the first markupable region', 'the markupable region', 'the markdown region' then '#markupable1'
|
|
131
|
+
when 'the first snippetable region', 'the first snippet region', 'the snippetable region', 'the snippet region' then '#snippetable1'
|
|
132
|
+
|
|
133
|
+
else locator
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def snippet_name_for(locator)
|
|
138
|
+
case locator.downcase
|
|
139
|
+
|
|
140
|
+
when 'the example snippet' then 'example'
|
|
141
|
+
|
|
142
|
+
else locator
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
World(MercurySelectorsHelpers)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
module NavigationHelpers
|
|
3
|
+
# Maps a name to a path. Used by the
|
|
4
|
+
#
|
|
5
|
+
# When /^I go to (.+)$/ do |page_name|
|
|
6
|
+
#
|
|
7
|
+
# step definition in web_steps.rb
|
|
8
|
+
PATHS = {
|
|
9
|
+
"the home page" => '/'
|
|
10
|
+
}
|
|
11
|
+
def path_to(page_name)
|
|
12
|
+
PATHS[page_name] || page_name.gsub('"', '')
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
World(NavigationHelpers)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
|
|
2
|
+
module HtmlSelectorsHelpers
|
|
3
|
+
# Maps a name to a selector. Used primarily by the
|
|
4
|
+
#
|
|
5
|
+
# When /^(.+) within (.+)$/ do |step, scope|
|
|
6
|
+
#
|
|
7
|
+
# step definitions in web_steps.rb
|
|
8
|
+
#
|
|
9
|
+
def selector_for(locator)
|
|
10
|
+
|
|
11
|
+
# add in for mercury support
|
|
12
|
+
result = mercury_selector_for(locator)
|
|
13
|
+
return result if result.present?
|
|
14
|
+
|
|
15
|
+
case locator
|
|
16
|
+
when /the page/
|
|
17
|
+
"html > body"
|
|
18
|
+
when /"(.+)"/
|
|
19
|
+
$1
|
|
20
|
+
else
|
|
21
|
+
raise "Can't find mapping from \"#{locator}\" to a selector.\n" +
|
|
22
|
+
"Now, go and add a mapping in #{__FILE__}"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
World(HtmlSelectorsHelpers)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module StepUtils
|
|
2
|
+
def wait_for_client_page_refresh
|
|
3
|
+
page.driver.execute_script("window.__page_refreshed = false; CMSimple.Page.one('refresh', function(){ window.__page_refreshed = true; });")
|
|
4
|
+
yield
|
|
5
|
+
wait_until(10) do
|
|
6
|
+
page.evaluate_script('window.__page_refreshed') == true
|
|
7
|
+
# not sure why this makes the tests pass
|
|
8
|
+
sleep(1)
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def allow_hidden_elements
|
|
13
|
+
Capybara.ignore_hidden_elements = false
|
|
14
|
+
yield
|
|
15
|
+
Capybara.ignore_hidden_elements = true
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
World(StepUtils)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
@javascript
|
|
2
|
+
Feature: As a user I should be able to view different versions of pages on the site
|
|
3
|
+
|
|
4
|
+
Background:
|
|
5
|
+
Given a page exists at a custom path with custom content
|
|
6
|
+
And I visit that page's edit path
|
|
7
|
+
|
|
8
|
+
Scenario: As a user I should be able to see the versions
|
|
9
|
+
that have been created when I publish a page
|
|
10
|
+
Given I open the sitemap
|
|
11
|
+
And I add a new page
|
|
12
|
+
When I publish the current page
|
|
13
|
+
And I open the page's history
|
|
14
|
+
Then I there should be one version in the history panel
|
|
15
|
+
|
|
16
|
+
Scenario: As a user I should be able to view the page
|
|
17
|
+
at a particular version that has been published
|
|
18
|
+
Given I open the sitemap
|
|
19
|
+
And I add a new page
|
|
20
|
+
And I publish the current page
|
|
21
|
+
When I publish a new version of the current page
|
|
22
|
+
And I open the page's history
|
|
23
|
+
And I view the old version
|
|
24
|
+
Then I should see the old version
|
|
25
|
+
# When I view the new version
|
|
26
|
+
# Then I should see the new version
|
|
27
|
+
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Feature: As a user I should be able to visit pages on the site
|
|
2
|
+
|
|
3
|
+
Scenario: As a user I should be able to view a page with custom content at a specified path
|
|
4
|
+
Given a page exists at a custom path with custom content
|
|
5
|
+
When I visit that page's path
|
|
6
|
+
Then I should see that page's content in it's template
|
|
7
|
+
|
data/lib/cmsimple.rb
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require 'cmsimple/version'
|
|
2
|
+
require 'rails'
|
|
3
|
+
require 'mercury-rails'
|
|
4
|
+
require 'cells'
|
|
5
|
+
require 'carrierwave'
|
|
6
|
+
require 'dimensions'
|
|
7
|
+
|
|
8
|
+
# dependencies we want to reduce the
|
|
9
|
+
# need of after codebase stabilizes
|
|
10
|
+
require 'spine-rails'
|
|
11
|
+
require 'haml-rails'
|
|
12
|
+
require 'haml_coffee_assets'
|
|
13
|
+
require 'cmsimple/configuration'
|
|
14
|
+
|
|
15
|
+
require 'cmsimple/rails'
|
|
16
|
+
require 'cmsimple/template_resolver'
|
|
17
|
+
require 'cmsimple/template_responder'
|
|
18
|
+
require 'cmsimple/page_responder'
|
|
19
|
+
require 'cmsimple/regions_proxy'
|
|
20
|
+
|
|
21
|
+
require 'cmsimple/exts/to_bool'
|
|
22
|
+
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module Cmsimple
|
|
2
|
+
class Configuration
|
|
3
|
+
def initialize
|
|
4
|
+
# the parent controller for the front controller
|
|
5
|
+
self.parent_front_controller = 'ApplicationController'
|
|
6
|
+
# the parent controller for all CRUD controllers
|
|
7
|
+
self.parent_controller = 'ApplicationController'
|
|
8
|
+
# where the templates are located in the project
|
|
9
|
+
self.template_path = 'cmsimple/templates'
|
|
10
|
+
# set a template strategy (i.e. if you wanted to build a db backed template system)
|
|
11
|
+
self.template_strategy = :basic
|
|
12
|
+
# the path carrierwave will use to store image assets
|
|
13
|
+
self.asset_path = 'uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}'
|
|
14
|
+
# the library to use for processing images in carrierwave (rmagick or mini_magick)
|
|
15
|
+
self.image_processor = :mini_magick
|
|
16
|
+
# stylesheets to be included in the editor layout page
|
|
17
|
+
self.editor_stylesheets = ['cmsimple']
|
|
18
|
+
# javascripts to be included in the editor layout page
|
|
19
|
+
self.editor_javascripts = ['cmsimple']
|
|
20
|
+
# set this to change layouts or pass other params into rendering a template
|
|
21
|
+
self.template_render_options = {}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
attr_accessor :parent_controller,
|
|
25
|
+
:parent_front_controller,
|
|
26
|
+
:template_path,
|
|
27
|
+
:asset_path,
|
|
28
|
+
:image_processor,
|
|
29
|
+
:editor_stylesheets,
|
|
30
|
+
:editor_javascripts,
|
|
31
|
+
:template_render_options
|
|
32
|
+
|
|
33
|
+
attr_writer :template_strategy
|
|
34
|
+
|
|
35
|
+
def template_strategy
|
|
36
|
+
case @template_strategy
|
|
37
|
+
when :basic
|
|
38
|
+
Cmsimple::TemplateResponder
|
|
39
|
+
else
|
|
40
|
+
@template_strategy.constantize
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def image_processor_mixin
|
|
45
|
+
case @image_processor
|
|
46
|
+
when :rmagick
|
|
47
|
+
CarrierWave::RMagick
|
|
48
|
+
else
|
|
49
|
+
CarrierWave::MiniMagick
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class << self
|
|
56
|
+
attr_accessor :configuration
|
|
57
|
+
|
|
58
|
+
# Configure CMSimple
|
|
59
|
+
#
|
|
60
|
+
def configure
|
|
61
|
+
self.configuration ||= Configuration.new
|
|
62
|
+
yield self.configuration
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
class String
|
|
2
|
+
def to_bool
|
|
3
|
+
return true if self == true || self =~ (/(true|t|yes|y|1)$/i)
|
|
4
|
+
return false if self == false || self.blank? || self =~ (/(false|f|no|n|0)$/i)
|
|
5
|
+
raise ArgumentError.new("invalid value for Boolean: \"#{self}\"")
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class TrueClass
|
|
10
|
+
def to_bool
|
|
11
|
+
self
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class FalseClass
|
|
16
|
+
def to_bool
|
|
17
|
+
self
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class NilClass
|
|
22
|
+
def to_bool
|
|
23
|
+
false
|
|
24
|
+
end
|
|
25
|
+
end
|