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,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
|