less-rails 3.0.0 → 4.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a5a9bb17b24c9e112ac835768320e84beb41b31f
4
- data.tar.gz: 81848fe2b108c8a135ffe4faa6c20d9b4f4c94e8
2
+ SHA256:
3
+ metadata.gz: f7462e71d3003a08493070bdf07ae17173f1fcc4f6c63b34d5485cd677ac435e
4
+ data.tar.gz: 8166ded508b910756336c5870bd08e8ae5bab723f6b0ec5d203d2f8719a48790
5
5
  SHA512:
6
- metadata.gz: 22858f553f73f72e4156adeeb0ff08a6d06ab0d2101ae255530383a89df83f9989f0c41c9050d3d899b0ff5a57c683b4e9158e0e16407e55237bfaf1fa82fa24
7
- data.tar.gz: 2450a2536ea9e4178a28b2de71a671cf64641a34dcc652c248dddf76bcbb1dd04a7cd3e4a593d778526be2c42cf1e9f9d52099ac2fd96a6dba3d1b6bd1813565
6
+ metadata.gz: c9e0f1df16be8a892a67e3737e034a8bf9af9dc49cf70ab476b4ebe8ae10fd451d7afd7b282b546926cc0efc6e70d8599ba24634c7b519a6a0e2654d3e5ff4e4
7
+ data.tar.gz: 81165f7e7baf698ba2dc1c1059358e63f08d762cd905a11226d0e4b607c516ed18333633737115aaa43c76f75b2f8aa2e18abb4eaf26deb5a2b43a3c153eb729
@@ -5,13 +5,15 @@ rvm:
5
5
  - 1.9.3-p551
6
6
  - 2.0.0-p648
7
7
  - 2.1.10
8
- - 2.2.7
9
- - 2.3.4
10
- - 2.4.1
8
+ - 2.2.9
9
+ - 2.3.6
10
+ - 2.4.3
11
+ - 2.5.0
11
12
  - jruby-9.1.9.0
12
13
  before_install:
13
14
  - gem install bundler
14
15
  gemfile:
16
+ - gemfiles/sprockets2.gemfile
15
17
  - gemfiles/rails40.gemfile
16
18
  - gemfiles/rails41.gemfile
17
19
  - gemfiles/rails42.gemfile
@@ -31,7 +33,15 @@ matrix:
31
33
  gemfile: gemfiles/rails50.gemfile
32
34
  - rvm: 2.1.10
33
35
  gemfile: gemfiles/rails51.gemfile
34
- - rvm: 2.4.1
36
+ - rvm: 2.4.3
37
+ gemfile: gemfiles/sprockets2.gemfile
38
+ - rvm: 2.4.3
35
39
  gemfile: gemfiles/rails40.gemfile
36
- - rvm: 2.4.1
40
+ - rvm: 2.4.3
41
+ gemfile: gemfiles/rails41.gemfile
42
+ - rvm: 2.5.0
43
+ gemfile: gemfiles/sprockets2.gemfile
44
+ - rvm: 2.5.0
45
+ gemfile: gemfiles/rails40.gemfile
46
+ - rvm: 2.5.0
37
47
  gemfile: gemfiles/rails41.gemfile
data/Appraisals CHANGED
@@ -1,19 +1,24 @@
1
+ appraise 'sprockets2' do
2
+ gem 'rails', '~> 4.0.0'
3
+ gem 'sprockets', '~> 2.0'
4
+ end
5
+
1
6
  appraise 'rails40' do
2
- gem 'rails', '~> 4.0.13'
7
+ gem 'rails', '~> 4.0.0'
3
8
  end
4
9
 
5
10
  appraise 'rails41' do
6
- gem 'rails', '~> 4.1.16'
11
+ gem 'rails', '~> 4.1.0'
7
12
  end
8
13
 
9
14
  appraise 'rails42' do
10
- gem 'rails', '~> 4.2.8'
15
+ gem 'rails', '~> 4.2.0'
11
16
  end
12
17
 
13
18
  appraise 'rails50' do
14
- gem 'rails', '~> 5.0.3'
19
+ gem 'rails', '~> 5.0.0'
15
20
  end
16
21
 
17
22
  appraise 'rails51' do
18
- gem 'rails', '~> 5.1.1'
23
+ gem 'rails', '~> 5.1.0'
19
24
  end
@@ -1,5 +1,14 @@
1
1
  # CHANGELOG
2
2
 
