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,108 @@
1
+ module Spec
2
+ module Fixtures
3
+ class WidgetFile
4
+ def initialize(class_name, superclass, root_dir)
5
+ @class_name = class_name
6
+ @superclass = superclass
7
+ @root_dir = root_dir
8
+ @css = [ ]
9
+ @css_prefix_text = nil
10
+ @css_prefix_block = nil
11
+ @sets = nil
12
+ @sets_set = false
13
+ @requires = [ ]
14
+ @class_text = [ ]
15
+ end
16
+
17
+ def css(css_text, options = { })
18
+ @css << {
19
+ :text => css_text,
20
+ :options => options[:options]
21
+ }
22
+ end
23
+
24
+ def css_prefix(css_prefix_text)
25
+ @css_prefix_text = css_prefix_text
26
+ end
27
+
28
+ def css_prefix_block(css_prefix_block)
29
+ @css_prefix_block = css_prefix_block
30
+ end
31
+
32
+ def sets(*sets)
33
+ @sets = sets
34
+ @sets = nil if @sets == [ nil ]
35
+ @sets_set = true
36
+ end
37
+
38
+ def sets_block(sets_block)
39
+ @sets_block = sets_block
40
+ end
41
+
42
+ def content(content_text)
43
+ @content_text = content_text
44
+ end
45
+
46
+ def class_text(text)
47
+ @class_text << text
48
+ end
49
+
50
+ def requires(*the_requires)
51
+ the_requires = Array(the_requires).flatten.uniq
52
+ @requires |= the_requires
53
+ end
54
+
55
+ def source_text
56
+ text = [ ]
57
+
58
+ @requires.each do |the_require|
59
+ text << "require '#{File.join(@root_dir, the_require)}'"
60
+ end
61
+
62
+ text << "class #{class_name} < ::#{superclass}"
63
+
64
+ text += @class_text
65
+
66
+ if @sets_block
67
+ text += [ " parcels_sets #{@sets_block}" ]
68
+ elsif @sets_set
69
+ if @sets.kind_of?(Array)
70
+ text << " parcels_sets #{@sets.map { |s| s.inspect }.join(", ")}"
71
+ else
72
+ text << " parcels_sets #{@sets.inspect}"
73
+ end
74
+ end
75
+
76
+ if @css_prefix_block
77
+ text += [ " css_prefix #{@css_prefix_block}" ]
78
+ elsif @css_prefix_text
79
+ text += [ " css_prefix <<-EOS", @css_prefix_text, "EOS" ]
80
+ end
81
+
82
+ @css.each do |data|
83
+ css_text = data[:text]
84
+ options = data[:options]
85
+
86
+ if options
87
+ text << " css <<-EOS, #{options.inspect}"
88
+ else
89
+ text << " css <<-EOS"
90
+ end
91
+
92
+ text << css_text
93
+ text << "EOS"
94
+ end
95
+
96
+ if @content_text
97
+ text += [ " def content", @content_text, " end" ]
98
+ end
99
+
100
+ text += [ "end" ]
101
+ text.join("\n") + "\n"
102
+ end
103
+
104
+ private
105
+ attr_reader :class_name, :superclass
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,94 @@
1
+ require 'spec/parsing/compiled_asset_fragment'
2
+
3
+ module Spec
4
+ module Parsing
5
+ class CompiledAsset
6
+ def initialize(raw_asset)
7
+ @raw_asset = raw_asset
8
+ end
9
+
10
+ def where_from
11
+ "compiled asset for #{raw_asset.where_from}"
12
+ end
13
+
14
+ def fragments
15
+ @fragments ||= begin
16
+ if (raw_source = raw_asset.source)
17
+ parse_fragments_from_raw_source(raw_source)
18
+ else
19
+ :none
20
+ end
21
+ end
22
+
23
+ @fragments unless @fragments == :none
24
+ end
25
+
26
+ def source
27
+ raw_asset.source
28
+ end
29
+
30
+ def to_s
31
+ "<CompiledAsset for #{raw_asset}>"
32
+ end
33
+
34
+ def should_match(expected_asset_set, options = { })
35
+ remaining_fragments = (fragments || [ ]).dup
36
+ remaining_fragments = remaining_fragments.select { |f| (f.source || "").strip.length > 0 }
37
+
38
+ found_indices = [ ]
39
+ expected_asset_set.expected_assets.each do |expected_asset|
40
+ matched_fragments = expected_asset.should_match(remaining_fragments)
41
+ matched_fragments.each do |matched_fragment|
42
+ found_indices << fragments.index(matched_fragment)
43
+ remaining_fragments.delete(matched_fragment)
44
+ end
45
+ end
46
+
47
+ if options[:ordered] && (found_indices.sort != found_indices)
48
+ raise "All fragments were found, but not in order, and order was required. We found fragments at indices:\n #{found_indices.inspect}"
49
+ end
50
+
51
+ if (! expected_asset_set.allows_additional?) && (remaining_fragments.length > 0)
52
+ raise "Unexpected fragments found in\n #{self}:\nThese were found just fine:\n #{expected_asset_set}\nbut we also found:\n #{remaining_fragments.join("\n ")}"
53
+ end
54
+ end
55
+
56
+ private
57
+ attr_reader :raw_asset
58
+
59
+ FROM_LINE_REGEXP = %r{^\s*\/\*\s*From[\s'"]*([^'"]+?)\s*[\s'"]*:\s*(\d+)[\s'"]*\*/\s*$}i
60
+ BREAK_LINE_REGEXP = %r{^\s*//\s*===\s*BREAK\s*===\s*$}i
61
+
62
+ def parse_fragments_from_raw_source(raw_source)
63
+ remaining = raw_source.strip
64
+ out = [ ]
65
+
66
+ current_fragment = ::Spec::Parsing::CompiledAssetFragment.new(self, :head, nil)
67
+ out << current_fragment
68
+
69
+ while remaining && remaining.length > 0
70
+ if (from_line_match = FROM_LINE_REGEXP.match(remaining))
71
+ current_fragment << remaining[0..(from_line_match.begin(0) - 1)] if from_line_match.begin(0) > 0
72
+ current_fragment = ::Spec::Parsing::CompiledAssetFragment.new(
73
+ self, from_line_match.captures[0], Integer(from_line_match.captures[1]))
74
+ out << current_fragment
75
+ remaining = remaining[(from_line_match.end(0) + 1)..-1]
76
+ else
77
+ if (break_line_match = BREAK_LINE_REGEXP.match(remaining))
78
+ current_fragment << remaining[0..(break_line_match.begin(0) - 1)]
79
+ tail_fragment = ::Spec::Parsing::CompiledAssetFragment.new(self, :tail, nil)
80
+ tail_fragment << remaining[(break_line_match.end(0) + 1)..-1]
81
+ out << tail_fragment
82
+ else
83
+ current_fragment << remaining
84
+ end
85
+
86
+ remaining = nil
87
+ end
88
+ end
89
+
90
+ out
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,38 @@
1
+ module Spec
2
+ module Parsing
3
+ class CompiledAssetFragment
4
+ attr_reader :filename, :line_number, :source
5
+
6
+ def initialize(compiled_asset, filename, line_number)
7
+ @compiled_asset = compiled_asset
8
+ @filename = filename
9
+ @line_number = line_number
10
+ @raw_source = nil
11
+ end
12
+
13
+ def where_from
14
+ "fragment at #{filename.inspect}, line #{line_number} from #{compiled_asset.where_from}"
15
+ end
16
+
17
+ def source
18
+ out = @raw_source
19
+ out = out.gsub(%r{/\*.*?\*/}mi, '') if out
20
+ out unless (! out) || (out.strip.length == 0)
21
+ end
22
+
23
+ def <<(source)
24
+ if (effective_source = source.strip) && effective_source.length > 0
25
+ @raw_source ||= ""
26
+ @raw_source << effective_source
27
+ end
28
+ end
29
+
30
+ def to_s
31
+ "<CompiledAssetFragment: #{filename.inspect}, line #{line_number.inspect}>"
32
+ end
33
+
34
+ private
35
+ attr_reader :compiled_asset
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,34 @@
1
+ require 'css_parser'
2
+
3
+ module Spec
4
+ module Parsing
5
+ class ParsedCssAsset
6
+ def initialize(raw_asset)
7
+ @raw_asset = raw_asset
8
+ end
9
+
10
+ def style_rules
11
+ @style_rules ||= begin
12
+ out = { }
13
+
14
+ if raw_asset.source
15
+ parser = CssParser::Parser.new
16
+ parser.load_string!(raw_asset.source)
17
+ parser.each_selector do |selectors, declarations, specificity, media_types|
18
+ out[selectors] = Array(declarations).map do |declaration|
19
+ declaration = declaration.strip
20
+ declaration = $1 if declaration =~ /\A(.*?);\Z/mi
21
+ declaration
22
+ end
23
+ end
24
+ end
25
+
26
+ out
27
+ end
28
+ end
29
+
30
+ private
31
+ attr_reader :raw_asset
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,52 @@
1
+ module Spec
2
+ module Parsing
3
+ class PrecompiledRailsAsset
4
+ def initialize(rails_server, asset_path)
5
+ @rails_server = rails_server
6
+ @asset_path = asset_path
7
+ end
8
+
9
+ def where_from
10
+ "Rails precompiled asset '#{asset_path}'"
11
+ end
12
+
13
+ def exists?
14
+ !! source
15
+ end
16
+
17
+ def source
18
+ @source ||= begin
19
+ assets_dir = File.join(rails_server.rails_root, 'public', 'assets')
20
+ filename = extension = nil
21
+
22
+ if File.basename(asset_path) =~ /^(\S+)\.([^\.]+)$/i
23
+ filename = $1
24
+ extension = $2
25
+ else
26
+ raise "Can't get filename and extension from: #{asset_path.inspect}"
27
+ end
28
+
29
+ entries = Dir.entries(assets_dir).select { |e| e =~ /^#{Regexp.escape(filename)}\-[0-9a-f]+\.#{Regexp.escape(extension)}$/i }
30
+
31
+ if entries.length == 0
32
+ :none
33
+ elsif entries.length == 1
34
+ path = File.join(assets_dir, entries.first)
35
+ File.read(path)
36
+ elsif entries.length > 1
37
+ raise "Found multiple entries in #{assets_dir.inspect} matching #{filename.inspect}/#{extension.inspect}: #{entries.inspect}"
38
+ end
39
+ end
40
+
41
+ @source unless @source == :none
42
+ end
43
+
44
+ def to_s
45
+ "<PrecompiledRailsAsset '#{asset_path}'>"
46
+ end
47
+
48
+ private
49
+ attr_reader :rails_server, :asset_path
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,30 @@
1
+ module Spec
2
+ module Parsing
3
+ class RailsAsset
4
+ def initialize(rails_server, asset_path)
5
+ @rails_server = rails_server
6
+ @asset_path = asset_path
7
+ end
8
+
9
+ def where_from
10
+ "Rails asset '#{asset_path}'"
11
+ end
12
+
13
+ def exists?
14
+ !! source
15
+ end
16
+
17
+ def source
18
+ @source ||= (rails_server.get("assets/#{asset_path}", :nil_on_not_found => true) || :none)
19
+ @source unless @source == :none
20
+ end
21
+
22
+ def to_s
23
+ "<RailsAsset '#{asset_path}'>"
24
+ end
25
+
26
+ private
27
+ attr_reader :rails_server, :asset_path
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,40 @@
1
+ module Spec
2
+ module Parsing
3
+ class SprocketsAsset
4
+ def initialize(sprockets_env, asset_path)
5
+ @sprockets_env = sprockets_env
6
+ @asset_path = asset_path
7
+ end
8
+
9
+ def where_from
10
+ "raw Sprockets asset '#{asset_path}'"
11
+ end
12
+
13
+ def exists?
14
+ !! asset
15
+ end
16
+
17
+ def source
18
+ if asset
19
+ if asset.respond_to?(:source)
20
+ asset.source
21
+ else
22
+ asset.to_s
23
+ end
24
+ end
25
+ end
26
+
27
+ def to_s
28
+ "<SprocketsAsset '#{asset_path}'>"
29
+ end
30
+
31
+ private
32
+ attr_reader :sprockets_env, :asset_path
33
+
34
+ def asset
35
+ @asset ||= (sprockets_env.find_asset(asset_path) || :none)
36
+ @asset unless @asset == :none
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,102 @@
1
+ describe "Parcels Rails basic support", :type => :rails do
2
+ uses_rails_with_template :basic_rails_spec
3
+
4
+ it "should at least have a working Rails server" do
5
+ expect_match("simple_css", /hello, world/)
6
+ end
7
+
8
+ it "should wrap a simple widget in a class" do
9
+ expected_class = expected_rails_asset('views/basic_rails_spec/simple_css.rb').parcels_wrapping_class
10
+ expect_match("simple_css", /<p class="#{Regexp.escape(expected_class)}">hello, world<\/p>/)
11
+ end
12
+
13
+ it "should contain the CSS in application.css due to the 'require_parcels' directive" do
14
+ asset = compiled_rails_asset('application.css')
15
+
16
+ asset.should_match(rails_assets do
17
+ asset 'views/basic_rails_spec/simple_css.rb' do
18
+ expect_wrapped_rule nil, 'color: green'
19
+ end
20
+ allow_additional_assets!
21
+ end)
22
+ end
23
+
24
+ it "should support both inline and alongside CSS on a .rb widget" do
25
+ compiled_rails_asset('application.css').should_match(rails_assets do
26
+ asset 'views/basic_rails_spec/alongside_and_inline.rb' do
27
+ expect_wrapped_rule :p, 'color: green'
28
+ end
29
+
30
+ asset 'views/basic_rails_spec/alongside_and_inline.pcss' do
31
+ expect_wrapped_rule :div, 'color: blue'
32
+ end
33
+
34
+ allow_additional_assets!
35
+ end)
36
+ end
37
+
38
+ it "should support both inline and alongside CSS on a .html.rb widget" do
39
+ compiled_rails_asset('application.css').should_match(rails_assets do
40
+ asset 'views/basic_rails_spec/alongside_and_inline_html.html.rb' do
41
+ expect_wrapped_rule :p, 'color: yellow'
42
+ end
43
+
44
+ asset 'views/basic_rails_spec/alongside_and_inline_html.html.pcss' do
45
+ expect_wrapped_rule :div, 'color: purple'
46
+ end
47
+
48
+ allow_additional_assets!
49
+ end)
50
+ end
51
+
52
+ it "should allow precompiling assets with 'rake'" do
53
+ rails_server.run_command_in_rails_root!("rake assets:precompile --trace")
54
+
55
+ asset = precompiled_rails_asset('application.css')
56
+ asset.should_match(rails_assets do
57
+ asset 'views/basic_rails_spec/simple_css.rb' do
58
+ expect_wrapped_rule nil, 'color: green'
59
+ end
60
+ allow_additional_assets!
61
+ end)
62
+ end
63
+
64
+ it "should not pick up alongside files if there is no corresponding widget class" do
65
+ compiled_rails_asset('application.css') do
66
+ asset_must_not_be_present('views/basic_rails_spec/no_corresponding_widget.pcss')
67
+ allow_additional_assets!
68
+ end
69
+ end
70
+
71
+ it "should allow using ERb in inline CSS if desired" do
72
+ compiled_rails_asset('application.css').should_match(rails_assets do
73
+ asset 'views/basic_rails_spec/inline_erb.rb' do
74
+ expect_wrapped_rule :p, 'background-image: url("foo-21")'
75
+ end
76
+ allow_additional_assets!
77
+ end)
78
+ end
79
+
80
+ it "should allow using ERb in alongside CSS if desired" do
81
+ compiled_rails_asset('application.css').should_match(rails_assets do
82
+ asset 'views/basic_rails_spec/alongside_erb.pcss' do
83
+ expect_wrapped_rule :p, 'background-image: url("foo-21")'
84
+ end
85
+ allow_additional_assets!
86
+ end)
87
+ end
88
+
89
+ it "should allow using other asset-pipeline engines (extensions) if desired" do
90
+ compiled_rails_asset('application.css').should_match(rails_assets do
91
+ asset 'views/basic_rails_spec/multiple_engines.rb' do
92
+ expect_wrapped_rule :p, 'background-image: url("21")'
93
+ end
94
+
95
+ asset 'views/basic_rails_spec/multiple_engines.pcss' do
96
+ expect_wrapped_rule :div, 'background-image: url("21")'
97
+ end
98
+
99
+ allow_additional_assets!
100
+ end)
101
+ end
102
+ end
@@ -0,0 +1,11 @@
1
+ describe "Parcels Rails support with compression enabled", :type => :rails do
2
+ uses_rails_with_template :compression_rails_spec
3
+
4
+ it "should still seem to contain our inline and alongside CSS" do
5
+ asset = compiled_rails_asset('application.css')
6
+ source = asset.source
7
+
8
+ expect(source).to match(/.parcels_class__views__compression_rails_spec__inline_and_alongside_css\s+div\{color:blue\}/i)
9
+ expect(source).to match(/.parcels_class__views__compression_rails_spec__inline_and_alongside_css\s+p\{color:green\}/i)
10
+ end
11
+ end