parcels 0.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 +7 -0
- data/.gitignore +22 -0
- data/.rspec-local +4 -0
- data/.travis.yml +54 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +6 -0
- data/lib/parcels/dependency_parcel_list.rb +50 -0
- data/lib/parcels/environment.rb +60 -0
- data/lib/parcels/fortitude/alongside_engine.rb +37 -0
- data/lib/parcels/fortitude/assets.rb +212 -0
- data/lib/parcels/fortitude/enabling.rb +72 -0
- data/lib/parcels/fortitude/fortitude_engine.rb +35 -0
- data/lib/parcels/fortitude/fortitude_loader.rb +27 -0
- data/lib/parcels/fortitude/widget_engine.rb +31 -0
- data/lib/parcels/fortitude_alongside_parcel.rb +38 -0
- data/lib/parcels/fortitude_inline_parcel.rb +31 -0
- data/lib/parcels/fortitude_parcel.rb +102 -0
- data/lib/parcels/fragments/css_fragment.rb +107 -0
- data/lib/parcels/index.rb +16 -0
- data/lib/parcels/rails/rails_loader.rb +23 -0
- data/lib/parcels/rails/railtie.rb +16 -0
- data/lib/parcels/sprockets.rb +153 -0
- data/lib/parcels/utils/path_utils.rb +32 -0
- data/lib/parcels/version.rb +3 -0
- data/lib/parcels/widget_tree.rb +158 -0
- data/lib/parcels.rb +21 -0
- data/parcels.gemspec +48 -0
- data/spec/helpers/content_in_helpers.rb +21 -0
- data/spec/helpers/file_structure_helpers.rb +79 -0
- data/spec/helpers/global_helper.rb +34 -0
- data/spec/helpers/new_asset_helpers.rb +31 -0
- data/spec/helpers/new_rails_helpers.rb +31 -0
- data/spec/helpers/parcels_rails_helpers.rb +20 -0
- data/spec/helpers/per_example_helpers.rb +15 -0
- data/spec/helpers/sprockets_helpers.rb +23 -0
- data/spec/lib/spec/expected/base_expected_asset.rb +35 -0
- data/spec/lib/spec/expected/expected_asset.rb +135 -0
- data/spec/lib/spec/expected/expected_asset_set.rb +45 -0
- data/spec/lib/spec/expected/must_not_be_present_asset.rb +17 -0
- data/spec/lib/spec/fixtures/file_set.rb +80 -0
- data/spec/lib/spec/fixtures/widget_base.rb +13 -0
- data/spec/lib/spec/fixtures/widget_file.rb +108 -0
- data/spec/lib/spec/parsing/compiled_asset.rb +94 -0
- data/spec/lib/spec/parsing/compiled_asset_fragment.rb +38 -0
- data/spec/lib/spec/parsing/parsed_css_asset.rb +34 -0
- data/spec/lib/spec/parsing/precompiled_rails_asset.rb +52 -0
- data/spec/lib/spec/parsing/rails_asset.rb +30 -0
- data/spec/lib/spec/parsing/sprockets_asset.rb +40 -0
- data/spec/rails/basic_rails_spec.rb +102 -0
- data/spec/rails/compression_rails_spec.rb +11 -0
- data/spec/rails/development_mode_rails_spec.rb +321 -0
- data/spec/rails/sass_rails_spec.rb +125 -0
- data/spec/rails/sets_rails_spec.rb +85 -0
- data/spec/rails/templates/base/app/assets/stylesheets/application.css +16 -0
- data/spec/rails/templates/base/app/views/widgets/base.rb +4 -0
- data/spec/rails/templates/base/config/environments/production.rb +92 -0
- data/spec/rails/templates/base/lib/null_compressor.rb +5 -0
- data/spec/rails/templates/basic_rails_spec/app/controllers/basic_rails_spec_controller.rb +21 -0
- data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/alongside_and_inline.pcss +1 -0
- data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/alongside_and_inline.rb +9 -0
- data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/alongside_and_inline_html.html.pcss +1 -0
- data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/alongside_and_inline_html.html.rb +9 -0
- data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/alongside_erb.pcss +1 -0
- data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/alongside_erb.rb +7 -0
- data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/inline_erb.rb +9 -0
- data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/multiple_engines.pcss +1 -0
- data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/multiple_engines.rb +9 -0
- data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/no_corresponding_widget.pcss +1 -0
- data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/simple_css.rb +9 -0
- data/spec/rails/templates/compression_rails_spec/app/controllers/compression_rails_spec_controller.rb +5 -0
- data/spec/rails/templates/compression_rails_spec/app/views/compression_rails_spec/inline_and_alongside_css.pcss +1 -0
- data/spec/rails/templates/compression_rails_spec/app/views/compression_rails_spec/inline_and_alongside_css.rb +9 -0
- data/spec/rails/templates/compression_rails_spec/config/environments/production.rb +91 -0
- data/spec/rails/templates/development_mode_rails_spec/app/assets/stylesheets/changingone.scss +1 -0
- data/spec/rails/templates/development_mode_rails_spec/app/assets/stylesheets/changingtwo.scss +1 -0
- data/spec/rails/templates/development_mode_rails_spec/app/assets/stylesheets/import_dir/import_dir_ss_1.scss +1 -0
- data/spec/rails/templates/development_mode_rails_spec/app/controllers/development_mode_rails_spec_controller.rb +45 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/adding_alongside_css.rb +5 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/adding_inline_css.rb +7 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/adding_widget.rb +5 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/basic_widget_with_inline_and_alongside_parcels.pcss +3 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/basic_widget_with_inline_and_alongside_parcels.rb +9 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/changing_alongside_css.pcss +1 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/changing_alongside_css.rb +5 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/changing_import_file.pcss +2 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/changing_import_file.rb +10 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/changing_inline_css.rb +9 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/changing_prefix_imported_file.pcss +1 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/changing_prefix_imported_file.rb +7 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/removing_alongside_css.pcss +1 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/removing_alongside_css.rb +5 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/removing_inline_css.rb +7 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/removing_widget.pcss +1 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/removing_widget.rb +9 -0
- data/spec/rails/templates/development_mode_rails_spec/app/views/import_base.rb +5 -0
- data/spec/rails/templates/development_mode_rails_spec/config/environments/development.rb +37 -0
- data/spec/rails/templates/development_mode_rails_spec/vendor/assets/stylesheets/one.scss +1 -0
- data/spec/rails/templates/development_mode_rails_spec/vendor/assets/stylesheets/two.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/assets/foobar/the_import_dir_2/id2ss1.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/assets/foobar/the_import_dir_2/id2ss2.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/assets/foobar/twelve.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/assets/foobar/two.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/assets/images/quux/foo.png +0 -0
- data/spec/rails/templates/sass_rails_spec/app/assets/stylesheets/eleven.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/assets/stylesheets/one.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/assets/stylesheets/shared_import_dir/sid1ss1.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/assets/stylesheets/shared_import_dir/sid1ss2.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/assets/stylesheets/the_import_dir_1/id1ss1.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/assets/stylesheets/the_import_dir_1/id1ss2.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/controllers/sass_rails_spec_controller.rb +29 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/added_asset_path.pcss +2 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/added_asset_path.rb +10 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/asset_url.pcss +2 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/asset_url.rb +17 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/default_sass_import.pcss +6 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/default_sass_import.rb +14 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/import_directory.pcss +3 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/import_directory.rb +11 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/import_view_relative_directory.pcss +3 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/import_view_relative_directory.rb +11 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/other_features.pcss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/other_features.rb +9 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/shared_imports.rb +10 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/vr_import_dir_1/vr1ss1.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/vr_import_dir_1/vr1ss2.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/vr_import_dir_2/vr2ss1.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/vr_import_dir_2/vr2ss2.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/app/views/widgets/import_base.rb +5 -0
- data/spec/rails/templates/sass_rails_spec/config/application.rb +25 -0
- data/spec/rails/templates/sass_rails_spec/lib/more_assets/twenty.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/vendor/assets/stylesheets/thirteen.scss +1 -0
- data/spec/rails/templates/sass_rails_spec/vendor/assets/stylesheets/three.scss +1 -0
- data/spec/rails/templates/sets_rails_spec/app/assets/stylesheets/admin.css.scss +1 -0
- data/spec/rails/templates/sets_rails_spec/app/assets/stylesheets/all.css.scss +1 -0
- data/spec/rails/templates/sets_rails_spec/app/assets/stylesheets/normal.css.scss +1 -0
- data/spec/rails/templates/sets_rails_spec/app/controllers/sets_rails_spec_controller.rb +3 -0
- data/spec/rails/templates/sets_rails_spec/app/views/admin/admin_one.pcss +1 -0
- data/spec/rails/templates/sets_rails_spec/app/views/admin/admin_one.rb +3 -0
- data/spec/rails/templates/sets_rails_spec/app/views/admin/admin_two.pcss +1 -0
- data/spec/rails/templates/sets_rails_spec/app/views/admin/admin_two.rb +3 -0
- data/spec/rails/templates/sets_rails_spec/app/views/admin/base.rb +3 -0
- data/spec/rails/templates/sets_rails_spec/app/views/root.rb +9 -0
- data/spec/rails/templates/sets_rails_spec/app/views/sets_base.rb +3 -0
- data/spec/rails/templates/sets_rails_spec/app/views/sets_rails_spec/normal_one.pcss +1 -0
- data/spec/rails/templates/sets_rails_spec/app/views/sets_rails_spec/normal_one.rb +3 -0
- data/spec/rails/templates/sets_rails_spec/app/views/sets_rails_spec/normal_two.pcss +1 -0
- data/spec/rails/templates/sets_rails_spec/app/views/sets_rails_spec/normal_two.rb +3 -0
- data/spec/system/alongside_file_spec.rb +193 -0
- data/spec/system/autogenerated_class_application_spec.rb +240 -0
- data/spec/system/basic_system_spec.rb +75 -0
- data/spec/system/dependency_sorting_spec.rb +48 -0
- data/spec/system/engines_spec.rb +245 -0
- data/spec/system/prefix_spec.rb +108 -0
- data/spec/system/sass_features_spec.rb +109 -0
- data/spec/system/sets_spec.rb +405 -0
- metadata +477 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
$mycolor20: #a0b1c2;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
$mycolor13: #13abcd;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
$mycolor3: #9a8b7c;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//= require_parcels admin
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//= require_parcels
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//= require_parcels normal
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
p.a { color: red; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
div.a { color: green; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
span.a { color: blue; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
em.a { color: yellow; }
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
describe "Parcels alongside files", :type => :system do
|
|
2
|
+
context "with a very simple alongside file" do
|
|
3
|
+
before :each do
|
|
4
|
+
files {
|
|
5
|
+
file 'assets/basic.css', %{
|
|
6
|
+
//= require_parcels
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
widget('views/my_widget') { }
|
|
10
|
+
file 'views/my_widget.pcss', %{
|
|
11
|
+
p { color: red; }
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should apply the correct autogenerated class to the widget" do
|
|
17
|
+
doc = render_file_asset('views/my_widget')
|
|
18
|
+
expect(classes_from(doc, 'p')).to eq([ expected_file_asset('views/my_widget.rb').parcels_wrapping_class ])
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should aggregate the contents of that file" do
|
|
22
|
+
asset = compiled_sprockets_asset('basic')
|
|
23
|
+
asset.should_match(file_assets do
|
|
24
|
+
asset 'views/my_widget.pcss' do
|
|
25
|
+
expect_wrapped_rule :p, 'color: red'
|
|
26
|
+
end
|
|
27
|
+
end)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context "with a widget ending in .rb and an alongside file ending in .html.css" do
|
|
32
|
+
before :each do
|
|
33
|
+
files {
|
|
34
|
+
file 'assets/basic.css', %{
|
|
35
|
+
//= require_parcels
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
widget('views/my_widget') { }
|
|
39
|
+
file 'views/my_widget.html.css', %{
|
|
40
|
+
p { color: red; }
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "should not aggregate that alongside file" do
|
|
46
|
+
compiled_sprockets_asset('basic').should_match(file_assets do
|
|
47
|
+
asset_must_not_be_present 'views/my_widget.html.css'
|
|
48
|
+
end)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
context "with a widget ending in .html.rb and an alongside file ending in .css" do
|
|
53
|
+
before :each do
|
|
54
|
+
files {
|
|
55
|
+
file 'assets/basic.css', %{
|
|
56
|
+
//= require_parcels
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
widget('views/my_widget.html') { }
|
|
60
|
+
file 'views/my_widget.css', %{
|
|
61
|
+
p { color: red; }
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "should not aggregate that alongside file" do
|
|
67
|
+
compiled_sprockets_asset('basic').should_match(file_assets do
|
|
68
|
+
asset_must_not_be_present 'views/my_widget.css'
|
|
69
|
+
end)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
context "with a widget ending in .html.rb, and an alongside file ending in .html.pcss" do
|
|
74
|
+
before :each do
|
|
75
|
+
files {
|
|
76
|
+
file 'assets/basic.css', %{
|
|
77
|
+
//= require_parcels
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
widget('views/my_widget.html') { }
|
|
81
|
+
file 'views/my_widget.html.pcss', %{
|
|
82
|
+
p { color: red; }
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "should apply the correct autogenerated class to the widget" do
|
|
88
|
+
doc = render_file_asset('views/my_widget.html')
|
|
89
|
+
expect(classes_from(doc, 'p')).to eq([ expected_file_asset('views/my_widget.rb').parcels_wrapping_class ])
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "should aggregate the contents of that file" do
|
|
93
|
+
compiled_sprockets_asset('basic').should_match(file_assets do
|
|
94
|
+
asset 'views/my_widget.html.pcss' do
|
|
95
|
+
expect_wrapped_rule :p, 'color: red'
|
|
96
|
+
end
|
|
97
|
+
end)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it "should combine an alongside file and inline CSS just fine" do
|
|
102
|
+
files {
|
|
103
|
+
file 'assets/basic.css', %{
|
|
104
|
+
//= require_parcels
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
widget 'views/my_widget' do
|
|
108
|
+
css %{
|
|
109
|
+
p { color: green; }
|
|
110
|
+
}
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
file 'views/my_widget.pcss', %{
|
|
114
|
+
div { color: blue; }
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
compiled_sprockets_asset('basic').should_match(file_assets do
|
|
119
|
+
asset 'views/my_widget.pcss' do
|
|
120
|
+
expect_wrapped_rule :div, 'color: blue'
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
asset 'views/my_widget.rb' do
|
|
124
|
+
expect_wrapped_rule :p, 'color: green'
|
|
125
|
+
end
|
|
126
|
+
end)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it "should not allow you to pick up the alongside file with a direct 'require'" do
|
|
130
|
+
files {
|
|
131
|
+
file 'assets/basic.css', %{
|
|
132
|
+
//= require_parcels
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
file 'assets/one.css', %{
|
|
136
|
+
//= require 'views/my_widget.pcss'
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
widget('views/my_widget') { }
|
|
140
|
+
file 'views/my_widget.pcss', %{
|
|
141
|
+
p { color: red; }
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
expect { compiled_sprockets_asset('one').source }.to raise_error(::Sprockets::FileNotFound, %r{views/my_widget\.pcss}i)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it "should allow you to pick up the alongside file with a 'require' using '_parcels_alongside/', and it should be wrapped" do
|
|
149
|
+
files {
|
|
150
|
+
file 'assets/basic.css', %{
|
|
151
|
+
//= require_parcels
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
file 'assets/one.css', %{
|
|
155
|
+
//= require _parcels_alongside/my_widget.pcss
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
widget('views/my_widget') { }
|
|
159
|
+
file 'views/my_widget.pcss', %{
|
|
160
|
+
p { color: red; }
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
ter = this_example_root
|
|
165
|
+
asset = compiled_sprockets_asset('one')
|
|
166
|
+
asset.should_match(file_assets do
|
|
167
|
+
asset 'views/.parcels_sprockets_workaround/_parcels_alongside/my_widget.pcss' do
|
|
168
|
+
expect_rule ".parcels_class__views__my_widget p", 'color: red'
|
|
169
|
+
end
|
|
170
|
+
end)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it "should not pick up alongside files if there is no corresponding widget class" do
|
|
174
|
+
files {
|
|
175
|
+
file 'assets/basic.css', %{
|
|
176
|
+
//= require_parcels
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
file 'views/my_widget.pcss', %{
|
|
180
|
+
p { color: red; }
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
file 'views/another_widget.html.pcss', %{
|
|
184
|
+
div { color: green; }
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
compiled_sprockets_asset('one').should_match(file_assets do
|
|
189
|
+
asset_must_not_be_present 'views/my_widget.pcss'
|
|
190
|
+
asset_must_not_be_present 'views/another_widget.pcss'
|
|
191
|
+
end)
|
|
192
|
+
end
|
|
193
|
+
end
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
describe "Parcels autogenerated class application", :type => :system do
|
|
2
|
+
it "should apply the autogenerated class to the outermost element of a widget" do
|
|
3
|
+
files {
|
|
4
|
+
widget 'views/my_widget' do
|
|
5
|
+
css "p { color: red; }"
|
|
6
|
+
end
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
doc = render_file_asset('views/my_widget')
|
|
10
|
+
|
|
11
|
+
expect(classes_from(doc, 'p')).to eq([ expected_file_asset('views/my_widget.rb').parcels_wrapping_class ])
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should name that class correctly, using double underscores for path separators and single in place of CamelCase" do
|
|
15
|
+
files {
|
|
16
|
+
file 'lib/foo.rb', %{
|
|
17
|
+
module Views::Foo
|
|
18
|
+
end
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
widget 'views/foo/my_widget' do
|
|
22
|
+
requires 'lib/foo'
|
|
23
|
+
css "p { color: red; }"
|
|
24
|
+
end
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
doc = render_file_asset('views/foo/my_widget')
|
|
28
|
+
classes = classes_from(doc, 'p')
|
|
29
|
+
|
|
30
|
+
expect(classes.length).to eq(1)
|
|
31
|
+
expect(classes[0]).to match(/views__foo__my_widget/)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should apply the autogenerated class to multiple outermost elements of a widget" do
|
|
35
|
+
files {
|
|
36
|
+
widget 'views/my_widget' do
|
|
37
|
+
css "p { color: red; }"
|
|
38
|
+
|
|
39
|
+
content %{
|
|
40
|
+
p "hello"
|
|
41
|
+
span "goodbye"
|
|
42
|
+
}
|
|
43
|
+
end
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
doc = render_file_asset('views/my_widget')
|
|
47
|
+
expected_asset = expected_file_asset('views/my_widget.rb')
|
|
48
|
+
|
|
49
|
+
expect(classes_from(doc, 'p')).to eq([ expected_asset.parcels_wrapping_class ])
|
|
50
|
+
expect(classes_from(doc, 'span')).to eq([ expected_asset.parcels_wrapping_class ])
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "should not apply the autogenerated class to elements that aren't outermost" do
|
|
54
|
+
files {
|
|
55
|
+
widget 'views/my_widget' do
|
|
56
|
+
css "p { color: red; }"
|
|
57
|
+
|
|
58
|
+
content %{
|
|
59
|
+
div {
|
|
60
|
+
p "hello"
|
|
61
|
+
p "there"
|
|
62
|
+
p {
|
|
63
|
+
span "goodbye"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
end
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
doc = render_file_asset('views/my_widget')
|
|
71
|
+
|
|
72
|
+
expect(classes_from(doc, 'div')).to eq([ expected_file_asset('views/my_widget.rb').parcels_wrapping_class ])
|
|
73
|
+
expect(classes_from(doc, 'div/p[1]')).to be_empty
|
|
74
|
+
expect(classes_from(doc, 'div/p[2]')).to be_empty
|
|
75
|
+
expect(classes_from(doc, 'div/p[3]')).to be_empty
|
|
76
|
+
expect(classes_from(doc, 'div/p/span')).to be_empty
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "should not apply any classes if there is no CSS for a widget" do
|
|
80
|
+
files {
|
|
81
|
+
widget 'views/my_widget' do
|
|
82
|
+
end
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
doc = render_file_asset('views/my_widget')
|
|
86
|
+
expect(classes_from(doc, 'p')).to eq([ ])
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "should apply classes if there's CSS in an alongside file" do
|
|
90
|
+
files {
|
|
91
|
+
widget 'views/my_widget' do
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
file 'views/my_widget.pcss', %{
|
|
95
|
+
p { color: red; }
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
doc = render_file_asset('views/my_widget')
|
|
100
|
+
expect(classes_from(doc, 'p')).to eq([ expected_file_asset('views/my_widget.rb').parcels_wrapping_class ])
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "should apply autogenerated classes from a parent widget, too" do
|
|
104
|
+
files {
|
|
105
|
+
widget 'views/parent_widget' do
|
|
106
|
+
css "p { color: red; }"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
widget 'views/child_widget', :superclass => 'Views::ParentWidget' do
|
|
110
|
+
requires %{views/parent_widget}
|
|
111
|
+
css "p { color: blue; }"
|
|
112
|
+
end
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
doc = render_file_asset("views/child_widget")
|
|
116
|
+
expect(classes_from(doc, 'p').sort).to eq([
|
|
117
|
+
expected_file_asset('views/parent_widget.rb').parcels_wrapping_class,
|
|
118
|
+
expected_file_asset('views/child_widget.rb').parcels_wrapping_class
|
|
119
|
+
].sort)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "should apply autogenerated classes from a whole parent hierarchy" do
|
|
123
|
+
files {
|
|
124
|
+
widget 'views/grandparent_widget' do
|
|
125
|
+
css "p { color: red; }"
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
widget 'views/parent_widget', :superclass => 'Views::GrandparentWidget' do
|
|
129
|
+
requires %{views/grandparent_widget}
|
|
130
|
+
css "p { color: green; }"
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
widget 'views/child_widget', :superclass => 'Views::ParentWidget' do
|
|
134
|
+
requires %w{views/parent_widget}
|
|
135
|
+
css "p { color: blue; }"
|
|
136
|
+
end
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
doc = render_file_asset("views/child_widget")
|
|
140
|
+
expect(classes_from(doc, 'p').sort).to eq([
|
|
141
|
+
expected_file_asset('views/grandparent_widget.rb').parcels_wrapping_class,
|
|
142
|
+
expected_file_asset('views/parent_widget.rb').parcels_wrapping_class,
|
|
143
|
+
expected_file_asset('views/child_widget.rb').parcels_wrapping_class
|
|
144
|
+
].sort)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "should not apply autogenerated classes from a widget in the hierarchy for which there's no CSS" do
|
|
148
|
+
files {
|
|
149
|
+
widget 'views/grandparent_widget' do
|
|
150
|
+
css "p { color: red; }"
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
widget 'views/parent_widget', :superclass => 'Views::GrandparentWidget' do
|
|
154
|
+
requires %{views/grandparent_widget}
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
widget 'views/child_widget', :superclass => 'Views::ParentWidget' do
|
|
158
|
+
requires %w{views/parent_widget}
|
|
159
|
+
css "p { color: blue; }"
|
|
160
|
+
end
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
doc = render_file_asset("views/child_widget")
|
|
164
|
+
expect(classes_from(doc, 'p').sort).to eq([
|
|
165
|
+
expected_file_asset('views/grandparent_widget.rb').parcels_wrapping_class,
|
|
166
|
+
expected_file_asset('views/child_widget.rb').parcels_wrapping_class
|
|
167
|
+
].sort)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
it "should still apply autogenerated classes if the class has no CSS, but a parent does" do
|
|
171
|
+
files {
|
|
172
|
+
widget 'views/parent_widget' do
|
|
173
|
+
css "p { color: red; }"
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
widget 'views/child_widget', :superclass => 'Views::ParentWidget' do
|
|
177
|
+
requires %{views/parent_widget}
|
|
178
|
+
end
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
doc = render_file_asset("views/child_widget")
|
|
182
|
+
expect(classes_from(doc, 'p')).to eq([
|
|
183
|
+
expected_file_asset('views/parent_widget.rb').parcels_wrapping_class
|
|
184
|
+
])
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
it "should still apply autogenerated classes to a class that enables parcels itself" do
|
|
188
|
+
files {
|
|
189
|
+
widget 'views/my_widget', :superclass => 'Fortitude::Widgets::Html5' do
|
|
190
|
+
class_text 'enable_parcels!'
|
|
191
|
+
|
|
192
|
+
content %{
|
|
193
|
+
p "hello"
|
|
194
|
+
}
|
|
195
|
+
css "p { color: red; }"
|
|
196
|
+
end
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
doc = render_file_asset("views/my_widget")
|
|
200
|
+
expect(classes_from(doc, 'p')).to eq([
|
|
201
|
+
expected_file_asset('views/my_widget.rb').parcels_wrapping_class
|
|
202
|
+
])
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
it "should stop applying autogenerated classes at a parent widget that isn't enabled for Parcels" do
|
|
206
|
+
files {
|
|
207
|
+
widget 'views/grandparent_widget', :superclass => 'Fortitude::Widget' do
|
|
208
|
+
class_text "doctype :html5"
|
|
209
|
+
|
|
210
|
+
content %{
|
|
211
|
+
p "hello"
|
|
212
|
+
}
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
widget 'views/parent_widget', :superclass => 'Views::GrandparentWidget' do
|
|
216
|
+
requires %{views/grandparent_widget}
|
|
217
|
+
class_text "enable_parcels!"
|
|
218
|
+
content %{
|
|
219
|
+
p "hello"
|
|
220
|
+
}
|
|
221
|
+
css "p { color: red; }"
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
widget 'views/child_widget', :superclass => 'Views::ParentWidget' do
|
|
225
|
+
requires %w{views/parent_widget}
|
|
226
|
+
css "p { color: blue; }"
|
|
227
|
+
|
|
228
|
+
content %{
|
|
229
|
+
div "hello"
|
|
230
|
+
}
|
|
231
|
+
end
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
doc = render_file_asset("views/child_widget")
|
|
235
|
+
expect(classes_from(doc, 'div').sort).to eq([
|
|
236
|
+
expected_file_asset('views/parent_widget.rb').parcels_wrapping_class,
|
|
237
|
+
expected_file_asset('views/child_widget.rb').parcels_wrapping_class
|
|
238
|
+
].sort)
|
|
239
|
+
end
|
|
240
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
describe "Parcels basic operations", :type => :system do
|
|
2
|
+
context "with a simple widget" do
|
|
3
|
+
before :each do
|
|
4
|
+
files {
|
|
5
|
+
file 'assets/basic.css', %{
|
|
6
|
+
//= require_parcels
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
widget 'views/my_widget' do
|
|
10
|
+
css %{
|
|
11
|
+
p { color: red; }
|
|
12
|
+
}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
file 'views/my_widget.pcss', %{
|
|
16
|
+
div { color: blue; }
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should aggregate the CSS from a simple widget properly" do
|
|
22
|
+
compiled_sprockets_asset('basic').should_match(file_assets do
|
|
23
|
+
asset 'views/my_widget.rb' do
|
|
24
|
+
expect_wrapped_rule :p, 'color: red'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
asset 'views/my_widget.pcss' do
|
|
28
|
+
expect_wrapped_rule :div, 'color: blue'
|
|
29
|
+
end
|
|
30
|
+
end)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "should apply the correct autogenerated class to the widget" do
|
|
34
|
+
doc = render_file_asset('views/my_widget')
|
|
35
|
+
expect(classes_from(doc, 'p')).to eq([ expected_file_asset('views/my_widget.rb').parcels_wrapping_class ])
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
context "with a widget ending in .html.rb" do
|
|
40
|
+
before :each do
|
|
41
|
+
files {
|
|
42
|
+
file 'assets/basic.css', %{
|
|
43
|
+
//= require_parcels
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
widget 'views/my_widget.html' do
|
|
47
|
+
css %{
|
|
48
|
+
p { color: red; }
|
|
49
|
+
}
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
file 'views/my_widget.html.pcss', %{
|
|
53
|
+
div { color: blue; }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "should aggregate the CSS from a simple widget properly" do
|
|
59
|
+
compiled_sprockets_asset('basic').should_match(file_assets do
|
|
60
|
+
asset 'views/my_widget.html.rb' do
|
|
61
|
+
expect_wrapped_rule :p, 'color: red'
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
asset 'views/my_widget.html.pcss' do
|
|
65
|
+
expect_wrapped_rule :div, 'color: blue'
|
|
66
|
+
end
|
|
67
|
+
end)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "should apply the correct autogenerated class to the widget" do
|
|
71
|
+
doc = render_file_asset('views/my_widget.html')
|
|
72
|
+
expect(classes_from(doc, 'p')).to eq([ expected_file_asset('views/my_widget.html.rb').parcels_wrapping_class ])
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Superclasses BEFORE subclasses -- it's the last-encountered CSS rule that applies
|
|
2
|
+
describe "Parcels dependency sorting", :type => :system do
|
|
3
|
+
it "should sort superclasses before subclasses in the generated file" do
|
|
4
|
+
sequence = (0..20).map { |i| rand(500) }.uniq
|
|
5
|
+
|
|
6
|
+
files {
|
|
7
|
+
file 'assets/basic.css', %{
|
|
8
|
+
//= require_parcels
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
creation_sequence = (0..(sequence.length - 1)).to_a.shuffle
|
|
12
|
+
|
|
13
|
+
creation_sequence.each do |cs|
|
|
14
|
+
seq = sequence[cs]
|
|
15
|
+
superclass_num = sequence[cs - 1] if cs > 0
|
|
16
|
+
superclass = superclass_num ? "Views::Widget#{superclass_num}" : ::Spec::Fixtures::WidgetBase
|
|
17
|
+
|
|
18
|
+
widget "views/widget#{seq}", :superclass => superclass do
|
|
19
|
+
css %{
|
|
20
|
+
p { color: #0000#{'%02d' % seq}; }
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
file "views/widget#{seq}.pcss", %{
|
|
25
|
+
div { color: #FFFF#{'%02d' % seq}; }
|
|
26
|
+
}
|
|
27
|
+
end
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
sequence.each { |s| require File.join(this_example_root, "views/widget#{s}") }
|
|
31
|
+
|
|
32
|
+
asset = compiled_sprockets_asset('basic')
|
|
33
|
+
|
|
34
|
+
asset.should_match((file_assets do
|
|
35
|
+
sequence.each do |seq|
|
|
36
|
+
# It's important that we keep .pcss before .rb here -- because we want CSS in the .rb file (_i.e._, directly
|
|
37
|
+
# in the widget class itself) to take priority over CSS in the .pcss alongside file.
|
|
38
|
+
asset "views/widget#{seq}.pcss" do
|
|
39
|
+
expect_wrapped_rule :div, "color: #FFFF#{'%02d' % seq}"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
asset "views/widget#{seq}.rb" do
|
|
43
|
+
expect_wrapped_rule :p, "color: #0000#{'%02d' % seq}"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end), :ordered => true)
|
|
47
|
+
end
|
|
48
|
+
end
|