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.
Files changed (158) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.rspec-local +4 -0
  4. data/.travis.yml +54 -0
  5. data/Gemfile +6 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +29 -0
  8. data/Rakefile +6 -0
  9. data/lib/parcels/dependency_parcel_list.rb +50 -0
  10. data/lib/parcels/environment.rb +60 -0
  11. data/lib/parcels/fortitude/alongside_engine.rb +37 -0
  12. data/lib/parcels/fortitude/assets.rb +212 -0
  13. data/lib/parcels/fortitude/enabling.rb +72 -0
  14. data/lib/parcels/fortitude/fortitude_engine.rb +35 -0
  15. data/lib/parcels/fortitude/fortitude_loader.rb +27 -0
  16. data/lib/parcels/fortitude/widget_engine.rb +31 -0
  17. data/lib/parcels/fortitude_alongside_parcel.rb +38 -0
  18. data/lib/parcels/fortitude_inline_parcel.rb +31 -0
  19. data/lib/parcels/fortitude_parcel.rb +102 -0
  20. data/lib/parcels/fragments/css_fragment.rb +107 -0
  21. data/lib/parcels/index.rb +16 -0
  22. data/lib/parcels/rails/rails_loader.rb +23 -0
  23. data/lib/parcels/rails/railtie.rb +16 -0
  24. data/lib/parcels/sprockets.rb +153 -0
  25. data/lib/parcels/utils/path_utils.rb +32 -0
  26. data/lib/parcels/version.rb +3 -0
  27. data/lib/parcels/widget_tree.rb +158 -0
  28. data/lib/parcels.rb +21 -0
  29. data/parcels.gemspec +48 -0
  30. data/spec/helpers/content_in_helpers.rb +21 -0
  31. data/spec/helpers/file_structure_helpers.rb +79 -0
  32. data/spec/helpers/global_helper.rb +34 -0
  33. data/spec/helpers/new_asset_helpers.rb +31 -0
  34. data/spec/helpers/new_rails_helpers.rb +31 -0
  35. data/spec/helpers/parcels_rails_helpers.rb +20 -0
  36. data/spec/helpers/per_example_helpers.rb +15 -0
  37. data/spec/helpers/sprockets_helpers.rb +23 -0
  38. data/spec/lib/spec/expected/base_expected_asset.rb +35 -0
  39. data/spec/lib/spec/expected/expected_asset.rb +135 -0
  40. data/spec/lib/spec/expected/expected_asset_set.rb +45 -0
  41. data/spec/lib/spec/expected/must_not_be_present_asset.rb +17 -0
  42. data/spec/lib/spec/fixtures/file_set.rb +80 -0
  43. data/spec/lib/spec/fixtures/widget_base.rb +13 -0
  44. data/spec/lib/spec/fixtures/widget_file.rb +108 -0
  45. data/spec/lib/spec/parsing/compiled_asset.rb +94 -0
  46. data/spec/lib/spec/parsing/compiled_asset_fragment.rb +38 -0
  47. data/spec/lib/spec/parsing/parsed_css_asset.rb +34 -0
  48. data/spec/lib/spec/parsing/precompiled_rails_asset.rb +52 -0
  49. data/spec/lib/spec/parsing/rails_asset.rb +30 -0
  50. data/spec/lib/spec/parsing/sprockets_asset.rb +40 -0
  51. data/spec/rails/basic_rails_spec.rb +102 -0
  52. data/spec/rails/compression_rails_spec.rb +11 -0
  53. data/spec/rails/development_mode_rails_spec.rb +321 -0
  54. data/spec/rails/sass_rails_spec.rb +125 -0
  55. data/spec/rails/sets_rails_spec.rb +85 -0
  56. data/spec/rails/templates/base/app/assets/stylesheets/application.css +16 -0
  57. data/spec/rails/templates/base/app/views/widgets/base.rb +4 -0
  58. data/spec/rails/templates/base/config/environments/production.rb +92 -0
  59. data/spec/rails/templates/base/lib/null_compressor.rb +5 -0
  60. data/spec/rails/templates/basic_rails_spec/app/controllers/basic_rails_spec_controller.rb +21 -0
  61. data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/alongside_and_inline.pcss +1 -0
  62. data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/alongside_and_inline.rb +9 -0
  63. data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/alongside_and_inline_html.html.pcss +1 -0
  64. data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/alongside_and_inline_html.html.rb +9 -0
  65. data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/alongside_erb.pcss +1 -0
  66. data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/alongside_erb.rb +7 -0
  67. data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/inline_erb.rb +9 -0
  68. data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/multiple_engines.pcss +1 -0
  69. data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/multiple_engines.rb +9 -0
  70. data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/no_corresponding_widget.pcss +1 -0
  71. data/spec/rails/templates/basic_rails_spec/app/views/basic_rails_spec/simple_css.rb +9 -0
  72. data/spec/rails/templates/compression_rails_spec/app/controllers/compression_rails_spec_controller.rb +5 -0
  73. data/spec/rails/templates/compression_rails_spec/app/views/compression_rails_spec/inline_and_alongside_css.pcss +1 -0
  74. data/spec/rails/templates/compression_rails_spec/app/views/compression_rails_spec/inline_and_alongside_css.rb +9 -0
  75. data/spec/rails/templates/compression_rails_spec/config/environments/production.rb +91 -0
  76. data/spec/rails/templates/development_mode_rails_spec/app/assets/stylesheets/changingone.scss +1 -0
  77. data/spec/rails/templates/development_mode_rails_spec/app/assets/stylesheets/changingtwo.scss +1 -0
  78. data/spec/rails/templates/development_mode_rails_spec/app/assets/stylesheets/import_dir/import_dir_ss_1.scss +1 -0
  79. data/spec/rails/templates/development_mode_rails_spec/app/controllers/development_mode_rails_spec_controller.rb +45 -0
  80. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/adding_alongside_css.rb +5 -0
  81. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/adding_inline_css.rb +7 -0
  82. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/adding_widget.rb +5 -0
  83. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/basic_widget_with_inline_and_alongside_parcels.pcss +3 -0
  84. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/basic_widget_with_inline_and_alongside_parcels.rb +9 -0
  85. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/changing_alongside_css.pcss +1 -0
  86. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/changing_alongside_css.rb +5 -0
  87. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/changing_import_file.pcss +2 -0
  88. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/changing_import_file.rb +10 -0
  89. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/changing_inline_css.rb +9 -0
  90. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/changing_prefix_imported_file.pcss +1 -0
  91. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/changing_prefix_imported_file.rb +7 -0
  92. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/removing_alongside_css.pcss +1 -0
  93. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/removing_alongside_css.rb +5 -0
  94. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/removing_inline_css.rb +7 -0
  95. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/removing_widget.pcss +1 -0
  96. data/spec/rails/templates/development_mode_rails_spec/app/views/development_mode_rails_spec/removing_widget.rb +9 -0
  97. data/spec/rails/templates/development_mode_rails_spec/app/views/import_base.rb +5 -0
  98. data/spec/rails/templates/development_mode_rails_spec/config/environments/development.rb +37 -0
  99. data/spec/rails/templates/development_mode_rails_spec/vendor/assets/stylesheets/one.scss +1 -0
  100. data/spec/rails/templates/development_mode_rails_spec/vendor/assets/stylesheets/two.scss +1 -0
  101. data/spec/rails/templates/sass_rails_spec/app/assets/foobar/the_import_dir_2/id2ss1.scss +1 -0
  102. data/spec/rails/templates/sass_rails_spec/app/assets/foobar/the_import_dir_2/id2ss2.scss +1 -0
  103. data/spec/rails/templates/sass_rails_spec/app/assets/foobar/twelve.scss +1 -0
  104. data/spec/rails/templates/sass_rails_spec/app/assets/foobar/two.scss +1 -0
  105. data/spec/rails/templates/sass_rails_spec/app/assets/images/quux/foo.png +0 -0
  106. data/spec/rails/templates/sass_rails_spec/app/assets/stylesheets/eleven.scss +1 -0
  107. data/spec/rails/templates/sass_rails_spec/app/assets/stylesheets/one.scss +1 -0
  108. data/spec/rails/templates/sass_rails_spec/app/assets/stylesheets/shared_import_dir/sid1ss1.scss +1 -0
  109. data/spec/rails/templates/sass_rails_spec/app/assets/stylesheets/shared_import_dir/sid1ss2.scss +1 -0
  110. data/spec/rails/templates/sass_rails_spec/app/assets/stylesheets/the_import_dir_1/id1ss1.scss +1 -0
  111. data/spec/rails/templates/sass_rails_spec/app/assets/stylesheets/the_import_dir_1/id1ss2.scss +1 -0
  112. data/spec/rails/templates/sass_rails_spec/app/controllers/sass_rails_spec_controller.rb +29 -0
  113. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/added_asset_path.pcss +2 -0
  114. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/added_asset_path.rb +10 -0
  115. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/asset_url.pcss +2 -0
  116. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/asset_url.rb +17 -0
  117. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/default_sass_import.pcss +6 -0
  118. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/default_sass_import.rb +14 -0
  119. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/import_directory.pcss +3 -0
  120. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/import_directory.rb +11 -0
  121. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/import_view_relative_directory.pcss +3 -0
  122. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/import_view_relative_directory.rb +11 -0
  123. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/other_features.pcss +1 -0
  124. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/other_features.rb +9 -0
  125. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/shared_imports.rb +10 -0
  126. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/vr_import_dir_1/vr1ss1.scss +1 -0
  127. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/vr_import_dir_1/vr1ss2.scss +1 -0
  128. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/vr_import_dir_2/vr2ss1.scss +1 -0
  129. data/spec/rails/templates/sass_rails_spec/app/views/sass_rails_spec/vr_import_dir_2/vr2ss2.scss +1 -0
  130. data/spec/rails/templates/sass_rails_spec/app/views/widgets/import_base.rb +5 -0
  131. data/spec/rails/templates/sass_rails_spec/config/application.rb +25 -0
  132. data/spec/rails/templates/sass_rails_spec/lib/more_assets/twenty.scss +1 -0
  133. data/spec/rails/templates/sass_rails_spec/vendor/assets/stylesheets/thirteen.scss +1 -0
  134. data/spec/rails/templates/sass_rails_spec/vendor/assets/stylesheets/three.scss +1 -0
  135. data/spec/rails/templates/sets_rails_spec/app/assets/stylesheets/admin.css.scss +1 -0
  136. data/spec/rails/templates/sets_rails_spec/app/assets/stylesheets/all.css.scss +1 -0
  137. data/spec/rails/templates/sets_rails_spec/app/assets/stylesheets/normal.css.scss +1 -0
  138. data/spec/rails/templates/sets_rails_spec/app/controllers/sets_rails_spec_controller.rb +3 -0
  139. data/spec/rails/templates/sets_rails_spec/app/views/admin/admin_one.pcss +1 -0
  140. data/spec/rails/templates/sets_rails_spec/app/views/admin/admin_one.rb +3 -0
  141. data/spec/rails/templates/sets_rails_spec/app/views/admin/admin_two.pcss +1 -0
  142. data/spec/rails/templates/sets_rails_spec/app/views/admin/admin_two.rb +3 -0
  143. data/spec/rails/templates/sets_rails_spec/app/views/admin/base.rb +3 -0
  144. data/spec/rails/templates/sets_rails_spec/app/views/root.rb +9 -0
  145. data/spec/rails/templates/sets_rails_spec/app/views/sets_base.rb +3 -0
  146. data/spec/rails/templates/sets_rails_spec/app/views/sets_rails_spec/normal_one.pcss +1 -0
  147. data/spec/rails/templates/sets_rails_spec/app/views/sets_rails_spec/normal_one.rb +3 -0
  148. data/spec/rails/templates/sets_rails_spec/app/views/sets_rails_spec/normal_two.pcss +1 -0
  149. data/spec/rails/templates/sets_rails_spec/app/views/sets_rails_spec/normal_two.rb +3 -0
  150. data/spec/system/alongside_file_spec.rb +193 -0
  151. data/spec/system/autogenerated_class_application_spec.rb +240 -0
  152. data/spec/system/basic_system_spec.rb +75 -0
  153. data/spec/system/dependency_sorting_spec.rb +48 -0
  154. data/spec/system/engines_spec.rb +245 -0
  155. data/spec/system/prefix_spec.rb +108 -0
  156. data/spec/system/sass_features_spec.rb +109 -0
  157. data/spec/system/sets_spec.rb +405 -0
  158. metadata +477 -0
