dandify 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +22 -0
- data/README.md +52 -0
- data/Rakefile +15 -0
- data/app/assets/javascripts/spree/backend/dandify.js +0 -0
- data/app/assets/javascripts/spree/frontend/dandify.js +0 -0
- data/app/assets/stylesheets/spree/backend/dandify.css +42 -0
- data/app/assets/stylesheets/spree/frontend/dandify.css +0 -0
- data/app/controllers/spree/admin/stylesheets_controller.rb +58 -0
- data/app/controllers/spree/stylesheets_controller.rb +15 -0
- data/app/helpers/spree/admin/navigation_helper_decorator.rb +9 -0
- data/app/helpers/spree/admin/stylesheet_helper.rb +9 -0
- data/app/models/spree/blank_stylesheet.rb +7 -0
- data/app/models/spree/stylesheet.rb +30 -0
- data/app/models/spree/stylesheet_version.rb +5 -0
- data/app/models/spree/user_decorator.rb +5 -0
- data/app/overrides/spree/admin/shared/_configuration_menu/add_dandify_to_admin_configuration_sidebar.html.erb.deface +2 -0
- data/app/overrides/spree/shared/_head/add_dandystyles_link.html.erb.deface +2 -0
- data/app/views/spree/admin/stylesheets/_form.html.erb +11 -0
- data/app/views/spree/admin/stylesheets/_versions.html.erb +32 -0
- data/app/views/spree/admin/stylesheets/edit.html.erb +19 -0
- data/app/views/spree/admin/stylesheets/new.html.erb +19 -0
- data/app/views/spree/admin/stylesheets/show.html.erb +23 -0
- data/app/views/spree/stylesheets/show.css.erb +1 -0
- data/config/locales/en.yml +37 -0
- data/config/routes.rb +9 -0
- data/config/spring.rb +1 -0
- data/db/migrate/20140616202617_create_spree_stylesheets.rb +10 -0
- data/db/migrate/20140617221725_add_paper_trail_versions.rb +13 -0
- data/lib/dandify.rb +7 -0
- data/lib/dandify/engine.rb +18 -0
- data/lib/dandify/version.rb +3 -0
- data/lib/generators/dandify/install/install_generator.rb +24 -0
- data/lib/tasks/dandify_tasks.rake +4 -0
- data/spec/controllers/spree/admin/stylesheets_controller_spec.rb +71 -0
- data/spec/controllers/spree/stylesheets_controller_spec.rb +36 -0
- data/spec/factories/stylesheet_factory.rb +5 -0
- data/spec/features/dandy_style_spec.rb +10 -0
- data/spec/features/managing_stylsheet_spec.rb +80 -0
- data/spec/features/sidebar_spec.rb +41 -0
- data/spec/features/viewing_admin_spec.rb +49 -0
- data/spec/helpers/admin/navigation_helper_spec.rb +14 -0
- data/spec/models/spree/blank_stylesheet_spec.rb +7 -0
- data/spec/models/spree/stylesheet_spec.rb +102 -0
- data/spec/spec_helper.rb +59 -0
- metadata +296 -0
data/config/routes.rb
ADDED
data/config/spring.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Spring.application_root = './spec/dummy'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class AddPaperTrailVersions < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :versions do |t|
|
4
|
+
t.string :item_type, :null => false
|
5
|
+
t.integer :item_id, :null => false
|
6
|
+
t.string :event, :null => false
|
7
|
+
t.string :whodunnit
|
8
|
+
t.text :object
|
9
|
+
t.datetime :created_at
|
10
|
+
end
|
11
|
+
add_index :versions, [:item_type, :item_id]
|
12
|
+
end
|
13
|
+
end
|
data/lib/dandify.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Dandify
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
require 'spree/core'
|
4
|
+
isolate_namespace Spree
|
5
|
+
engine_name 'dandify'
|
6
|
+
|
7
|
+
config.autoload_paths += Dir["#{config.root}/lib"]
|
8
|
+
config.generators { |gen| gen.test_framework :rspec }
|
9
|
+
|
10
|
+
def self.activate
|
11
|
+
Dir[File.join(__dir__, '../../app/**/*_decorator*.rb')].each do |klass|
|
12
|
+
Rails.application.config.cache_classes ? require(klass) : load(klass)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
config.to_prepare(&method(:activate).to_proc)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Dandify
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
class_option :auto_run_migrations, type: :boolean, default: true
|
5
|
+
|
6
|
+
def add_migrations
|
7
|
+
run 'bundle exec rake railties:install:migrations FROM=dandify'
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_stylesheets
|
11
|
+
inject_into_file 'vendor/assets/stylesheets/spree/backend/all.css', "*= require spree/backend/dandify\n", before: /\*\//, verbose: true
|
12
|
+
end
|
13
|
+
|
14
|
+
def run_migrations
|
15
|
+
res = ask('Would you like to run the migrations now? [Y/n]').downcase
|
16
|
+
if ['', 'y'].include?(res)
|
17
|
+
run 'bundle exec rake db:migrate'
|
18
|
+
else
|
19
|
+
logger 'Skipping rake db:migrate, don\'t forget to run it!'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Admin::StylesheetsController do
|
4
|
+
stub_authorization!
|
5
|
+
|
6
|
+
let(:show_path) { spree.admin_stylesheets_path }
|
7
|
+
let(:good_style) { 'body {color:#ffff00;}' }
|
8
|
+
let(:bad_style) { 'body {color:#ffff00;' }
|
9
|
+
|
10
|
+
before do
|
11
|
+
user = create :admin_user
|
12
|
+
controller.stub(try_spree_current_user: user)
|
13
|
+
end
|
14
|
+
|
15
|
+
context '#show' do
|
16
|
+
it 'assigns new instance when none is found' do
|
17
|
+
spree_get :show
|
18
|
+
expect(assigns[:style]).to be_new_record
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'assigns existing' do
|
22
|
+
style = create :stylesheet
|
23
|
+
spree_get :show
|
24
|
+
expect(assigns[:style]).to eq style
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context '#new' do
|
29
|
+
it 'can create first a revision' do
|
30
|
+
style = create :stylesheet
|
31
|
+
spree_get :show
|
32
|
+
expect(assigns[:style]).to eq style
|
33
|
+
expect(response).to render_template(:show)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'can not create first revision because error' do
|
37
|
+
spree_post :create, stylesheet: { style_raw: bad_style }
|
38
|
+
expect(response).to render_template(:new)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context '#edit' do
|
43
|
+
it 'can create a revision' do
|
44
|
+
create :stylesheet
|
45
|
+
spree_get :show
|
46
|
+
expect(response).to render_template(:show)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'can not create a revision because error' do
|
50
|
+
spree_post :update, stylesheet: { style_raw: bad_style }
|
51
|
+
expect(response).to render_template(:edit)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context '#restore', versioning: true do
|
56
|
+
before { create :stylesheet }
|
57
|
+
|
58
|
+
it 'fails to reify when there is only one revision' do
|
59
|
+
spree_post :restore
|
60
|
+
expect(flash[:error]).to eq Spree.t('dandify.restore.error')
|
61
|
+
expect(response).to redirect_to show_path
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'able to reify when there is more than one revision' do
|
65
|
+
spree_post :update, stylesheet: { style_raw: good_style }
|
66
|
+
spree_post :restore
|
67
|
+
expect(flash[:success]).to eq Spree.t('dandify.restore.success')
|
68
|
+
expect(response).to redirect_to show_path
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::StylesheetsController, '#show' do
|
4
|
+
context 'with a bad format' do
|
5
|
+
it 'responds with blank sheet' do
|
6
|
+
spree_get :show, format: :xml
|
7
|
+
|
8
|
+
expect(response.header['Content-Type']).to include 'text/css'
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'responds with found sheet' do
|
12
|
+
css = create(:stylesheet).style_compressed
|
13
|
+
spree_get :show, format: :atom
|
14
|
+
|
15
|
+
expect(response.header['Content-Type']).to include 'text/css'
|
16
|
+
expect(assigns[:style].style_compressed).to eq css
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when there is no stylesheet' do
|
21
|
+
it 'displays a blank stylesheet' do
|
22
|
+
spree_get :show, format: :css
|
23
|
+
|
24
|
+
expect(assigns[:style]).to be_a Spree::BlankStylesheet
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when there is a stylesheet' do
|
29
|
+
it 'assigns the stored sheet' do
|
30
|
+
create :stylesheet
|
31
|
+
spree_get :show, format: :css
|
32
|
+
|
33
|
+
expect(assigns[:style]).to be_a Spree::Stylesheet
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Managing stylesheets' do
|
4
|
+
stub_authorization!
|
5
|
+
|
6
|
+
let(:show_path) { spree.admin_stylesheets_path }
|
7
|
+
let(:new_path) { spree.new_admin_stylesheets_path }
|
8
|
+
let(:edit_path) { spree.edit_admin_stylesheets_path }
|
9
|
+
let(:restore_path) { spree.restore_admin_stylesheets_path }
|
10
|
+
let(:style) { 'body {display: none;}' }
|
11
|
+
|
12
|
+
context 'without existing style' do
|
13
|
+
scenario 'user can create styles' do
|
14
|
+
visit new_path
|
15
|
+
fill_in Spree.t('dandify.form.label'), with: style
|
16
|
+
click_button Spree.t(:create)
|
17
|
+
|
18
|
+
expect(page.status_code).to be(200)
|
19
|
+
expect(page).to have_text Spree.t('dandify.show.title')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'with existing style' do
|
24
|
+
before { create :stylesheet }
|
25
|
+
|
26
|
+
scenario 'user sees first audit trail', versioning: true do
|
27
|
+
visit show_path
|
28
|
+
|
29
|
+
within_row(1) { expect(page).to have_content('Create') }
|
30
|
+
end
|
31
|
+
|
32
|
+
scenario 'user can edit exiting styles' do
|
33
|
+
visit edit_path
|
34
|
+
|
35
|
+
fill_in Spree.t('dandify.form.label'), with: style
|
36
|
+
click_button Spree.t(:update)
|
37
|
+
|
38
|
+
expect(page.status_code).to be(200)
|
39
|
+
expect(page).to have_text(Spree.t('dandify.show.title'))
|
40
|
+
end
|
41
|
+
|
42
|
+
scenario 'user creates new audit trail on edit', versioning: true do
|
43
|
+
visit edit_path
|
44
|
+
|
45
|
+
fill_in Spree.t('dandify.form.label'), with: style
|
46
|
+
click_button Spree.t(:update)
|
47
|
+
|
48
|
+
visit show_path
|
49
|
+
|
50
|
+
within_row(1) { page.should have_content('Update') }
|
51
|
+
within_row(2) { page.should have_content('Create') }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'restoring stylesheet' do
|
56
|
+
before { create :stylesheet }
|
57
|
+
|
58
|
+
let(:css_path) { 'table#listing_versions tbody tr' }
|
59
|
+
|
60
|
+
scenario 'not possible when there is only one version', versioning: true do
|
61
|
+
visit show_path
|
62
|
+
|
63
|
+
page.should have_css(css_path, count: 1)
|
64
|
+
within_row(1) { expect(page).to have_link('', href: edit_path) }
|
65
|
+
end
|
66
|
+
|
67
|
+
scenario 'user can restore to previous version', versioning: true do
|
68
|
+
visit edit_path
|
69
|
+
|
70
|
+
fill_in Spree.t('dandify.form.label'), with: style
|
71
|
+
click_button Spree.t(:update)
|
72
|
+
|
73
|
+
visit show_path
|
74
|
+
|
75
|
+
page.should have_css(css_path, count: 2)
|
76
|
+
within_row(1) { expect(page).to have_link('', href: edit_path) }
|
77
|
+
within_row(2) { expect(page).to have_link('', href: restore_path) }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'In the admin' do
|
4
|
+
stub_authorization!
|
5
|
+
|
6
|
+
let(:configuration_path) { spree.edit_admin_general_settings_path }
|
7
|
+
let(:show_path) { spree.admin_stylesheets_path }
|
8
|
+
let(:new_path) { spree.new_admin_stylesheets_path }
|
9
|
+
let(:edit_path) { spree.edit_admin_stylesheets_path }
|
10
|
+
|
11
|
+
context 'on the configuration page' do
|
12
|
+
it 'the user views Dandify link in sidebar' do
|
13
|
+
visit configuration_path
|
14
|
+
expect(page).to have_link(Spree.t('dandify.sidebar'), href: show_path)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'the user views non-highlighted Dandify link in sidebar' do
|
18
|
+
visit configuration_path
|
19
|
+
expect(page).to_not(
|
20
|
+
have_selector(:css, "li.active a[href='#{show_path}']")
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'the user views highlighted sidebar link' do
|
26
|
+
it 'on Dandify show page' do
|
27
|
+
visit show_path
|
28
|
+
expect(page).to have_selector(:css, "li.active a[href='#{show_path}']")
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'on Dandify edit page' do
|
32
|
+
visit edit_path
|
33
|
+
expect(page).to have_selector(:css, "li.active a[href='#{show_path}']")
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'on Dandify new page' do
|
37
|
+
visit new_path
|
38
|
+
expect(page).to have_selector(:css, "li.active a[href='#{show_path}']")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Viewing stylesheet administration page' do
|
4
|
+
stub_authorization!
|
5
|
+
|
6
|
+
let(:show_path) { spree.admin_stylesheets_path }
|
7
|
+
|
8
|
+
context 'without existing style' do
|
9
|
+
scenario 'user views page with no stylesheet' do
|
10
|
+
visit show_path
|
11
|
+
|
12
|
+
expect(page).to have_text Spree.t('dandify.show.none')
|
13
|
+
end
|
14
|
+
|
15
|
+
scenario 'user has access to create link' do
|
16
|
+
visit show_path
|
17
|
+
|
18
|
+
expect(page).to have_text Spree.t('dandify.show.buttons.new')
|
19
|
+
end
|
20
|
+
|
21
|
+
scenario 'user does not have access to edit link' do
|
22
|
+
visit show_path
|
23
|
+
|
24
|
+
expect(page).to_not have_text Spree.t('dandify.show.buttons.edit')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'with existing style' do
|
29
|
+
before { create :stylesheet }
|
30
|
+
|
31
|
+
scenario 'user views page with an active stylesheet' do
|
32
|
+
visit show_path
|
33
|
+
|
34
|
+
expect(page).to_not have_text Spree.t('dandify.show.none')
|
35
|
+
end
|
36
|
+
|
37
|
+
scenario 'user does not have access to create link' do
|
38
|
+
visit show_path
|
39
|
+
|
40
|
+
expect(page).to_not have_text Spree.t('dandify.show.buttons.new')
|
41
|
+
end
|
42
|
+
|
43
|
+
scenario 'user has access to edit link' do
|
44
|
+
visit show_path
|
45
|
+
|
46
|
+
expect(page).to have_text Spree.t('dandify.show.buttons.edit')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Admin::NavigationHelper do
|
4
|
+
describe '#link_to_restore_url' do
|
5
|
+
let(:restore_path) { spree.edit_admin_stylesheets_path }
|
6
|
+
|
7
|
+
context 'link to restore URL' do
|
8
|
+
it 'should build circular restore button' do
|
9
|
+
restore_button = helper.link_to_restore_url(restore_path)
|
10
|
+
restore_button.should include(Spree.t('dandify.confirm.restore'))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Stylesheet do
|
4
|
+
context 'versions', versioning: true do
|
5
|
+
it { should be_versioned }
|
6
|
+
|
7
|
+
it 'restores previous versions' do
|
8
|
+
style = create :stylesheet
|
9
|
+
style.update style_raw: 'h1{display:none; color: blue;}'
|
10
|
+
|
11
|
+
expect(style.versions.size).to eq(2)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'validations' do
|
16
|
+
let(:valid_css) { '#main {background-color: #0000ff}' }
|
17
|
+
let(:invalid_css) { 'main {background-color #0000ff}' }
|
18
|
+
|
19
|
+
it { should validate_presence_of(:style_raw) }
|
20
|
+
|
21
|
+
it 'pass with proper vanilla syntax' do
|
22
|
+
expect(style_with valid_css).to be_valid
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'fail with bad vanilla syntax' do
|
26
|
+
expect(style_with invalid_css).to_not be_valid
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'processing raw' do
|
31
|
+
it 'allows both css and scss' do
|
32
|
+
expect(style_with(<<-CSS)).to be_valid
|
33
|
+
|
34
|
+
$font-stack: Helvetica, sans-serif;
|
35
|
+
|
36
|
+
body {
|
37
|
+
font: 100% $font-stack
|
38
|
+
}
|
39
|
+
|
40
|
+
h1 { display: inline ;}
|
41
|
+
|
42
|
+
CSS
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'compresses' do
|
46
|
+
it 'vanilla css' do
|
47
|
+
compressed = "#main{display:block}.foo{width:300px;height:200px}\n"
|
48
|
+
expect(create_style_with(<<-CSS).style_compressed).to eq compressed
|
49
|
+
|
50
|
+
#main {
|
51
|
+
display: block;
|
52
|
+
}
|
53
|
+
|
54
|
+
.foo {
|
55
|
+
width: 300px;
|
56
|
+
height: 200px;
|
57
|
+
}
|
58
|
+
|
59
|
+
CSS
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'compresses scss' do
|
63
|
+
compressed = "nav ul{margin:0;padding:0}a{display:block}\n"
|
64
|
+
expect(create_style_with(<<-CSS).style_compressed).to eq compressed
|
65
|
+
|
66
|
+
nav {
|
67
|
+
ul {
|
68
|
+
margin: 0;
|
69
|
+
padding: 0;
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
a {
|
74
|
+
display: block;
|
75
|
+
}
|
76
|
+
|
77
|
+
CSS
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def create_style_with(css)
|
83
|
+
style = style_with(css)
|
84
|
+
style.save
|
85
|
+
style
|
86
|
+
end
|
87
|
+
|
88
|
+
def style_with(css)
|
89
|
+
Spree::Stylesheet.new(style_raw: css)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe Spree::Stylesheet, '#load_style' do
|
94
|
+
it 'returns Blanksheet when no sheet is found' do
|
95
|
+
expect(Spree::Stylesheet.load_style).to be_a Spree::BlankStylesheet
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'returns a found instance of itself' do
|
99
|
+
styles = create :stylesheet
|
100
|
+
expect(Spree::Stylesheet.load_style).to eq styles
|
101
|
+
end
|
102
|
+
end
|