less 2.0.4 → 2.1.0

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 (112) hide show
  1. data/.gitmodules +0 -3
  2. data/.travis.yml +10 -0
  3. data/README.md +1 -1
  4. data/Rakefile +2 -0
  5. data/bin/lessc +21 -2
  6. data/less.gemspec +5 -3
  7. data/lib/less/defaults.rb +13 -0
  8. data/lib/less/js/CHANGELOG +41 -0
  9. data/lib/less/js/Makefile +21 -2
  10. data/lib/less/js/benchmark/benchmark.less +11 -11
  11. data/lib/less/js/benchmark/less-benchmark.js +3 -5
  12. data/lib/less/js/bin/lessc +52 -18
  13. data/lib/less/js/build/amd.js +6 -0
  14. data/lib/less/js/build/require-rhino.js +7 -0
  15. data/lib/less/js/dist/{less-1.0.44.js → less-1.1.4.js} +159 -45
  16. data/lib/less/js/dist/less-1.1.4.min.js +16 -0
  17. data/lib/less/js/dist/less-1.1.5.js +2805 -0
  18. data/lib/less/js/dist/less-1.1.5.min.js +9 -0
  19. data/lib/less/js/dist/less-1.1.6.js +3004 -0
  20. data/lib/less/js/dist/less-1.1.6.min.js +9 -0
  21. data/lib/less/js/dist/less-1.2.0.js +3293 -0
  22. data/lib/less/js/dist/less-1.2.0.min.js +9 -0
  23. data/lib/less/js/dist/less-1.2.1.js +3318 -0
  24. data/lib/less/js/dist/less-1.2.1.min.js +9 -0
  25. data/lib/less/js/dist/less-1.2.2.js +3337 -0
  26. data/lib/less/js/dist/less-1.2.2.min.js +9 -0
  27. data/lib/less/js/dist/less-1.3.0.js +3478 -0
  28. data/lib/less/js/dist/less-1.3.0.min.js +9 -0
  29. data/lib/less/js/dist/less-rhino-1.1.3.js +2460 -0
  30. data/lib/less/js/dist/less-rhino-1.1.5.js +2481 -0
  31. data/lib/less/js/lib/less/browser.js +38 -27
  32. data/lib/less/js/lib/less/colors.js +151 -0
  33. data/lib/less/js/lib/less/cssmin.js +355 -0
  34. data/lib/less/js/lib/less/functions.js +61 -7
  35. data/lib/less/js/lib/less/index.js +48 -37
  36. data/lib/less/js/lib/less/parser.js +327 -120
  37. data/lib/less/js/lib/less/rhino.js +62 -0
  38. data/lib/less/js/lib/less/tree/alpha.js +1 -1
  39. data/lib/less/js/lib/less/tree/anonymous.js +1 -1
  40. data/lib/less/js/lib/less/tree/assignment.js +17 -0
  41. data/lib/less/js/lib/less/tree/call.js +7 -4
  42. data/lib/less/js/lib/less/tree/color.js +9 -6
  43. data/lib/less/js/lib/less/tree/comment.js +1 -1
  44. data/lib/less/js/lib/less/tree/condition.js +42 -0
  45. data/lib/less/js/lib/less/tree/dimension.js +16 -1
  46. data/lib/less/js/lib/less/tree/directive.js +4 -2
  47. data/lib/less/js/lib/less/tree/element.js +20 -5
  48. data/lib/less/js/lib/less/tree/expression.js +2 -2
  49. data/lib/less/js/lib/less/tree/import.js +16 -14
  50. data/lib/less/js/lib/less/tree/javascript.js +1 -1
  51. data/lib/less/js/lib/less/tree/keyword.js +12 -2
  52. data/lib/less/js/lib/less/tree/media.js +114 -0
  53. data/lib/less/js/lib/less/tree/mixin.js +49 -20
  54. data/lib/less/js/lib/less/tree/operation.js +1 -1
  55. data/lib/less/js/lib/less/tree/paren.js +16 -0
  56. data/lib/less/js/lib/less/tree/quoted.js +2 -2
  57. data/lib/less/js/lib/less/tree/rule.js +8 -4
  58. data/lib/less/js/lib/less/tree/ruleset.js +49 -12
  59. data/lib/less/js/lib/less/tree/selector.js +18 -4
  60. data/lib/less/js/lib/less/tree/url.js +2 -2
  61. data/lib/less/js/lib/less/tree/value.js +1 -1
  62. data/lib/less/js/lib/less/tree/variable.js +5 -3
  63. data/lib/less/js/lib/less/tree.js +6 -2
  64. data/lib/less/js/package.json +2 -2
  65. data/lib/less/js/test/css/colors.css +16 -0
  66. data/lib/less/js/test/css/comments.css +9 -5
  67. data/lib/less/js/test/css/css-3.css +18 -2
  68. data/lib/less/js/test/css/css-escapes.css +1 -1
  69. data/lib/less/js/test/css/css.css +11 -4
  70. data/lib/less/js/test/css/functions.css +13 -0
  71. data/lib/less/js/test/css/ie-filters.css +5 -0
  72. data/lib/less/js/test/css/import.css +12 -3
  73. data/lib/less/js/test/css/media.css +60 -2
  74. data/lib/less/js/test/css/mixins-args.css +17 -2
  75. data/lib/less/js/test/css/mixins-guards.css +58 -0
  76. data/lib/less/js/test/css/mixins-important.css +17 -0
  77. data/lib/less/js/test/css/mixins-pattern.css +4 -6
  78. data/lib/less/js/test/css/mixins.css +21 -0
  79. data/lib/less/js/test/css/operations.css +3 -0
  80. data/lib/less/js/test/css/parens.css +1 -1
  81. data/lib/less/js/test/css/rulesets.css +6 -2
  82. data/lib/less/js/test/css/scope.css +6 -6
  83. data/lib/less/js/test/css/selectors.css +38 -1
  84. data/lib/less/js/test/css/strings.css +6 -4
  85. data/lib/less/js/test/css/variables.css +3 -0
  86. data/lib/less/js/test/css/whitespace.css +5 -3
  87. data/lib/less/js/test/less/colors.less +19 -0
  88. data/lib/less/js/test/less/comments.less +8 -6
  89. data/lib/less/js/test/less/css-3.less +10 -0
  90. data/lib/less/js/test/less/css.less +4 -0
  91. data/lib/less/js/test/less/functions.less +15 -1
  92. data/lib/less/js/test/less/ie-filters.less +8 -0
  93. data/lib/less/js/test/less/import/import-test-e.less +2 -0
  94. data/lib/less/js/test/less/import.less +4 -1
  95. data/lib/less/js/test/less/media.less +55 -1
  96. data/lib/less/js/test/less/mixins-args.less +20 -1
  97. data/lib/less/js/test/less/mixins-guards.less +94 -0
  98. data/lib/less/js/test/less/mixins-important.less +18 -0
  99. data/lib/less/js/test/less/mixins-pattern.less +3 -0
  100. data/lib/less/js/test/less/mixins.less +20 -0
  101. data/lib/less/js/test/less/operations.less +4 -0
  102. data/lib/less/js/test/less/selectors.less +31 -0
  103. data/lib/less/js/test/less/strings.less +2 -0
  104. data/lib/less/js/test/less/variables.less +4 -0
  105. data/lib/less/js/test/less-test.js +3 -5
  106. data/lib/less/loader.rb +24 -25
  107. data/lib/less/parser.rb +32 -6
  108. data/lib/less/version.rb +1 -1
  109. data/lib/less.rb +7 -8
  110. data/spec/less/faulty/faulty.less +3 -0
  111. data/spec/less/parser_spec.rb +28 -2
  112. metadata +321 -149