3
+ ### 4.0.0 - 2018-08-24
4
+
5
+ * The import scanner now takes into account multiple [import options](http://lesscss.org/features/#import-atrules-feature-import-options).
6
+ * Removed Tilt and Grease as dependencies.
7
+ * **Breaking Change**: If you are requiring your less files using the extension, e.g:
8
+ `*= require semantic_ui/definitions/modules/accordion.less`
9
+ you need to remove the extension like so:
10
+ `*= require semantic_ui/definitions/modules/accordion`
11
+
3
12
  ### 3.0.0 - 2017-10-02
4
13
 
5
14
  * Solve deprecation warning via Grease adapter!
data/README.md CHANGED
@@ -10,7 +10,7 @@ This gem provides integration for Rails projects using the Less stylesheet langu
10
10
  Just bundle up less-rails in your Gemfile. This will pull in less as a runtime dependency too.
11
11
 
12
12
  ```ruby
13
- gem 'less-rails', '~> 3.0.0'
13
+ gem 'less-rails', '~> 4.0.0'
14
14
  ```
15
15
 
16
16
  But be warned, less.rb relies on a JavaScript runtime gem too. Just like ExecJS, it will look for a gem that is appropriate to your system. Typically, this means you will need one of the following.
@@ -125,7 +125,7 @@ We also have a generator for rails scaffold CSS. Just like the Sass gem, we simp
125
125
 
126
126
  ## Contributing
127
127
 
128
- This gem is fully tested from Rails 4.0 to Rails 5.1. We run our tests on [Travis CI](http://travis-ci.org/metaskills/less-rails) in both Ruby 1.9, 2.0, and JRuby 9000. If you detect a problem, open up a github issue or fork the repo and help out. After you fork or clone the repository, the following commands will get you up and running on the test suite.
128
+ This gem is fully tested from Rails 4.0 to Rails 5.1. We run our tests on [Travis CI](http://travis-ci.org/metaskills/less-rails) in both Ruby 1.9, 2.x, and JRuby 9000. If you detect a problem, open up a github issue or fork the repo and help out. After you fork or clone the repository, the following commands will get you up and running on the test suite.
129
129
 
130
130
  ```shell
131
131
  $ bundle
@@ -5,6 +5,6 @@ source "https://rubygems.org"
5
5
  gem "therubyracer", "~> 0.12.0", require: nil, platforms: :ruby
6
6
  gem "therubyrhino", "~> 2.0.2", require: nil, platforms: :jruby
7
7
  gem "mime-types", "~> 2.6.2", platforms: [:ruby_19, :jruby]
8
- gem "rails", "~> 4.0.13"
8
+ gem "rails", "~> 4.0.0"
9
9
 
10
10
  gemspec path: "../"
@@ -5,6 +5,6 @@ source "https://rubygems.org"
5
5
  gem "therubyracer", "~> 0.12.0", require: nil, platforms: :ruby
6
6
  gem "therubyrhino", "~> 2.0.2", require: nil, platforms: :jruby
7
7
  gem "mime-types", "~> 2.6.2", platforms: [:ruby_19, :jruby]
8
- gem "rails", "~> 4.1.16"
8
+ gem "rails", "~> 4.1.0"
9
9
 
10
10
  gemspec path: "../"
@@ -5,6 +5,6 @@ source "https://rubygems.org"
5
5
  gem "therubyracer", "~> 0.12.0", require: nil, platforms: :ruby
6
6
  gem "therubyrhino", "~> 2.0.2", require: nil, platforms: :jruby
7
7
  gem "mime-types", "~> 2.6.2", platforms: [:ruby_19, :jruby]
8
- gem "rails", "~> 4.2.8"
8
+ gem "rails", "~> 4.2.0"
9
9
 
10
10
  gemspec path: "../"
@@ -5,6 +5,6 @@ source "https://rubygems.org"
5
5
  gem "therubyracer", "~> 0.12.0", require: nil, platforms: :ruby
6
6
  gem "therubyrhino", "~> 2.0.2", require: nil, platforms: :jruby
7
7
  gem "mime-types", "~> 2.6.2", platforms: [:ruby_19, :jruby]
8
- gem "rails", "~> 5.0.3"
8
+ gem "rails", "~> 5.0.0"
9
9
 
10
10
  gemspec path: "../"
@@ -5,6 +5,6 @@ source "https://rubygems.org"
5
5
  gem "therubyracer", "~> 0.12.0", require: nil, platforms: :ruby
6
6
  gem "therubyrhino", "~> 2.0.2", require: nil, platforms: :jruby
7
7
  gem "mime-types", "~> 2.6.2", platforms: [:ruby_19, :jruby]
8
- gem "rails", "~> 5.1.1"
8
+ gem "rails", "~> 5.1.0"
9
9
 
10
10
  gemspec path: "../"
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "therubyracer", "~> 0.12.0", require: nil, platforms: :ruby
6
+ gem "therubyrhino", "~> 2.0.2", require: nil, platforms: :jruby
7
+ gem "mime-types", "~> 2.6.2", platforms: [:ruby_19, :jruby]
8
+ gem "rails", "~> 4.0.0"
9
+ gem "sprockets", "~> 2.0"
10
+
11
+ gemspec path: "../"
@@ -16,10 +16,8 @@ Gem::Specification.new do |gem|
16
16
  gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
17
  gem.require_paths = ["lib"]
18
18
  gem.add_runtime_dependency 'less', '~> 2.6.0'
19
- gem.add_runtime_dependency 'actionpack', '>= 4.0'
20
- gem.add_runtime_dependency 'tilt'
21
- gem.add_runtime_dependency 'grease'
22
- gem.add_runtime_dependency 'sprockets', '> 2', '< 4'
19
+ gem.add_runtime_dependency 'actionpack', '>= 4'
20
+ gem.add_runtime_dependency 'sprockets', '>= 2'
23
21
  gem.add_development_dependency 'appraisal'
24
22
  gem.add_development_dependency 'minitest'
25
23
  gem.add_development_dependency 'guard'
@@ -5,7 +5,6 @@ end
5
5
 
6
6
  require 'less'
7
7
  require 'rails'
8
- require 'tilt'
9
8
  require 'sprockets'
10
9
  begin
11
10
  require 'sprockets/railtie'
@@ -15,6 +14,6 @@ end
15
14
 
16
15
  require 'less/rails/version'
17
16
  require 'less/rails/helpers'
18
- require 'less/rails/template_handlers'
17
+ require 'less/rails/less_transformer'
19
18
  require 'less/rails/import_processor'
20
19
  require 'less/rails/railtie'
@@ -1,9 +1,9 @@
1
1
  module Less
2
-
2
+
3
3
  def self.less
4
4
  @less
5
5
  end
6
-
6
+
7
7
  def self.register_rails_helper(name, &block)
8
8
  tree = @loader.require('less/tree')
9
9
  tree.functions[name] = lambda do |*args|
@@ -12,12 +12,12 @@ module Less
12
12
  tree[:Anonymous].new block.call(tree, args.last)
13
13
  end
14
14
  end
15
-
15
+
16
16
  module Rails
17
17
  module Helpers
18
-
18
+
19
19
  extend ActiveSupport::Concern
20
-
20
+
21
21
  included do
22
22
  Less.register_rails_helper('asset-path') { |tree, cxt| asset_path unquote(cxt.toCSS()) }
23
23
  Less.register_rails_helper('asset-url') { |tree, cxt| asset_url unquote(cxt.toCSS()) }
@@ -35,21 +35,21 @@ module Less
35
35
  Less.register_rails_helper('font-url') { |tree, cxt| font_url unquote(cxt.toCSS()) }
36
36
  Less.register_rails_helper('asset-data-url') { |tree, cxt| asset_data_url unquote(cxt.toCSS()) }
37
37
  end
38
-
38
+
39
39
  module ClassMethods
40
-
40
+
41
41
  def asset_data_url(path)
42
42
  "url(#{scope.asset_data_uri(path)})"
43
43
  end
44
-
44
+
45
45
  def asset_path(asset)
46
46
  public_path(asset).inspect
47
47
  end
48
-
48
+
49
49
  def asset_url(asset)
50
50
  "url(#{public_path(asset)})"
51
51
  end
52
-
52
+
53
53
  def image_path(img)
54
54
  scope.image_path(img).inspect
55
55
  end
@@ -61,31 +61,31 @@ module Less
61
61
  def video_path(video)
62
62
  scope.video_path(video).inspect
63
63
  end
64
-
64
+
65
65
  def video_url(video)
66
66
  "url(#{scope.video_path(video)})"
67
67
  end
68
-
68
+
69
69
  def audio_path(audio)
70
70
  scope.audio_path(audio).inspect
71
71
  end
72
-
72
+
73
73
  def audio_url(audio)
74
74
  "url(#{scope.audio_path(audio)})"
75
75
  end
76
-
76
+
77
77
  def javascript_path(javascript)
78
78
  scope.javascript_path(javascript).inspect
79
79
  end
80
-
80
+
81
81
  def javascript_url(javascript)
82
82
  "url(#{scope.javascript_path(javascript)})"
83
83
  end
84
-
84
+
85
85
  def stylesheet_path(stylesheet)
86
86
  scope.stylesheet_path(stylesheet).inspect
87
87
  end
88
-
88
+
89
89
  def stylesheet_url(stylesheet)
90
90
  "url(#{scope.stylesheet_path(stylesheet)})"
91
91
  end
@@ -97,7 +97,7 @@ module Less
97
97
  asset_path(font)
98
98
  end
99
99
  end
100
-
100
+
101
101
  def font_url(font)
102
102
  if scope.respond_to?(:font_path)
103
103
  "url(#{scope.font_path(font)})"
@@ -105,13 +105,13 @@ module Less
105
105
  asset_url(font)
106
106
  end
107
107
  end
108
-
108
+
109
109
  private
110
-
110
+
111
111
  def scope
112
112
  Less.Parser['scope']
113
113
  end
114
-
114
+
115
115
  def public_path(asset)
116
116
  if scope.respond_to?(:asset_paths)
117
117
  scope.asset_paths.compute_public_path asset, ::Rails.application.config.assets.prefix
@@ -119,18 +119,18 @@ module Less
119
119
  scope.path_to_asset(asset)
120
120
  end
121
121
  end
122
-
122
+
123
123
  def context_asset_data_uri(path)
124
-
124
+
125
125
  end
126
-
126
+
127
127
  def unquote(str)
128
128
  s = str.to_s.strip
129
129
  s =~ /^['"](.*?)['"]$/ ? $1 : s
130
130
  end
131
-
131
+
132
132
  end
133
-
133
+
134
134
  end
135
135
  end
136
136
  end
@@ -1,32 +1,49 @@
1
- module Less
2
- module Rails
3
- class ImportProcessor < Tilt::Template
4
-
5
- IMPORT_SCANNER = /@import\s*['"]([^'"]+)['"]\s*;/.freeze
6
- PATHNAME_FINDER = Proc.new { |scope, path|
1
+ module Less
2
+ module Rails
3
+ class ImportProcessor
4
+
5
+ # http://lesscss.org/features/#import-options
6
+ IMPORT_SCANNER = /@import\s*(?:\([a-z, ]+\))*\s*['"]([^'"]+)['"]\s*;/.freeze
7
+
8
+ PATHNAME_FINDER = Proc.new do |scope, path|
7
9
  begin
8
10
  scope.resolve(path)
9
11
  rescue Sprockets::FileNotFound
10
12
  nil
11
13
  end
12
- }
13
-
14
- def prepare
15
14
  end
16
-
17
- def evaluate(scope, locals, &block)
18
- depend_on scope, data
19
- data
15
+
16
+ def initialize(filename, &block)
17
+ @filename = filename
18
+ @source = block.call
19
+ end
20
+
21
+ def render(scope, locals)
22
+ self.class.evaluate(@filename, @source, scope)
23
+ end
24
+
25
+ def self.evaluate(filename, source, scope)
26
+ depend_on scope, source
27
+ source
28
+ end
29
+
30
+ def self.call(input)
31
+ filename = input[:filename]
32
+ source = input[:data]
33
+ scope = input[:environment].context_class.new(input)
34
+
35
+ result = evaluate(filename, source, scope)
36
+ scope.metadata.merge(data: result)
20
37
  end
21
38
 
22
- def depend_on(scope, data, base=File.dirname(scope.logical_path))
23
- import_paths = data.scan(IMPORT_SCANNER).flatten.compact.uniq
39
+ def self.depend_on(scope, source, base=File.dirname(scope.logical_path))
40
+ import_paths = source.scan(IMPORT_SCANNER).flatten.compact.uniq
24
41
  import_paths.each do |path|
25
- pathname = PATHNAME_FINDER.call(scope,path) || PATHNAME_FINDER.call(scope, File.join(base, path))
42
+ pathname = PATHNAME_FINDER.call(scope, path) || PATHNAME_FINDER.call(scope, File.join(base, path))
26
43
  scope.depend_on(pathname) if pathname && pathname.to_s.ends_with?('.less')
27
44
  depend_on scope, File.read(pathname), File.dirname(path) if pathname
28
45
  end
29
- data
46
+ source
30
47
  end
31
48
 
32
49
  end
@@ -0,0 +1,64 @@
1
+ module Less
2
+ module Rails
3
+ class LessTransformer
4
+ include Helpers
5
+
6
+ TO_CSS_KEYS = [:compress, :optimization, :silent, :color]
7
+
8
+ def initialize(filename, &block)
9
+ @filename = filename
10
+ @source = block.call
11
+ end
12
+
13
+ def render(scope, locals)
14
+ self.class.evaluate(@filename, @source, scope)
15
+ end
16
+
17
+ def self.evaluate(filename, source, scope)
18
+ Less.Parser['scope'] = scope
19
+ parser = ::Less::Parser.new config_to_less_parser_options(filename, scope)
20
+ engine = parser.parse(source)
21
+ engine.to_css config_to_css_options(scope)
22
+ end
23
+
24
+ def self.call(input)
25
+ filename = input[:filename]
26
+ source = input[:data]
27
+ scope = input[:environment].context_class.new(input)
28
+
29
+ result = evaluate(filename, source, scope)
30
+ scope.metadata.merge(data: result)
31
+ end
32
+
33
+ def self.default_mime_type
34
+ 'text/css'
35
+ end
36
+
37
+ protected
38
+
39
+ def self.config_to_less_parser_options(filename, scope)
40
+ paths = config_paths(scope) + scope.environment.paths
41
+ local_path = scope.pathname.dirname
42
+ paths += [local_path] unless paths.include? local_path
43
+ {:filename => filename, :paths => paths, :dumpLineNumbers => config_from_rails(scope).line_numbers}.merge(config_raw(scope))
44
+ end
45
+
46
+ def self.config_to_css_options(scope)
47
+ Hash[config_from_rails(scope).each.to_a].slice *TO_CSS_KEYS
48
+ end
49
+
50
+ def self.config_paths(scope)
51
+ config_from_rails(scope)[:paths]
52
+ end
53
+
54
+ def self.config_raw(scope)
55
+ config_from_rails(scope)[:raw]
56
+ end
57
+
58
+ def self.config_from_rails(scope)
59
+ scope.environment.context_class.less_config
60
+ end
61
+
62
+ end
63
+ end
64
+ end
@@ -1,5 +1,4 @@
1
1
  require 'less'
2
- require 'grease'
3
2
  require 'sprockets/railtie'
4
3
 
5
4
  module Less
@@ -14,20 +13,21 @@ module Less
14
13
  config.before_initialize do |app|
15
14
  sprockets_env = app.assets || Sprockets
16
15
  if sprockets_env.respond_to?(:register_engine)
17
- args = ['.less', Grease.apply(LessTemplate)]
16
+ args = ['.less', LessTransformer]
18
17
  args << { mime_type: 'text/less', silence_deprecation: true } if Sprockets::VERSION.start_with?("3")
19
18
  sprockets_env.register_engine(*args)
20
19
  end
21
20
 
22
21
  if sprockets_env.respond_to?(:register_transformer)
23
22
  sprockets_env.register_mime_type 'text/less', extensions: ['.less', '.less.erb', '.less.css'], charset: :css
24
- sprockets_env.register_transformer 'text/less', 'text/css', Grease.apply(LessTemplate)
23
+ sprockets_env.register_preprocessor 'text/less', Sprockets::DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
24
+ sprockets_env.register_transformer 'text/less', 'text/css', LessTransformer
25
25
  end
26
26
  end
27
27
 
28
28
  initializer 'less-rails.before.load_config_initializers', :before => :load_config_initializers, :group => :all do |app|
29
29
  sprockets_env = app.assets || Sprockets
30
- sprockets_env.register_preprocessor 'text/css', Grease.apply(ImportProcessor)
30
+ sprockets_env.register_preprocessor 'text/css', ImportProcessor
31
31
 
32
32
  config.assets.configure do |env|
33
33
  env.context_class.class_eval do
@@ -1,5 +1,5 @@
1
1
  module Less
2
2
  module Rails
3
- VERSION = "3.0.0"
3
+ VERSION = "4.0.0.rc1"
4
4
  end
5
5
  end
@@ -1,36 +1,54 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  class BasicsSpec < Less::Rails::Spec
4
-
4
+
5
5
  it 'must render variables' do
6
6
  basics.must_match %r{#test-variable\{color:#4d926f\}}
7
7
  end
8
-
8
+
9
9
  it 'must render mixins' do
10
10
  basics.must_match %r{#test-mixin span\{border:1px solid black\}}
11
11
  end
12
-
12
+
13
13
  it 'must be able to use vendored less files' do
14
14
  basics.must_match %r{#test-vendored\{border-radius:10px\}}
15
15
  end
16
-
16
+
17
17
  describe 'less import dependency hooks' do
18
-
18
+
19
19
  it 'must update when imported file changes' do
20
20
  basics.must_match %r{#test-radiused\{border-radius:5px\}}, 'default is 5px'
21
21
  safely_edit(:mixins) do |data, asset|
22
- data.gsub! '5px', '10px'
22
+ data.gsub! '5px', '8px'
23
23
  File.open(asset.pathname,'w') { |f| f.write(data) }
24
- basics.must_match %r{#test-radiused\{border-radius:10px\}}, 'mixins.less should be a sprockets context dependency'
24
+ basics.must_match %r{#test-radiused\{border-radius:8px\}}, 'mixins.less should be a sprockets context dependency'
25
+
26
+ data.gsub! '8px', '15px'
27
+ File.open(asset.pathname,'w') { |f| f.write(data) }
28
+
29
+ # Force a recompile
30
+ # https://github.com/rails/sprockets/blob/master/test/shared_sass_tests.rb#L164
31
+ mtime = Time.now + 1
32
+ File.utime(mtime, mtime, asset.pathname)
33
+
34
+ basics.must_match %r{#test-radiused\{border-radius:15px\}}, 'mixins.less should be a sprockets context dependency'
25
35
  end
26
36
  end
27
-
37
+
28
38
  it 'must update when an imported file of another imported file changes' do
29
39
  basics.must_match %r{#test-variable-colored\{color:#424242\}}, 'default is #424242'
30
40
  safely_edit(:variables) do |data, asset|
31
41
  data.gsub! '424242', '666666'
32
42
  File.open(asset.pathname,'w') { |f| f.write(data) }
33
43
  basics.must_match %r{#test-variable-colored\{color:#666\}}, 'variables.less should be a sprockets context dependency'
44
+
45
+ data.gsub! '666666', '888888'
46
+ File.open(asset.pathname,'w') { |f| f.write(data) }
47
+
48
+ mtime = Time.now + 1
49
+ File.utime(mtime, mtime, asset.pathname)
50
+
51
+ basics.must_match %r{#test-variable-colored\{color:#888\}}, 'variables.less should be a sprockets context dependency'
34
52
  end
35
53
  end
36
54
 
@@ -61,15 +79,15 @@ class BasicsSpec < Less::Rails::Spec
61
79
  end
62
80
 
63
81
  protected
64
-
82
+
65
83
  def basics
66
84
  dummy_asset 'basics'
67
85
  end
68
-
86
+
69
87
  def mixins_asset
70
88
  dummy_assets['frameworks/bootstrap/mixins.less']
71
89
  end
72
-
90
+
73
91
  def variables_asset
74
92
  dummy_assets['frameworks/bootstrap/variables.less']
75
93
  end
@@ -31,7 +31,7 @@ class RailtieSpec < Less::Rails::Spec
31
31
  describe 'initialization' do
32
32
 
33
33
  it 'must register our template engine' do
34
- dummy_assets.engines['.less'].must_be_instance_of Grease::Adapter
34
+ dummy_assets.engines['.less'].must_equal Less::Rails::LessTransformer
35
35
  end
36
36
 
37
37
  it 'must extend the context class with our config' do
@@ -40,9 +40,7 @@ class RailtieSpec < Less::Rails::Spec
40
40
  end
41
41
 
42
42
  it 'must register our import pre processor' do
43
- dummy_assets.preprocessors['text/css'].any? do |preprocessor|
44
- preprocessor.is_a? Grease::Adapter
45
- end.must_equal true
43
+ dummy_assets.preprocessors['text/css'].must_include Less::Rails::ImportProcessor
46
44
  end
47
45
 
48
46
  it 'must include the asset pipelines stylesheet paths to less paths' do
@@ -8,7 +8,7 @@
8
8
  #test-mixin span { .bordered; }
9
9
 
10
10
  // Frameworks
11
- @import "frameworks/bootstrap/mixins";
11
+ @import (multiple) "frameworks/bootstrap/mixins";
12
12
  #test-radiused { .radiused; }
13
13
  #test-variable-colored { .variableColored; }
14
14
  #test-variable-relative-path-colored { .variableRelativePathColored; }
@@ -1,5 +1,5 @@
1
1
 
2
- @import "frameworks/bootstrap/variables";
2
+ @import (less, multiple) "frameworks/bootstrap/variables";
3
3
  @import "variables_via_relative_path";
4
4
 
5
5
  .radiused(@radius: 5px) {
@@ -8,11 +8,11 @@ require 'fileutils'
8
8
  module Less
9
9
  module Rails
10
10
  class Spec < MiniTest::Spec
11
-
11
+
12
12
  include FileUtils
13
-
13
+
14
14
  class << self
15
-
15
+
16
16
  def dummy_app
17
17
  Dummy::Application
18
18
  end
@@ -20,35 +20,35 @@ module Less
20
20
  def dummy_tmp
21
21
  "#{dummy_app.root}/tmp"
22
22
  end
23
-
23
+
24
24
  end
25
-
25
+
26
26
  before do
27
27
  prepare_cache_dir
28
28
  reset_config_options
29
29
  reset_caches
30
30
  end
31
-
31
+
32
32
  protected
33
-
33
+
34
34
  delegate :dummy_app, :dummy_tmp, :to => :'self.class'
35
35
 
36
36
  def dummy_config
37
37
  dummy_app.config
38
38
  end
39
-
39
+
40
40
  def dummy_assets
41
41
  dummy_app.assets
42
42
  end
43
-
43
+
44
44
  def dummy_asset(name)
45
45
  dummy_assets[name].to_s.strip
46
46
  end
47
-
47
+
48
48
  def reset_config_options
49
49
  dummy_config.less.compress = true
50
50
  end
51
-
51
+
52
52
  def reset_caches
53
53
  version = SecureRandom.hex(32)
54
54
  dummy_config.assets.version = version
@@ -56,57 +56,59 @@ module Less
56
56
  cache = dummy_assets.cache
57
57
  cache.respond_to?(:clear) ? cache.clear : rm_rf("#{dummy_tmp}/cache/assets")
58
58
  end
59
-
59
+
60
60
  def prepare_cache_dir
61
61
  mkdir_p "#{dummy_tmp}/cache/assets"
62
62
  end
63
-
63
+
64
64
  end
65
-
65
+
66
66
  # Heavily inspired by Rails::Generators::TestCase.
67
67
  class GeneratorSpec < Spec
68
-
68
+
69
69
  class_attribute :destination_root, :current_path, :generator_class, :default_arguments
70
70
  delegate :destination_root, :current_path, :generator_class, :default_arguments, :to => :'self.class'
71
-
71
+
72
72
  self.current_path = File.expand_path(Dir.pwd)
73
73
  self.default_arguments = []
74
74
  self.destination_root = "#{dummy_tmp}/destination_root"
75
-
75
+
76
76
  before { ensure_current_path ; prepare_destination ; no_color! ; setup_generator_class }
77
77
  after { remove_destination ; ensure_current_path }
78
-
78
+
79
79
  protected
80
-
80
+
81
81
  def no_color!
82
82
  Thor::Base.shell = Thor::Shell::Basic
83
83
  end
84
-
84
+
85
85
  def ensure_current_path
86
86
  cd current_path
87
87
  end
88
-
88
+
89
89
  def prepare_destination
90
90
  remove_destination
91
91
  mkdir_p destination_root
92
92
  end
93
-
93
+
94
94
  def remove_destination
95
95
  rm_rf destination_root
96
96
  end
97
-
97
+
98
98
  def setup_generator_class
99
99
  self.class.generator_class = Less::Generators.const_get(self.class.name.sub(/Spec$/, ''))
100
100
  end
101
-
101
+
102
102
  def run_generator(args=default_arguments, config={})
103
- generator_class.start(args, config.reverse_merge(:destination_root => destination_root))
103
+ spec_helper_silence_stdout do
104
+ generator_class.start(args, config.reverse_merge(:destination_root => destination_root))
105
+ end
104
106
  end
105
107
 
106
108
  def generator(args=default_arguments, options={}, config={})
107
109
  @generator ||= generator_class.new(args, options, config.reverse_merge(:destination_root => destination_root))
108
110
  end
109
-
111
+
110
112
  def assert_file(relative, *contents)
111
113
  absolute = File.expand_path(relative, destination_root)
112
114
  assert File.exists?(absolute), "Expected file #{relative.inspect} to exist, but does not"
@@ -122,9 +124,36 @@ module Less
122
124
  end
123
125
  end
124
126
  alias :assert_directory :assert_file
125
-
127
+
128
+ # Silence +STDOUT+ temporarily.
129
+ #
130
+ # &block:: Block of code to call while +STDOUT+ is disabled.
131
+ #
132
+ def spec_helper_silence_stdout(&block)
133
+ spec_helper_silence_stream($stdout, &block)
134
+ end
135
+
136
+ # Back-end to #spec_helper_silence_stdout; silences arbitrary streams.
137
+ #
138
+ # +stream+:: The output stream to silence, e.g. <tt>$stdout</tt>
139
+ # &block:: Block of code to call while output stream is disabled.
140
+ #
141
+ def spec_helper_silence_stream(stream, &block)
142
+ begin
143
+ old_stream = stream.dup
144
+ stream.reopen(File::NULL)
145
+ stream.sync = true
146
+
147
+ yield
148
+
149
+ ensure
150
+ stream.reopen(old_stream)
151
+ old_stream.close
152
+
153
+ end
154
+ end
126
155
  end
127
-
156
+
128
157
  end
129
158
  end
130
159
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: less-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 4.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ken Collins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-01 00:00:00.000000000 Z
11
+ date: 2018-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: less
@@ -30,62 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '4.0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '4.0'
41
- - !ruby/object:Gem::Dependency
42
- name: tilt
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: grease
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
33
+ version: '4'
62
34
  type: :runtime
63
35
  prerelease: false
64
36
  version_requirements: !ruby/object:Gem::Requirement
65
37
  requirements:
66
38
  - - ">="
67
39
  - !ruby/object:Gem::Version
68
- version: '0'
40
+ version: '4'
69
41
  - !ruby/object:Gem::Dependency
70
42
  name: sprockets
71
43
  requirement: !ruby/object:Gem::Requirement
72
44
  requirements:
73
- - - ">"
45
+ - - ">="
74
46
  - !ruby/object:Gem::Version
75
47
  version: '2'
76
- - - "<"
77
- - !ruby/object:Gem::Version
78
- version: '4'
79
48
  type: :runtime
80
49
  prerelease: false
81
50
  version_requirements: !ruby/object:Gem::Requirement
82
51
  requirements:
83
- - - ">"
52
+ - - ">="
84
53
  - !ruby/object:Gem::Version
85
54
  version: '2'
86
- - - "<"
87
- - !ruby/object:Gem::Version
88
- version: '4'
89
55
  - !ruby/object:Gem::Dependency
90
56
  name: appraisal
91
57
  requirement: !ruby/object:Gem::Requirement
@@ -179,13 +145,14 @@ files:
179
145
  - gemfiles/rails42.gemfile
180
146
  - gemfiles/rails50.gemfile
181
147
  - gemfiles/rails51.gemfile
148
+ - gemfiles/sprockets2.gemfile
182
149
  - less-rails.gemspec
183
150
  - lib/less-rails.rb
184
151
  - lib/less/rails.rb
185
152
  - lib/less/rails/helpers.rb
186
153
  - lib/less/rails/import_processor.rb
154
+ - lib/less/rails/less_transformer.rb
187
155
  - lib/less/rails/railtie.rb
188
- - lib/less/rails/template_handlers.rb
189
156
  - lib/less/rails/version.rb
190
157
  - lib/rails/generators/less/assets/assets_generator.rb
191
158
  - lib/rails/generators/less/assets/templates/stylesheet.css.less
@@ -222,12 +189,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
222
189
  version: '0'
223
190
  required_rubygems_version: !ruby/object:Gem::Requirement
224
191
  requirements:
225
- - - ">="
192
+ - - ">"
226
193
  - !ruby/object:Gem::Version
227
- version: '0'
194
+ version: 1.3.1
228
195
  requirements: []
229
196
  rubyforge_project:
230
- rubygems_version: 2.5.2
197
+ rubygems_version: 2.7.6
231
198
  signing_key:
232
199
  specification_version: 4
233
200
  summary: The dynamic stylesheet language for the Rails asset pipeline.
@@ -1,50 +0,0 @@
1
- module Less
2
- module Rails
3
- class LessTemplate < Tilt::LessTemplate
4
-
5
- self.default_mime_type = 'text/css'
6
-
7
- include Helpers
8
-
9
- TO_CSS_KEYS = [:compress, :optimization, :silent, :color]
10
-
11
- def prepare
12
- end
13
-
14
- def evaluate(scope, locals, &block)
15
- @output ||= begin
16
- Less.Parser['scope'] = scope
17
- parser = ::Less::Parser.new config_to_less_parser_options(scope)
18
- engine = parser.parse(data)
19
- engine.to_css config_to_css_options(scope)
20
- end
21
- end
22
-
23
- protected
24
-
25
- def config_to_less_parser_options(scope)
26
- paths = config_paths(scope) + scope.environment.paths
27
- local_path = scope.pathname.dirname
28
- paths += [local_path] unless paths.include? local_path
29
- {:filename => eval_file, :line => line, :paths => paths, :dumpLineNumbers => config_from_rails(scope).line_numbers}.merge(config_raw(scope))
30
- end
31
-
32
- def config_to_css_options(scope)
33
- Hash[config_from_rails(scope).each.to_a].slice *TO_CSS_KEYS
34
- end
35
-
36
- def config_paths(scope)
37
- config_from_rails(scope)[:paths]
38
- end
39
-
40
- def config_raw(scope)
41
- config_from_rails(scope)[:raw]
42
- end
43
-
44
- def config_from_rails(scope)
45
- scope.environment.context_class.less_config
46
- end
47
-
48
- end
49
- end
50
- end