@@ -0,0 +1 @@
1
+ $mycolor20: #a0b1c2;
@@ -0,0 +1 @@
1
+ //= require_parcels admin
@@ -0,0 +1 @@
1
+ //= require_parcels normal
@@ -0,0 +1,3 @@
1
+ class SetsRailsSpecController < ApplicationController
2
+ # nothing here yet
3
+ end
@@ -0,0 +1 @@
1
+ p.a { color: red; }
@@ -0,0 +1,3 @@
1
+ class Views::Admin::AdminOne < Views::Admin::Base
2
+ css %{p { color: red; }}
3
+ end
@@ -0,0 +1 @@
1
+ div.a { color: green; }
@@ -0,0 +1,3 @@
1
+ class Views::Admin::AdminTwo < Views::Root
2
+ css %{div { color: green; }}
3
+ end
@@ -0,0 +1,3 @@
1
+ class Views::Admin::Base < Views::SetsBase
2
+ parcels_sets :admin
3
+ end
@@ -0,0 +1,9 @@
1
+ class Views::Root < Views::Widgets::Base
2
+ parcels_sets do |klass, filename|
3
+ if filename =~ /admin/
4
+ :admin
5
+ else
6
+ :normal
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ class Views::SetsBase < Views::Widgets::Base
2
+ parcels_sets :normal
3
+ end
@@ -0,0 +1,3 @@
1
+ class Views::SetsRailsSpec::NormalOne < Views::SetsBase
2
+ css %{span { color: blue; }}
3
+ end
@@ -0,0 +1,3 @@
1
+ class Views::SetsRailsSpec::NormalTwo < Views::Root
2
+ css %{em { color: yellow; }}
3
+ end
@@ -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