@@ -1,10 +1,8 @@
1
1
  var path = require('path'),
2
2
  fs = require('fs'),
3
- sys = require('sys');
3
+ sys = require('util');
4
4
 
5
- require.paths.unshift(__dirname, path.join(__dirname, '..'));
6
-
7
- var less = require('lib/less');
5
+ var less = require('../lib/less');
8
6
 
9
7
  less.tree.functions.add = function (a, b) {
10
8
  return new(less.tree.Dimension)(a.value + b.value);
@@ -12,7 +10,7 @@ less.tree.functions.add = function (a, b) {
12
10
  less.tree.functions.increment = function (a) {
13
11
  return new(less.tree.Dimension)(a.value + 1);
14
12
  }
15
- less.tree.functions.color = function (str) {
13
+ less.tree.functions._color = function (str) {
16
14
  if (str.value === "evil red") { return new(less.tree.Color)("600") }
17
15
  }
18
16
 
data/lib/less/loader.rb CHANGED
@@ -1,41 +1,40 @@
1
+ require 'commonjs'
1
2
 
2
3
  module Less
3
4
  class Loader
4
-
5
+ include CallJS
6
+
7
+ attr_reader :environment
8
+
5
9
  def initialize
6
10
  @cxt = V8::Context.new
7
- @path = Pathname(__FILE__).dirname.join('js','lib')
8
- @exports = {
9
- "path" => Path.new,
10
- "sys" => Sys.new,
11
- "fs" => Fs.new
12
- }
13
- @process = Process.new
11
+ @environment = CommonJS::Environment.new(@cxt, :path => Pathname(__FILE__).dirname.join('js','lib').to_s)
12
+ @environment.native('path', Path.new)
13
+ @environment.native('util', Sys.new)
14
+ @environment.native('fs', Fs.new)
15
+
16
+ @cxt['process'] = Process.new
14
17
  @cxt['console'] = Console.new
15
18
  end
16
-
17
- def require(path)
18
- unless exports = @exports[path]
19
- filename = path =~ /\.js$/ ? path : "#{path}.js"
20
- filepath = @path.join(filename)
21
- fail LoadError, "no such file: #{filename}" unless filepath.exist?
22
- load = @cxt.eval("(function(process, require, exports, __dirname) {require.paths = [];#{File.read(filepath)}})", filepath.expand_path)
23
- @exports[path] = exports = @cxt['Object'].new
24
- load.call(@process, method(:require), exports, Dir.pwd)
25
- end
26
- return exports
19
+
20
+ def require(module_id)
21
+ @environment.require(module_id)
27
22
  end
28
-
23
+
29
24
  class Path
30
25
  def join(*components)
31
26
  File.join(*components)
32
27
  end
33
-
28
+
34
29
  def dirname(path)
35
30
  File.dirname(path)
36
31
  end
32
+
33
+ def basename(path)
34
+ File.basename(path)
35
+ end
37
36
  end
38
-
37
+
39
38
  class Sys
40
39
  def error(*errors)
41
40
  raise errors.join(' ')
@@ -46,18 +45,18 @@ module Less
46
45
  def statSync(path)
47
46
  File.stat(path)
48
47
  end
49
-
48
+
50
49
  def readFile(path, encoding, callback)
51
50
  callback.call(nil, File.read(path))
52
51
  end
53
-
52
+
54
53
  end
55
54
 
56
55
  class Process
57
56
  def exit(*args)
58
57
  end
59
58
  end
60
-
59
+
61
60
  class Console
62
61
  def log(*msgs)
63
62
  puts msgs.join(',')
data/lib/less/parser.rb CHANGED
@@ -9,10 +9,32 @@ module Less
9
9
  #
10
10
  # @yield code to wrap
11
11
  def calljs
12
- yield
12
+ lock do
13
+ yield
14
+ end
13
15
  rescue V8::JSError => e
14
16
  raise ParseError.new(e)
15
17
  end
18
+
19
+ # @private
20
+ # Ensure proper locking before entering the V8 API
21
+ #
22
+ # @yield code to wrap in lock
23
+ def lock
24
+ result, exception = nil, nil
25
+ V8::C::Locker() do
26
+ begin
27
+ result = yield
28
+ rescue Exception => e
29
+ exception = e
30
+ end
31
+ end
32
+ if exception
33
+ raise exception
34
+ else
35
+ result
36
+ end
37
+ end
16
38
  end
17
39
 
18
40
  # Convert lesscss source into an abstract syntax Tree
@@ -26,10 +48,12 @@ module Less
26
48
  # @option opts [String] :filename to associate with resulting parse trees (useful for generating errors)
27
49
  def initialize(options = {})
28
50
  stringy = {}
29
- options.each do |k,v|
51
+ Less.defaults.merge(options).each do |k,v|
30
52
  stringy[k.to_s] = v.is_a?(Array) ? v.map(&:to_s) : v.to_s
31
53
  end
32
- @parser = Less.Parser.new(stringy)
54
+ lock do
55
+ @parser = Less.Parser.new(stringy)
56
+ end
33
57
  end
34
58
 
35
59
  # Convert `less` source into a abstract syntaxt tree
@@ -37,9 +61,11 @@ module Less
37
61
  # @return [Less::Tree] the parsed tree
38
62
  def parse(less)
39
63
  calljs do
40
- error,tree = nil
41
- @parser.parse(less, lambda {|e, t|
42
- error = e; tree = t
64
+ tree = nil
65
+ @parser.parse(less, lambda {|*args|
66
+ this, e, t = *args
67
+ fail e.message unless e.nil?
68
+ tree = t
43
69
  })
44
70
  Tree.new(tree) if tree
45
71
  end
data/lib/less/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Less
2
- VERSION = '2.0.4'
2
+ VERSION = '2.1.0'
3
3
  end
data/lib/less.rb CHANGED
@@ -1,13 +1,12 @@
1
- $:.unshift(File.dirname(__FILE__)) unless
2
- $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
1
+ require 'v8'
2
+ require 'pathname'
3
+ require 'less/parser'
4
+ require 'less/loader'
5
+ require 'less/version'
6
+ require 'less/defaults'
3
7
 
4
8
  module Less
5
-
6
- require 'v8'
7
- require 'pathname'
8
- require 'less/parser'
9
- require 'less/loader'
10
- require 'less/version'
9
+ extend Less::Defaults
11
10
 
12
11
  @loader = Less::Loader.new
13
12
  @less = @loader.require('less/index')
@@ -0,0 +1,3 @@
1
+ body {
2
+ color: @a;
3
+ }
@@ -14,14 +14,40 @@ describe Less::Parser do
14
14
  subject.parse(".class {width: 1+1}").to_css(:compress => true).strip.should eql ".class{width:2;}"
15
15
  end
16
16
  end
17
+
17
18
  it "throws a ParseError if the lesscss is bogus" do
18
19
  expect {subject.parse('{^)')}.should raise_error(Less::ParseError)
19
20
  end
20
21
 
21
- describe "when configured with mulitple load paths" do
22
- before {@parser = Less::Parser.new :paths => [cwd.join('one'), cwd.join('two')]}
22
+ it "passes exceptions from the less compiler" do
23
+ expect {subject.parse('body { color: @a; }').to_css}.should raise_error(Less::ParseError, /variable @a is undefined/)
24
+ end
25
+
26
+ describe "when configured with multiple load paths" do
27
+ subject {Less::Parser.new :paths => [cwd.join('one'), cwd.join('two'), cwd.join('faulty')]}
23
28
 
24
29
  it "will load files from both paths" do
30
+ subject.parse('@import "one.less";').to_css.gsub(/\n/,'').strip.should eql ".one { width: 1;}"
31
+ subject.parse('@import "two.less";').to_css.gsub(/\n/,'').strip.should eql ".two { width: 1;}"
32
+ end
33
+
34
+ it "passes exceptions from less imported less files" do
35
+ expect {subject.parse('@import "faulty.less";').to_css}.should raise_error(Less::ParseError, /variable @a is undefined/)
36
+ end
37
+
38
+ end
39
+
40
+ describe "when load paths are specified in as default options" do
41
+ before do
42
+ Less.paths << cwd.join('one')
43
+ Less.paths << cwd.join('two')
44
+ @parser = Less::Parser.new
45
+ end
46
+ after do
47
+ Less.paths.clear
48
+ end
49
+
50
+ it "will load files from default load paths" do
25
51
  @parser.parse('@import "one.less";').to_css.gsub(/\n/,'').strip.should eql ".one { width: 1;}"
26
52
  @parser.parse('@import "two.less";').to_css.gsub(/\n/,'').strip.should eql ".two { width: 1;}"
27
53
  end