dandify 0.0.1 → 3.0.1
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/README.md +7 -8
- data/Rakefile +2 -2
- data/app/assets/stylesheets/spree/backend/dandify.scss +55 -0
- data/app/controllers/spree/admin/stylesheets_controller.rb +17 -8
- data/app/controllers/spree/stylesheets_controller.rb +3 -3
- data/app/helpers/spree/admin/navigation_helper_decorator.rb +20 -4
- data/app/helpers/spree/admin/stylesheet_helper.rb +12 -2
- data/app/models/spree/stylesheet_version.rb +2 -1
- data/app/models/spree/unknown_user.rb +11 -0
- data/app/models/spree/user_decorator.rb +1 -1
- data/app/models/spree/user_identifier.rb +13 -0
- data/app/overrides/spree/admin/shared/{_configuration_menu → sub_menu/_configuration}/add_dandify_to_admin_configuration_sidebar.html.erb.deface +1 -1
- data/app/views/spree/admin/stylesheets/_form.html.erb +29 -7
- data/app/views/spree/admin/stylesheets/_versions.html.erb +16 -19
- data/app/views/spree/admin/stylesheets/edit.html.erb +4 -5
- data/app/views/spree/admin/stylesheets/new.html.erb +4 -5
- data/app/views/spree/admin/stylesheets/show.html.erb +22 -8
- data/config/locales/en.yml +39 -27
- data/config/routes.rb +1 -1
- data/db/migrate/20140617221725_add_paper_trail_versions.rb +5 -5
- data/lib/dandify.rb +0 -1
- data/lib/dandify/version.rb +1 -1
- data/lib/generators/dandify/install/install_generator.rb +10 -9
- data/spec/controllers/spree/admin/stylesheets_controller_spec.rb +109 -55
- data/spec/controllers/spree/stylesheets_controller_spec.rb +26 -22
- data/spec/features/buttons_spec.rb +69 -0
- data/spec/features/dandy_style_spec.rb +1 -0
- data/spec/features/managing_stylesheet_spec.rb +86 -0
- data/spec/features/sidebar_spec.rb +17 -9
- data/spec/helpers/admin/navigation_helper_spec.rb +13 -7
- data/spec/helpers/admin/stylesheet_helper_spec.rb +47 -0
- data/spec/models/spree/blank_stylesheet_spec.rb +5 -3
- data/spec/models/spree/stylesheet_spec.rb +73 -69
- data/spec/spec_helper.rb +13 -12
- metadata +47 -59
- data/app/assets/stylesheets/spree/backend/dandify.css +0 -42
- data/config/spring.rb +0 -1
- data/lib/tasks/dandify_tasks.rake +0 -4
- data/spec/features/managing_stylsheet_spec.rb +0 -80
- data/spec/features/viewing_admin_spec.rb +0 -49
@@ -0,0 +1,86 @@
|
|
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
|
+
let(:css_path) { 'table#listing_versions tbody tr' }
|
12
|
+
|
13
|
+
context 'without existing style' do
|
14
|
+
scenario 'user views page with no stylesheet' do
|
15
|
+
visit show_path
|
16
|
+
|
17
|
+
expect(page).to have_text Spree.t('dandify.admin.no_resource_found')
|
18
|
+
expect(page).to have_text Spree.t('dandify.admin.create_one')
|
19
|
+
end
|
20
|
+
|
21
|
+
scenario 'user can create styles' do
|
22
|
+
visit new_path
|
23
|
+
|
24
|
+
fill_in Spree.t('dandify.admin.labels.style_raw'), with: style
|
25
|
+
click_button Spree.t(:create)
|
26
|
+
|
27
|
+
expect(page).to have_text Spree.t('dandify.admin.title.show')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'with existing style', versioning: true do
|
32
|
+
before { create :stylesheet }
|
33
|
+
|
34
|
+
scenario 'user does not see audit trail with no revisions' do
|
35
|
+
visit show_path
|
36
|
+
|
37
|
+
expect(page).not_to have_css(css_path, count: 1)
|
38
|
+
end
|
39
|
+
|
40
|
+
scenario 'after first edit user can see previous revisions' do
|
41
|
+
visit edit_path
|
42
|
+
|
43
|
+
fill_in Spree.t('dandify.admin.labels.style_raw'), with: '.moon { display: none}'
|
44
|
+
click_button Spree.t(:update)
|
45
|
+
|
46
|
+
expect(page).to have_css(css_path, count: 2)
|
47
|
+
end
|
48
|
+
|
49
|
+
scenario 'user can edit exiting styles' do
|
50
|
+
visit edit_path
|
51
|
+
|
52
|
+
fill_in Spree.t('dandify.admin.labels.style_raw'), with: style
|
53
|
+
click_button Spree.t(:update)
|
54
|
+
|
55
|
+
expect(page).to have_text(Spree.t('dandify.admin.title.show'))
|
56
|
+
end
|
57
|
+
|
58
|
+
scenario 'user creates new audit trail on edit', versioning: true, js: true do
|
59
|
+
visit edit_path
|
60
|
+
fill_in Spree.t('dandify.admin.labels.style_raw'), with: style
|
61
|
+
|
62
|
+
click_button Spree.t(:update)
|
63
|
+
|
64
|
+
expect(page).to have_css(css_path, count: 2)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'restoring stylesheet' do
|
69
|
+
before { create :stylesheet }
|
70
|
+
|
71
|
+
scenario 'not possible when there is only one version', versioning: true do
|
72
|
+
visit show_path
|
73
|
+
|
74
|
+
expect(page).not_to have_css(css_path)
|
75
|
+
end
|
76
|
+
|
77
|
+
scenario 'user can restore to previous version', versioning: true, js: true do
|
78
|
+
visit edit_path
|
79
|
+
fill_in Spree.t('dandify.admin.labels.style_raw'), with: style
|
80
|
+
|
81
|
+
click_button Spree.t(:update)
|
82
|
+
|
83
|
+
expect(page).to have_css(css_path, count: 2)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -1,24 +1,23 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
feature 'In the admin sidebar' do
|
4
4
|
stub_authorization!
|
5
5
|
|
6
6
|
let(:configuration_path) { spree.edit_admin_general_settings_path }
|
7
|
-
let(:show_path)
|
8
|
-
let(:new_path)
|
9
|
-
let(:edit_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
10
|
|
11
11
|
context 'on the configuration page' do
|
12
|
-
|
13
|
-
visit configuration_path
|
14
|
-
expect(page).to have_link(Spree.t('dandify.sidebar'), href: show_path)
|
15
|
-
end
|
12
|
+
before { visit configuration_path }
|
16
13
|
|
17
14
|
it 'the user views non-highlighted Dandify link in sidebar' do
|
18
|
-
visit configuration_path
|
19
15
|
expect(page).to_not(
|
20
16
|
have_selector(:css, "li.active a[href='#{show_path}']")
|
21
17
|
)
|
18
|
+
expect(page).to have_link(
|
19
|
+
Spree.t('dandify.admin.sidebar'), href: show_path
|
20
|
+
)
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
@@ -26,16 +25,25 @@ describe 'In the admin' do
|
|
26
25
|
it 'on Dandify show page' do
|
27
26
|
visit show_path
|
28
27
|
expect(page).to have_selector(:css, "li.active a[href='#{show_path}']")
|
28
|
+
expect(page).to have_link(
|
29
|
+
Spree.t('dandify.admin.sidebar'), href: show_path
|
30
|
+
)
|
29
31
|
end
|
30
32
|
|
31
33
|
it 'on Dandify edit page' do
|
32
34
|
visit edit_path
|
33
35
|
expect(page).to have_selector(:css, "li.active a[href='#{show_path}']")
|
36
|
+
expect(page).to have_link(
|
37
|
+
Spree.t('dandify.admin.sidebar'), href: show_path
|
38
|
+
)
|
34
39
|
end
|
35
40
|
|
36
41
|
it 'on Dandify new page' do
|
37
42
|
visit new_path
|
38
43
|
expect(page).to have_selector(:css, "li.active a[href='#{show_path}']")
|
44
|
+
expect(page).to have_link(
|
45
|
+
Spree.t('dandify.admin.sidebar'), href: show_path
|
46
|
+
)
|
39
47
|
end
|
40
48
|
end
|
41
49
|
end
|
@@ -1,13 +1,19 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
module Spree
|
4
|
+
module Admin
|
5
|
+
describe NavigationHelper do
|
6
|
+
describe '#link_to_restore_url' do
|
7
|
+
let(:restore_path) { spree.edit_admin_stylesheets_path }
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
9
|
+
context 'link to restore URL' do
|
10
|
+
it 'should build circular restore button' do
|
11
|
+
restore_button = helper.link_to_restore_url(restore_path)
|
12
|
+
|
13
|
+
expect(restore_button).
|
14
|
+
to include(Spree.t('dandify.admin.confirm.restore'))
|
15
|
+
end
|
16
|
+
end
|
11
17
|
end
|
12
18
|
end
|
13
19
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
module Admin
|
5
|
+
describe StylesheetHelper do
|
6
|
+
describe '#dandify_version_email' do
|
7
|
+
context 'with nil or unknown values' do
|
8
|
+
let(:fake_unknown_user) { instance_double(UnknownUser, email: 'foo') }
|
9
|
+
|
10
|
+
before do
|
11
|
+
allow(UnknownUser).to receive(:new) { fake_unknown_user }
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'when user_id is nil' do
|
15
|
+
it 'instantiates a new UknownUser and calls #email' do
|
16
|
+
helper.dandify_version_email(nil)
|
17
|
+
|
18
|
+
expect(UnknownUser).to have_received(:new)
|
19
|
+
expect(fake_unknown_user).to have_received(:email)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when user_id equals Spree.t("dandify.admin.unknown")' do
|
24
|
+
it 'instantiates a new UknownUser and calls #email' do
|
25
|
+
helper.dandify_version_email(Spree.t('dandify.admin.unknown'))
|
26
|
+
|
27
|
+
expect(UnknownUser).to have_received(:new)
|
28
|
+
expect(fake_unknown_user).to have_received(:email)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'with everything else' do
|
34
|
+
it 'sends user_id to User#find and calls email' do
|
35
|
+
fake_user = instance_double(User, email: 'foo')
|
36
|
+
allow(User).to receive(:find) { fake_user }
|
37
|
+
|
38
|
+
helper.dandify_version_email('1')
|
39
|
+
|
40
|
+
expect(User).to have_received(:find).with '1'
|
41
|
+
expect(fake_user).to have_received(:email)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
module Spree
|
4
|
+
describe BlankStylesheet, '#style_compressed' do
|
5
|
+
it 'returns a blank string' do
|
6
|
+
expect(subject.style_compressed).to eq ''
|
7
|
+
end
|
6
8
|
end
|
7
9
|
end
|
@@ -1,102 +1,106 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
module Spree
|
4
|
+
describe Stylesheet do
|
5
|
+
context 'versions', versioning: true do
|
6
|
+
it { should be_versioned }
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
it 'restores previous versions' do
|
9
|
+
style = create :stylesheet
|
10
|
+
style.update style_raw: 'h1{display:none; color: blue;}'
|
10
11
|
|
11
|
-
|
12
|
+
expect(style.versions.size).to eq(2)
|
13
|
+
end
|
12
14
|
end
|
13
|
-
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
context 'validations' do
|
17
|
+
let(:valid_css) { '#main {background-color: #0000ff}' }
|
18
|
+
let(:invalid_css) { 'main {background-color #0000ff}' }
|
18
19
|
|
19
|
-
|
20
|
+
it { should validate_presence_of(:style_raw) }
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
22
|
+
it 'pass with proper vanilla syntax' do
|
23
|
+
expect(style_with valid_css).to be_valid
|
24
|
+
end
|
24
25
|
|
25
|
-
|
26
|
-
|
26
|
+
it 'fail with bad vanilla syntax' do
|
27
|
+
expect(style_with invalid_css).to_not be_valid
|
28
|
+
end
|
27
29
|
end
|
28
|
-
end
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
context 'processing raw' do
|
32
|
+
it 'allows both css and scss' do
|
33
|
+
expect(style_with(<<-CSS)).to be_valid
|
33
34
|
|
34
|
-
$font-stack: Helvetica, sans-serif;
|
35
|
+
$font-stack: Helvetica, sans-serif;
|
35
36
|
|
36
|
-
body {
|
37
|
-
|
38
|
-
}
|
37
|
+
body {
|
38
|
+
font: 100% $font-stack
|
39
|
+
}
|
39
40
|
|
40
|
-
h1 { display: inline ;}
|
41
|
+
h1 { display: inline ;}
|
41
42
|
|
42
|
-
|
43
|
-
|
43
|
+
CSS
|
44
|
+
end
|
44
45
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
context 'compresses' do
|
47
|
+
it 'vanilla css' do
|
48
|
+
compressed = "#main{display:block}.foo{width:300px;height:200px}\n"
|
49
|
+
expect(create_style_with(<<-CSS).style_compressed).to eq compressed
|
49
50
|
|
50
|
-
#main {
|
51
|
-
|
52
|
-
}
|
51
|
+
#main {
|
52
|
+
display: block;
|
53
|
+
}
|
53
54
|
|
54
|
-
.foo {
|
55
|
-
|
56
|
-
|
57
|
-
}
|
55
|
+
.foo {
|
56
|
+
width: 300px;
|
57
|
+
height: 200px;
|
58
|
+
}
|
58
59
|
|
59
|
-
|
60
|
-
|
60
|
+
CSS
|
61
|
+
end
|
61
62
|
|
62
|
-
|
63
|
-
|
64
|
-
|
63
|
+
it 'compresses scss' do
|
64
|
+
compressed = "nav ul{margin:0;padding:0}a{display:block}\n"
|
65
|
+
expect(create_style_with(<<-CSS).style_compressed).to eq compressed
|
65
66
|
|
66
|
-
nav {
|
67
|
-
|
68
|
-
|
69
|
-
|
67
|
+
nav {
|
68
|
+
ul {
|
69
|
+
margin: 0;
|
70
|
+
padding: 0;
|
71
|
+
}
|
70
72
|
}
|
71
|
-
}
|
72
73
|
|
73
|
-
a {
|
74
|
-
|
75
|
-
}
|
74
|
+
a {
|
75
|
+
display: block;
|
76
|
+
}
|
76
77
|
|
77
|
-
|
78
|
+
CSS
|
79
|
+
end
|
78
80
|
end
|
79
81
|
end
|
80
|
-
end
|
81
82
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
83
|
+
def create_style_with(css)
|
84
|
+
style = style_with(css)
|
85
|
+
style.save
|
86
|
+
style
|
87
|
+
end
|
87
88
|
|
88
|
-
|
89
|
-
|
89
|
+
def style_with(css)
|
90
|
+
Spree::Stylesheet.new(style_raw: css)
|
91
|
+
end
|
90
92
|
end
|
91
|
-
end
|
92
93
|
|
93
|
-
describe
|
94
|
-
|
95
|
-
|
96
|
-
|
94
|
+
describe Stylesheet, '#load_style' do
|
95
|
+
it 'returns Blanksheet when no sheet is found' do
|
96
|
+
expect(described_class.load_style).to be_a Spree::BlankStylesheet
|
97
|
+
end
|
97
98
|
|
98
|
-
|
99
|
-
|
100
|
-
|
99
|
+
it 'returns a found instance of itself' do
|
100
|
+
styles = create :stylesheet
|
101
|
+
expect(described_class.load_style).to eq styles
|
102
|
+
end
|
101
103
|
end
|
102
104
|
end
|
105
|
+
|
106
|
+
|
data/spec/spec_helper.rb
CHANGED
@@ -10,30 +10,33 @@ rescue LoadError
|
|
10
10
|
exit
|
11
11
|
end
|
12
12
|
|
13
|
-
require 'rspec/rails'
|
14
|
-
require 'shoulda-matchers'
|
15
|
-
require 'ffaker'
|
16
|
-
require 'database_cleaner'
|
17
13
|
require 'capybara'
|
18
|
-
require 'capybara/rspec'
|
19
|
-
require 'capybara/rails'
|
20
14
|
require 'capybara/poltergeist'
|
15
|
+
require 'capybara/rails'
|
16
|
+
require 'capybara/rspec'
|
17
|
+
require 'database_cleaner'
|
18
|
+
require 'ffaker'
|
21
19
|
require 'paper_trail/frameworks/rspec'
|
20
|
+
require 'pry-byebug'
|
21
|
+
require 'rspec/rails'
|
22
|
+
require 'shoulda-matchers'
|
22
23
|
|
23
24
|
Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
|
24
25
|
|
25
|
-
require 'spree/testing_support/factories'
|
26
|
-
require 'spree/testing_support/controller_requests'
|
27
26
|
require 'spree/testing_support/authorization_helpers'
|
28
|
-
require 'spree/testing_support/url_helpers'
|
29
27
|
require 'spree/testing_support/capybara_ext'
|
28
|
+
require 'spree/testing_support/controller_requests'
|
29
|
+
require 'spree/testing_support/factories'
|
30
|
+
require 'spree/testing_support/url_helpers'
|
31
|
+
|
32
|
+
Capybara.javascript_driver = :poltergeist
|
30
33
|
|
31
34
|
FactoryGirl.find_definitions
|
32
35
|
|
33
36
|
RSpec.configure do |config|
|
34
37
|
config.deprecation_stream = 'rspec.log'
|
35
|
-
config.include Spree::TestingSupport::ControllerRequests
|
36
38
|
config.include FactoryGirl::Syntax::Methods
|
39
|
+
config.include Spree::TestingSupport::ControllerRequests, type: :controller
|
37
40
|
config.include Spree::TestingSupport::UrlHelpers
|
38
41
|
config.include Devise::TestHelpers, type: :controller
|
39
42
|
config.use_transactional_fixtures = false
|
@@ -54,6 +57,4 @@ RSpec.configure do |config|
|
|
54
57
|
config.after do
|
55
58
|
DatabaseCleaner.clean
|
56
59
|
end
|
57
|
-
|
58
|
-
Capybara.javascript_driver = :poltergeist
|
59
60
|
end
|