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
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 658277fafd37674b7c9be8026a325a2cb907f89c
4
+ data.tar.gz: a1f74856053841ef8fb0573d246b64a712544c49
5
+ SHA512:
6
+ metadata.gz: a589bcc70801b68c35d4d3b16e2a07e7863a199e211a96ca50f171dac1ea623215ed034084f8efcd7845b827565275eb51d832bd6a8a00bcf8f17f90d6606fcb
7
+ data.tar.gz: 3005a5072e9d47179a0946ce166626cf6db502f9c99fe1f74b87014b57b2776369c1d04427a7f85be903a3d309d7002ca8a7abdad50d3327f8373343d90d8dd8
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/.rspec-local ADDED
@@ -0,0 +1,4 @@
1
+ --format documentation
2
+ --color
3
+ --order random
4
+ -r helpers/global_helper
data/.travis.yml ADDED
@@ -0,0 +1,54 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.8.7"
4
+ - "1.9.3"
5
+ - "2.0.0"
6
+ - "2.1.5"
7
+ - "jruby-1.7.17"
8
+ env:
9
+ - PARCELS_SPECS_SPROCKETS_VERSION=2.11.3 PARCELS_SPECS_RAILS_VERSION=4.1.7
10
+ - PARCELS_SPECS_SPROCKETS_VERSION=2.11.3 PARCELS_SPECS_RAILS_VERSION=4.0.11
11
+ - PARCELS_SPECS_SPROCKETS_VERSION=2.2.3 PARCELS_SPECS_RAILS_VERSION=3.2.21
12
+ - PARCELS_SPECS_SPROCKETS_VERSION=2.0.5 PARCELS_SPECS_RAILS_VERSION=3.1.12
13
+ before_script:
14
+ - export JRUBY_OPTS="$JRUBY_OPTS -J-Xmx384m -J-Xms384m -J-Xss2048k"
15
+ matrix:
16
+ exclude:
17
+ # Rails 4.x doesn't support Ruby 1.8.7
18
+ - rvm: 1.8.7
19
+ env: PARCELS_SPECS_SPROCKETS_VERSION=2.11.3 PARCELS_SPECS_RAILS_VERSION=4.1.7
20
+ - rvm: 1.8.7
21
+ env: PARCELS_SPECS_SPROCKETS_VERSION=2.11.3 PARCELS_SPECS_RAILS_VERSION=4.0.11
22
+ allow_failures:
23
+ # 2014-12-14 ageweke -- Unfortunately, there appears to be a bug in Ruby 1.8.7 that conflicts with Sass and
24
+ # is biting us here. The symptom is that our out-of-process Rails server suddenly crashes, causing various
25
+ # Rails specs to fail with 'connection refused' or 'end of file' (when reading from the socket) kinds of
26
+ # errors. If you look in log/rails-server.log in the Rails server directory, you'll see something like
27
+ # this:
28
+ #
29
+ # : [BUG] gc_sweep(): unknown data type 0x0(0x109cd5fa0)
30
+ # ruby 1.8.7 (2013-06-27 patchlevel 374) [i686-darwin14.0.0]
31
+ #
32
+ # There are multiple sources
33
+ # (https://stackoverflow.com/questions/3844794/server-failure-bug-gc-sweep-unknown-data-type-0x0,
34
+ # https://github.com/sass/sass/issues/581, etc.)
35
+ # indicating that other people have hit this repeatedly, and we don't seem to ever see it on other Ruby
36
+ # versions.
37
+ #
38
+ # Since 1.8.7 is very old as of this writing, while I'd like to keep officially supporting it, I'm going to
39
+ # keep running these tests but monitor them manually, to see if anything *other* than the Rails specs
40
+ # starts failing.
41
+ - rvm: 1.8.7
42
+ env: PARCELS_SPECS_SPROCKETS_VERSION=2.2.3 PARCELS_SPECS_RAILS_VERSION=3.2.21
43
+ - rvm: 1.8.7
44
+ env: PARCELS_SPECS_SPROCKETS_VERSION=2.0.5 PARCELS_SPECS_RAILS_VERSION=3.1.12
45
+ # 2014-12-14 ageweke -- Just like Fortitude, getting Travis to actually do reliable JRuby specs seems to be
46
+ # impossible, sadly.
47
+ - rvm: jruby-1.7.17
48
+ env: PARCELS_SPECS_SPROCKETS_VERSION=2.11.3 PARCELS_SPECS_RAILS_VERSION=4.1.7
49
+ - rvm: jruby-1.7.17
50
+ env: PARCELS_SPECS_SPROCKETS_VERSION=2.11.3 PARCELS_SPECS_RAILS_VERSION=4.0.11
51
+ - rvm: jruby-1.7.17
52
+ env: PARCELS_SPECS_SPROCKETS_VERSION=2.2.3 PARCELS_SPECS_RAILS_VERSION=3.2.21
53
+ - rvm: jruby-1.7.17
54
+ env: PARCELS_SPECS_SPROCKETS_VERSION=2.0.5 PARCELS_SPECS_RAILS_VERSION=3.1.12
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in parcels.gemspec
4
+ gemspec
5
+ gem 'oop_rails_server', :path => '../oop_rails_server'
6
+ gem 'fortitude', :path => '../fortitude'
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Andrew Geweke
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Parcels
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'parcels'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install parcels
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it ( https://github.com/[my-github-username]/parcels/fork )
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,50 @@
1
+ require 'tsort'
2
+
3
+ module Parcels
4
+ class DependencyParcelList
5
+ def initialize
6
+ @tag_to_child_tag_map = { }
7
+ @parcel_to_tag_map = { }
8
+ @tag_to_parcel_map = { }
9
+
10
+ @loose_parcels = [ ]
11
+ end
12
+
13
+ def tsort_each_node(&block)
14
+ parcel_to_tag_map.keys.each(&block)
15
+ end
16
+
17
+ def tsort_each_child(parcel, &block)
18
+ tag = parcel_to_tag_map[parcel]
19
+ child_tags = tag_to_child_tag_map[tag] || [ ]
20
+ child_parcels = child_tags.map { |t| tag_to_parcel_map[t] }.compact
21
+
22
+ child_parcels.each(&block)
23
+ end
24
+
25
+ def add_parcels!(parcels)
26
+ parcels.each do |parcel|
27
+ if parcel.tag
28
+ parcel_to_tag_map[parcel] = parcel.tag
29
+ tag_to_parcel_map[parcel.tag] = parcel
30
+
31
+ parcel.tags_that_must_come_before.each do |tag_that_must_come_before|
32
+ tag_to_child_tag_map[tag_that_must_come_before] ||= [ ]
33
+ tag_to_child_tag_map[tag_that_must_come_before] << parcel.tag
34
+ end
35
+ else
36
+ loose_parcels << parcel
37
+ end
38
+ end
39
+ end
40
+
41
+ def parcels_in_order
42
+ tsort.reverse # tsort puts children before parents; we want the exact opposite
43
+ end
44
+
45
+ include TSort
46
+
47
+ private
48
+ attr_reader :tag_to_child_tag_map, :parcel_to_tag_map, :tag_to_parcel_map, :loose_parcels
49
+ end
50
+ end
@@ -0,0 +1,60 @@
1
+ require 'parcels/widget_tree'
2
+
3
+ module Parcels
4
+ class Environment
5
+ attr_reader :sprockets_environment
6
+
7
+ delegate :root, :to => :sprockets_environment
8
+
9
+ def initialize(sprockets_environment)
10
+ @sprockets_environment = sprockets_environment
11
+ @widget_trees = [ ]
12
+
13
+ register_engines!
14
+ end
15
+
16
+ def is_underneath_root?(filename)
17
+ filename = File.expand_path(filename)
18
+ filename.length > root.length && filename[0..(root.length - 1)] == root
19
+ end
20
+
21
+ def add_widget_tree!(widget_tree_root)
22
+ widget_tree_root = File.expand_path(widget_tree_root, root)
23
+ widget_tree = widget_trees.detect { |wt| wt.root == widget_tree_root }
24
+
25
+ if (! widget_tree)
26
+ widget_tree = WidgetTree.new(self, widget_tree_root)
27
+ widget_trees << widget_tree
28
+ end
29
+
30
+ widget_tree.add_workaround_directory_to_sprockets!(sprockets_environment)
31
+ end
32
+
33
+ def widget_class_from_file(pathname)
34
+ ::Fortitude::Widget.widget_class_from_file(pathname, :root_dirs => widget_trees.map(&:root))
35
+ end
36
+
37
+ def create_and_add_all_workaround_directories!
38
+ # widget_trees.each do |widget_tree|
39
+ # widget_tree.add_workaround_directory_to_sprockets!(sprockets_environment)
40
+ # end
41
+ end
42
+
43
+ def add_all_widgets_to!(sprockets_context, set_names)
44
+ widget_trees.each { |wt| wt.add_all_widgets_to_sprockets_context!(sprockets_context, set_names) }
45
+ end
46
+
47
+ private
48
+ attr_reader :widget_trees
49
+
50
+ def register_engines!
51
+ @engines_registered ||= begin
52
+ if ::Parcels.fortitude_available?
53
+ @sprockets_environment.register_engine '.rb', ::Parcels::Fortitude::WidgetEngine
54
+ @sprockets_environment.register_engine '.pcss', ::Parcels::Fortitude::AlongsideEngine
55
+ end
56
+ true
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,37 @@
1
+ require 'tilt'
2
+
3
+ module Parcels
4
+ module Fortitude
5
+ class AlongsideEngine < Tilt::Template
6
+ self.default_mime_type = 'text/css'
7
+
8
+ def self.engine_initialized?
9
+ true
10
+ end
11
+
12
+ def initialize_engine
13
+ require_template_library 'fortitude'
14
+ end
15
+
16
+ def prepare
17
+ end
18
+
19
+ def evaluate(context, locals, &block)
20
+ parcels_environment = context.environment.parcels
21
+ widget_file = ::Parcels::Utils::PathUtils.widget_class_file_for_alongside_file(context.pathname)
22
+
23
+ unless widget_file
24
+ raise Errno::ENOENT, "Somehow, we're being asked to render CSS from #{context.pathname.to_s.inspect}, but we can't find a Fortitude widget class next to that file"
25
+ end
26
+
27
+ widget_class = parcels_environment.widget_class_from_file(widget_file)
28
+
29
+ if widget_class
30
+ widget_class._parcels_widget_class_alongside_css(parcels_environment, context)
31
+ else
32
+ ""
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,212 @@
1
+ require 'active_support'
2
+ require 'active_support/concern'
3
+
4
+ require 'parcels/fragments/css_fragment'
5
+
6
+ require 'sass'
7
+
8
+ module Parcels
9
+ module Fortitude
10
+ module Assets
11
+ extend ActiveSupport::Concern
12
+
13
+ module ClassMethods
14
+ def inherited(new_class)
15
+ super(new_class)
16
+
17
+ if respond_to?(:caller_locations, true) && false
18
+ locations = caller_locations(1, 1)
19
+ filename = locations.first.absolute_path
20
+ new_class._parcels_inherited_called_from(filename)
21
+ else
22
+ string = caller[0]
23
+ if string =~ /^([^:]+):\d+/
24
+ new_class._parcels_inherited_called_from($1)
25
+ else
26
+ raise "Parcels: #{new_class} inherited from #{self.name}, but caller string was unparseable: '#{string}'"
27
+ end
28
+ end
29
+ end
30
+
31
+ def _parcels_inherited_called_from(filename)
32
+ @_parcels_class_definition_files ||= [ ]
33
+ @_parcels_class_definition_files << filename
34
+ end
35
+
36
+ def _parcels_class_definition_files
37
+ @_parcels_class_definition_files ||= [ ]
38
+ end
39
+
40
+ def _parcels_widget_outer_element_classes
41
+ @_parcels_widget_outer_element_classes ||= begin
42
+ out = [ ]
43
+ out << _parcels_widget_outer_element_class if _parcels_wrapping_css_class_required?
44
+ out += superclass._parcels_widget_outer_element_classes if superclass.respond_to?(:parcels_enabled?) && superclass.parcels_enabled?
45
+ out
46
+ end
47
+ end
48
+
49
+ def _parcels_css_fragments
50
+ _parcels_alongside_css_fragments + _parcels_inline_css_fragments
51
+ end
52
+
53
+ def _parcels_widget_outer_element_class
54
+ @_parcels_widget_outer_element_class ||= begin
55
+ class_suffix = self.name.gsub('::', '__').underscore.gsub(/[^A-Za-z0-9_]/, '_')
56
+
57
+ "parcels_class__#{class_suffix}"
58
+ end
59
+ end
60
+
61
+ def _parcels_widget_class_css(parcels_environment, context)
62
+ ::Parcels::Fragments::CssFragment.to_css(parcels_environment, context, _parcels_css_fragments)
63
+ end
64
+
65
+ def _parcels_widget_class_inline_css(parcels_environment, context)
66
+ ::Parcels::Fragments::CssFragment.to_css(parcels_environment, context, _parcels_inline_css_fragments)
67
+ end
68
+
69
+ def _parcels_widget_class_alongside_css(parcels_environment, context)
70
+ ::Parcels::Fragments::CssFragment.to_css(parcels_environment, context, _parcels_alongside_css_fragments)
71
+ end
72
+
73
+ def _parcels_wrapping_css_class_required?
74
+ _parcels_css_fragments.detect { |f| f.wrapping_css_class_required? }
75
+ end
76
+
77
+ def _parcels_alongside_css_fragments
78
+ options = { :prefix => _parcels_get_css_prefix }.merge(_parcels_css_options)
79
+ _parcels_alongside_filenames.map do |filename|
80
+ if File.exist?(filename)
81
+ ::Parcels::Fragments::CssFragment.new(File.read(filename), self, filename, 1, options)
82
+ end
83
+ end.compact
84
+ end
85
+
86
+ def _parcels_alongside_filenames
87
+ out = [ ]
88
+
89
+ _parcels_class_definition_files.each do |filename|
90
+ filename = $1 if filename =~ /^(.*)\.rb$/i
91
+ out << "#{filename}.pcss"
92
+ end
93
+
94
+ out.select { |f| File.file?(f) }
95
+ end
96
+
97
+ def _parcels_add_wrapper_css_classes_to(attributes, wrapper_classes)
98
+ out = attributes || { }
99
+ key = out.key?('class') ? 'class' : :class
100
+ out[key] = Array(out[key]) + wrapper_classes
101
+ out
102
+ end
103
+
104
+ def _parcels_inline_css_fragments
105
+ @_parcels_inline_css_fragments ||= [ ]
106
+ end
107
+
108
+ def css_options(options)
109
+ raise ArgumentError, "You must pass a Hash to css_options, not: #{options.inspect}" unless options.kind_of?(Hash)
110
+ options.assert_valid_keys(:engines)
111
+
112
+ @_parcels_css_options = options
113
+ end
114
+
115
+ def _parcels_css_options
116
+ out = @_parcels_css_options
117
+ out ||= superclass._parcels_css_options if superclass.respond_to?(:_parcels_css_options)
118
+ out || { }
119
+ end
120
+
121
+ def css(*css_strings)
122
+ unless parcels_enabled?
123
+ klass = self
124
+ superclasses = all_fortitude_superclasses
125
+
126
+ raise %{Before using this Parcels method, you must first enable Parcels on this class. Simply
127
+ call 'enable_parcels!', a class method, on the base widget class you want to enable -- typically, this
128
+ is your base Fortitude widget class.
129
+
130
+ This class is #{klass.name};
131
+ you may want to enable Parcels on any of its Fortitude superclasses, which are:
132
+ #{superclasses.map(&:name).join("\n")}}
133
+ end
134
+
135
+ options = { :prefix => _parcels_get_css_prefix }
136
+ options.merge!(css_strings.extract_options!)
137
+
138
+ caller_line = caller[0]
139
+ if caller_line =~ /^(.*)\s*:\s*(\d+)\s*:\s*in\s+/i
140
+ caller_file = $1
141
+ caller_line = Integer($2)
142
+ else
143
+ caller_file = caller_line
144
+ caller_line = nil
145
+ end
146
+
147
+ @_parcels_inline_css_fragments ||= [ ]
148
+ @_parcels_inline_css_fragments += css_strings.map do |css_string|
149
+ ::Parcels::Fragments::CssFragment.new(css_string, self, caller_file, caller_line, _parcels_css_options.merge(options))
150
+ end
151
+ end
152
+
153
+ def css_prefix(prefix = nil, &block)
154
+ if (prefix && block)
155
+ raise ArgumentError, "You can supply either a String or a block, but not both; you passed: #{prefix.inspect} and #{block.inspect}"
156
+ end
157
+
158
+ if (prefix != nil) && (! prefix.kind_of?(String))
159
+ raise ArgumentError, "Invalid prefix (must be a String, or nil): #{prefix.inspect}"
160
+ end
161
+
162
+ @_parcels_css_prefix = prefix || block
163
+ end
164
+
165
+ def parcels_sets(*set_names, &block)
166
+ if set_names.length > 0 && block
167
+ raise ArgumentError, "You can specify either a set name or a block, but not both; you passed: #{set_names.inspect} and #{block.inspect}"
168
+ end
169
+
170
+ if set_names == [ nil ]
171
+ @_parcels_sets = [ ]
172
+ else
173
+ @_parcels_sets = block || set_names.map(&:to_sym)
174
+ end
175
+ end
176
+
177
+ def _parcels_get_sets(defining_file_path)
178
+ _parcels_get_sets_for_class(self, defining_file_path)
179
+ end
180
+
181
+ def _parcels_get_sets_for_class(klass, defining_file_path)
182
+ if @_parcels_sets
183
+ out = @_parcels_sets
184
+ out = out.call(klass, defining_file_path) if out.respond_to?(:call)
185
+ out = Array(out).map(&:to_sym)
186
+ out
187
+ elsif superclass.respond_to?(:_parcels_get_sets_for_class)
188
+ superclass._parcels_get_sets_for_class(klass, defining_file_path)
189
+ else
190
+ [ ]
191
+ end
192
+ end
193
+
194
+ def _parcels_get_css_prefix
195
+ _parcels_get_css_prefix_for_class(self)
196
+ end
197
+
198
+ def _parcels_get_css_prefix_for_class(klass)
199
+ if @_parcels_css_prefix
200
+ out = @_parcels_css_prefix
201
+ out = out.call(klass) if out.respond_to?(:call)
202
+ out
203
+ elsif superclass.respond_to?(:_parcels_get_css_prefix_for_class)
204
+ superclass._parcels_get_css_prefix_for_class(klass)
205
+ else
206
+ nil
207
+ end
208
+ end
209
+ end
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,72 @@
1
+ require 'active_support'
2
+ require 'active_support/concern'
3
+
4
+ module Parcels
5
+ module Fortitude
6
+ module Enabling
7
+ extend ActiveSupport::Concern
8
+
9
+ module ClassMethods
10
+ def parcels_enabled?
11
+ out = false
12
+ out = true if superclass.respond_to?(:parcels_enabled?) && superclass.parcels_enabled?
13
+ out = true if @_parcels_enabled
14
+ out
15
+ end
16
+
17
+ def enable_parcels!
18
+ raise "Already enabled on #{self}!" if @_parcels_enabled
19
+
20
+ record_tag_emission true
21
+
22
+ @_parcels_tag_methods_module = Module.new
23
+ const_set(:ParcelsEnablingModule, @_parcels_tag_methods_module)
24
+ include @_parcels_tag_methods_module
25
+
26
+ _parcels_ensure_all_tag_methods_overridden!
27
+
28
+ @_parcels_enabled = true
29
+ end
30
+
31
+ def tags_changed!(tags)
32
+ super
33
+ _parcels_ensure_all_tag_methods_overridden! if parcels_enabled?
34
+ end
35
+
36
+ def _parcels_tag_method_overridden?(tag_name)
37
+ @_parcels_tag_methods_overridden ||= { }
38
+ @_parcels_tag_methods_overridden[tag_name.to_sym]
39
+ end
40
+
41
+ def _parcels_tag_method_overridden!(tag_name)
42
+ @_parcels_tag_methods_overridden[tag_name.to_sym] = true
43
+ end
44
+
45
+ def _parcels_ensure_all_tag_methods_overridden!
46
+ tags.each do |tag_name, tag_object|
47
+ done = _parcels_tag_method_overridden?(tag_name)
48
+ next if done
49
+
50
+ tag_object.all_method_names.each do |tag_method_name|
51
+ @_parcels_tag_methods_module.send(:define_method, tag_method_name) do |*args, &block|
52
+ content_or_attributes = args[0]
53
+ attributes = args[1]
54
+
55
+ directly_inside = rendering_context.current_element_nesting.last
56
+ if directly_inside.kind_of?(::Fortitude::Widget) && (css_wrapper_classes = directly_inside.class.try(:_parcels_widget_outer_element_classes))
57
+ if attributes || content_or_attributes.kind_of?(String)
58
+ super(content_or_attributes, self.class._parcels_add_wrapper_css_classes_to(attributes, css_wrapper_classes), &block)
59
+ else
60
+ super(self.class._parcels_add_wrapper_css_classes_to(content_or_attributes, css_wrapper_classes), attributes, &block)
61
+ end
62
+ else
63
+ super(content_or_attributes, attributes, &block)
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,35 @@
1
+ require 'tilt'
2
+
3
+ module Parcels
4
+ module Fortitude
5
+ class FortitudeEngine < Tilt::Template
6
+ self.default_mime_type = 'text/css'
7
+
8
+ def self.engine_initialized?
9
+ true
10
+ end
11
+
12
+ def initialize_engine
13
+ require_template_library 'fortitude'
14
+ end
15
+
16
+ def prepare
17
+ end
18
+
19
+ def evaluate(context, locals, &block)
20
+ parcels_environment = context.environment.parcels
21
+ widget_class = parcels_environment.widget_class_from_file(context.pathname)
22
+
23
+ if widget_class
24
+ css_from_widget_class(widget_class, parcels_environment, context)
25
+ else
26
+ ""
27
+ end
28
+ end
29
+
30
+ def css_from_widget_class(widget_class, parcels_environment, context)
31
+ raise "must implement in #{self.class.name}"
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,27 @@
1
+ # See if we can load Fortitude -- but don't fail if we can't; we'll just use this to decide whether we should
2
+ # load the Fortitude extensions or not.
3
+ begin
4
+ gem 'fortitude'
5
+ rescue Gem::LoadError => le
6
+ # ok
7
+ end
8
+
9
+ begin
10
+ require 'fortitude'
11
+ rescue LoadError => le
12
+ # ok
13
+ end
14
+
15
+ if defined?(::Fortitude)
16
+ require 'parcels/fortitude/assets'
17
+ require 'parcels/fortitude/enabling'
18
+ require 'parcels/fortitude/widget_engine'
19
+ require 'parcels/fortitude/alongside_engine'
20
+
21
+ ::Fortitude::Widget.class_eval do
22
+ include ::Parcels::Fortitude::Assets
23
+ include ::Parcels::Fortitude::Enabling
24
+ end
25
+
26
+ ::Parcels.fortitude_available!
27
+ end
@@ -0,0 +1,31 @@
1
+ require 'tilt'
2
+
3
+ module Parcels
4
+ module Fortitude
5
+ class WidgetEngine < Tilt::Template
6
+ self.default_mime_type = 'text/css'
7
+
8
+ def self.engine_initialized?
9
+ true
10
+ end
11
+
12
+ def initialize_engine
13
+ require_template_library 'fortitude'
14
+ end
15
+
16
+ def prepare
17
+ end
18
+
19
+ def evaluate(context, locals, &block)
20
+ parcels_environment = context.environment.parcels
21
+ widget_class = parcels_environment.widget_class_from_file(context.pathname)
22
+
23
+ if widget_class
24
+ widget_class._parcels_widget_class_inline_css(parcels_environment, context)
25
+ else
26
+ ""
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end