ruby2js 1.7.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NTFjZjRmN2VhMTYwOWUxNTM3ZTZlNjE2NzI2NTUzMGZjMDQ5NTlkNg==
4
+ ZTQ1ZGU1ZTI0NWQ4ZmMwNzNiMjExYjk1MWY5YWJkNTY1MzYzNTQwYg==
5
5
  data.tar.gz: !binary |-
6
- NWE4OTZhMDMzMDBiYjNkNTQwYWE2NmYxM2I5ZDZhZGJlNGU2ZmEyMg==
6
+ MmI0MjVhYjkwNzg5YTUxZTgzMDhhYWE3NjM0MmU2NmIyNjQ4MGJkYw==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- YTBiZDljMDhmODZjMjdjOWNjMmNmOTU5MjBmOTA0ODJlMjcyOWQ4NTkyN2Ux
10
- YjQyNzI0NmRlMjQyMjEzODkzZTYwNTliN2U5ZGMxMDQ5MzJmNWRhMjVjMmVk
11
- Y2Q0YTZmNmRiNTE3ZGFhMGE2ZDBkNmNjYjlhOWZkMTY0NWZjMjI=
9
+ NzZmNjgxYzU1YmFjZTU4ZmI0MWJkY2I1YmZjN2YxN2RmOTkzOGRhYzNmN2Rm
10
+ ZWIzMTIxYWM1NmYxOTRjOTI5MjA5NzY3MTc4Yjk4MWM0MDQ0YTNjMTc3NGEy
11
+ NDk0NGE1ZjFkOTQ3YzRlNzAzNmVkYjZmMTAxNmIzZTNkYTlhODU=
12
12
  data.tar.gz: !binary |-
13
- MTVjMTE5NTQyNjdlOTY5YmQ3ZjMwNTQwY2RiM2MxZjQ3Y2U4MWFiMDZkYTQx
14
- MzUxYWE4MmI0NGIzZWRmNGI4NDZlZDFiYjY0MDRjZTIxMTczNjRhMTg3YTNk
15
- Y2RhZDcxMDRhNmVhMWQ3YjFhMmM3N2MwODM4ZmJhOTc5MTYwNjk=
13
+ OTc5OTkwNmY2Yzc1MzgxMWNkN2M5YjFlYzAyNDE3N2M5MTllMTE4ZjA0MWI3
14
+ NjlmOWM0ODQ3NTAzZWY1YzFiNWFkMWVhOTE5OThiNmY1Y2UwZjRmYmVkNzll
15
+ MTU0OTQ0YTU3NzVkNGQ1NGJlNzYzMjgzNzBkMWYwMWM1ZjAxOWE=
data/README.md CHANGED
@@ -13,13 +13,11 @@ calls IF there are either one or more arguments passed OR parenthesis are
13
13
  used, otherwise Ruby method calls become JavaScript property accesses.
14
14
  By default, methods, lambdas, and procs return `undefined`.
15
15
 
16
- Ruby attribute accessors, as well as getter and setter method definitions, are
16
+ Ruby attribute accessors, methods defined with no parameters and no
17
+ parenthesis, as well as setter method definitions, are
17
18
  mapped to
18
19
  [Object.defineProperty](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FObject%2FdefineProperty),
19
- so avoid these if you wish to target users running IE8 or lower. Instance
20
- methods defined with no arguments are presumed to be defining a property
21
- accessor; if you want a method with no arguments append a `!` to the method
22
- name.
20
+ so avoid these if you wish to target users running IE8 or lower.
23
21
 
24
22
  Filters may be provided to add Ruby-specific or framework specific
25
23
  behavior. Filters are essentially macro facilities that operate on
@@ -237,6 +235,14 @@ the script.
237
235
  implicit `use` statements
238
236
  * maps constant assignments in an angular module to a filter
239
237
  * maps class definitions in an angular module to a filter
238
+ * within a controller or within a `link` method in a directive:
239
+ * maps `apply`, `broadcast`, `digest`, `emit`, `eval`, `evalAsync`, and
240
+ `parent` calls to `$scope` functions.
241
+ * maps `apply!`, `broadcast!`, `digest!`, `eval!`, and `evalAsync!`
242
+ calls to `$rootScope` functions.
243
+ * maps `filter` calls to '$filter` calls.
244
+ * maps `timeout` and `interval` calls with a block to `$timeout` and
245
+ `$interval` calls where the block is passed as the first parameter.
240
246
 
241
247
  * [angular-route](https://github.com/rubys/ruby2js/blob/master/lib/ruby2js/filter/angular-routerb.rb)
242
248
 
@@ -31,19 +31,19 @@ module Ruby2JS
31
31
  elsif m.children.first =~ /=/
32
32
  # property setter
33
33
  sym = :"#{m.children.first.to_s[0..-2]}"
34
- s(:prop, s(:attr, name, :prototype), sym,
35
- enumerable: s(:true), configurable: s(:true),
36
- set: s(:block, s(:send, nil, :proc), *m.children[1..-1]))
34
+ s(:prop, s(:attr, name, :prototype), sym =>
35
+ {enumerable: s(:true), configurable: s(:true),
36
+ set: s(:block, s(:send, nil, :proc), *m.children[1..-1])})
37
37
  else
38
38
  if m.children[1].children.length == 0 and
39
39
  m.children.first !~ /!/ and m.loc and m.loc.name and
40
40
  m.loc.name.source_buffer.source[m.loc.name.end_pos] != '('
41
41
 
42
42
  # property getter
43
- s(:prop, s(:attr, name, :prototype), m.children.first,
44
- enumerable: s(:true), configurable: s(:true),
43
+ s(:prop, s(:attr, name, :prototype), m.children.first =>
44
+ {enumerable: s(:true), configurable: s(:true),
45
45
  get: s(:block, s(:send, nil, :proc), m.children[1],
46
- s(:autoreturn, *m.children[2..-1])))
46
+ s(:autoreturn, *m.children[2..-1]))})
47
47
  else
48
48
  # method: add to prototype
49
49
  s(:method, s(:attr, name, :prototype),
@@ -55,18 +55,18 @@ module Ruby2JS
55
55
  elsif m.type == :defs and m.children.first == s(:self)
56
56
  if m.children[1] =~ /=$/
57
57
  # class property setter
58
- s(:prop, name, m.children[1].to_s[0..-2],
59
- enumerable: s(:true), configurable: s(:true),
60
- set: s(:block, s(:send, nil, :proc), *m.children[2..-1]))
58
+ s(:prop, name, m.children[1].to_s[0..-2] =>
59
+ {enumerable: s(:true), configurable: s(:true),
60
+ set: s(:block, s(:send, nil, :proc), *m.children[2..-1])})
61
61
  elsif m.children[2].children.length == 0 and
62
62
  m.children[1] !~ /!/ and m.loc and m.loc.name and
63
63
  m.loc.name.source_buffer.source[m.loc.name.end_pos] != '('
64
64
 
65
65
  # class property getter
66
- s(:prop, name, m.children[1].to_s,
67
- enumerable: s(:true), configurable: s(:true),
66
+ s(:prop, name, m.children[1].to_s =>
67
+ {enumerable: s(:true), configurable: s(:true),
68
68
  get: s(:block, s(:send, nil, :proc), m.children[2],
69
- s(:autoreturn, *m.children[3..-1])))
69
+ s(:autoreturn, *m.children[3..-1]))})
70
70
  else
71
71
  # class method definition: add to prototype
72
72
  s(:prototype, s(:send, name, "#{m.children[1]}=",
@@ -77,30 +77,30 @@ module Ruby2JS
77
77
  if m.children[1] == :attr_accessor
78
78
  m.children[2..-1].map do |sym|
79
79
  var = sym.children.first
80
- s(:prop, s(:attr, name, :prototype), var,
81
- enumerable: s(:true), configurable: s(:true),
80
+ s(:prop, s(:attr, name, :prototype), var =>
81
+ {enumerable: s(:true), configurable: s(:true),
82
82
  get: s(:block, s(:send, nil, :proc), s(:args),
83
83
  s(:return, s(:ivar, :"@#{var}"))),
84
84
  set: s(:block, s(:send, nil, :proc), s(:args, s(:arg, var)),
85
- s(:ivasgn, :"@#{var}", s(:lvar, var))))
85
+ s(:ivasgn, :"@#{var}", s(:lvar, var)))})
86
86
  end
87
87
  elsif m.children[1] == :attr_reader
88
88
  m.children[2..-1].map do |sym|
89
89
  var = sym.children.first
90
- s(:prop, s(:attr, name, :prototype), var,
91
- get: s(:block, s(:send, nil, :proc), s(:args),
90
+ s(:prop, s(:attr, name, :prototype), var =>
91
+ {get: s(:block, s(:send, nil, :proc), s(:args),
92
92
  s(:return, s(:ivar, :"@#{var}"))),
93
93
  enumerable: s(:true),
94
- configurable: s(:true))
94
+ configurable: s(:true)})
95
95
  end
96
96
  elsif m.children[1] == :attr_writer
97
97
  m.children[2..-1].map do |sym|
98
98
  var = sym.children.first
99
- s(:prop, s(:attr, name, :prototype), var,
100
- set: s(:block, s(:send, nil, :proc), s(:args, s(:arg, var)),
99
+ s(:prop, s(:attr, name, :prototype), var =>
100
+ {set: s(:block, s(:send, nil, :proc), s(:args, s(:arg, var)),
101
101
  s(:ivasgn, :"@#{var}", s(:lvar, var))),
102
102
  enumerable: s(:true),
103
- configurable: s(:true))
103
+ configurable: s(:true)})
104
104
  end
105
105
  else
106
106
  # class method call
@@ -138,9 +138,11 @@ module Ruby2JS
138
138
  next unless body[i] and body[i].type == :prop
139
139
  for j in i+1...body.length
140
140
  break unless body[j] and body[j].type == :prop
141
- if body[i].children[0..1] == body[j].children[0..1]
142
- merge = body[i].children[2].merge(body[j].children[2])
143
- body[j] = s(:prop, *body[j].children[0..1], merge)
141
+ if body[i].children[0] == body[j].children[0]
142
+ merge = Hash[(body[i].children[1].to_a+body[j].children[1].to_a).
143
+ group_by(&:first).map {|name, values|
144
+ [name, values.map(&:last).reduce(:merge)]}]
145
+ body[j] = s(:prop, body[j].children[0], merge)
144
146
  body[i] = nil
145
147
  break
146
148
  end
@@ -176,11 +178,12 @@ module Ruby2JS
176
178
  s(:pair, s(:str, node.children[1].to_s.chomp('=')),
177
179
  node.children[2])
178
180
  else
179
- s(:pair, s(:prop, node.children[1]), node.children[2])
181
+ node.children[1].map {|prop, descriptor|
182
+ s(:pair, s(:prop, prop), descriptor)}
180
183
  end
181
184
  end
182
185
  body[start...start+methods] =
183
- s(:send, name, :prototype=, s(:hash, *pairs))
186
+ s(:send, name, :prototype=, s(:hash, *pairs.flatten))
184
187
  end
185
188
  end
186
189
 
@@ -209,10 +212,18 @@ module Ruby2JS
209
212
  instance_method, @instance_method = @instance_method, @ast
210
213
  @block_this, @block_depth = false, 0
211
214
  if @ast.type == :prop
212
- obj, prop, descriptor = *args
213
- parse s(:send, s(:const, nil, :Object), :defineProperty,
214
- obj, s(:sym, prop), s(:hash,
215
- *descriptor.map { |key, value| s(:pair, s(:sym, key), value) }))
215
+ obj, props = *args
216
+ if props.length == 1
217
+ prop, descriptor = props.flatten
218
+ parse s(:send, s(:const, nil, :Object), :defineProperty,
219
+ obj, s(:sym, prop), s(:hash,
220
+ *descriptor.map { |key, value| s(:pair, s(:sym, key), value) }))
221
+ else
222
+ parse s(:send, s(:const, nil, :Object), :defineProperties,
223
+ obj, s(:hash, *props.map {|prop, descriptor|
224
+ s(:pair, s(:sym, prop), s(:hash, *descriptor.map {|key, value|
225
+ s(:pair, s(:sym, key), value) }))}))
226
+ end
216
227
  elsif @ast.type == :method
217
228
  parse s(:send, *args)
218
229
  else
@@ -9,6 +9,7 @@ module Ruby2JS
9
9
  handle :hash do |*pairs|
10
10
  pairs.map! do |node|
11
11
  begin
12
+ block_this, block_depth = @block_this, @block_depth
12
13
  @block_this, @block_depth = false, 0
13
14
 
14
15
  left, right = node.children
@@ -30,7 +31,7 @@ module Ruby2JS
30
31
  end
31
32
 
32
33
  ensure
33
- @block_this, @block_depth = nil, nil
34
+ @block_this, @block_depth = block_this, block_depth
34
35
  end
35
36
  end
36
37
 
@@ -45,7 +45,7 @@ module Ruby2JS
45
45
  if receiver
46
46
  group_receiver = receiver.type == :send &&
47
47
  op_index < operator_index( receiver.children[1] ) if receiver
48
- group_receiver ||= (receiver.type == :begin)
48
+ group_receiver ||= [:begin, :dstr, :dsym].include? receiver.type
49
49
  end
50
50
 
51
51
  if target
@@ -125,7 +125,8 @@ module Ruby2JS
125
125
  else
126
126
  if not ast.is_method?
127
127
  if receiver
128
- "#{ parse receiver }.#{ method }"
128
+ call = (group_receiver ? group(receiver) : parse(receiver))
129
+ "#{ call }.#{ method }"
129
130
  else
130
131
  parse s(:lvasgn, method), @state
131
132
  end
@@ -133,7 +134,8 @@ module Ruby2JS
133
134
  parse s(:send, s(:attr, receiver, method), :apply,
134
135
  (receiver || s(:nil)), s(:array, *args))
135
136
  else
136
- call = "#{ parse receiver }#{ '.' if receiver && method}#{ method }"
137
+ call = (group_receiver ? group(receiver) : parse(receiver))
138
+ call = "#{ call }#{ '.' if receiver && method}#{ method }"
137
139
  args = args.map {|a| parse a}
138
140
  if args.any? {|arg| arg.to_s.include? "\n"}
139
141
  "#{ call }(#{ args.join(', ') })"
@@ -184,6 +184,11 @@ module Ruby2JS
184
184
  ng_watch(node, :$on)
185
185
  when :observe
186
186
  ng_observe(node)
187
+ when :timeout, :interval
188
+ method = (call.children[1] == :timeout ? :$timeout : :$interval)
189
+ process s(:gvar, method) # for dependency injection purposes
190
+ process s(:send, nil, method, s(:block, s(:send, nil, :proc),
191
+ *node.children[1..-1]), *call.children[2..-1])
187
192
  else
188
193
  super
189
194
  end
@@ -460,9 +465,6 @@ module Ruby2JS
460
465
 
461
466
  def on_send(node)
462
467
  if @ngContext == :controller
463
- # map well known method names to the appropriate service
464
- scope, method = NG_METHOD_MAP[node.children[1]]
465
-
466
468
  if node.children[0..1] == [nil, :interpolate] and @ngScope
467
469
  @ngClassUses << :$interpolate
468
470
  if node.children.length > 3 and node.children[3].type == :nil
@@ -485,6 +487,9 @@ module Ruby2JS
485
487
  end
486
488
  end
487
489
 
490
+ # map well known method names to the appropriate service
491
+ scope, method = NG_METHOD_MAP[node.children[1]]
492
+
488
493
  return super unless node.children.first == nil and method
489
494
 
490
495
  scope = s(:gvar, scope) if scope
@@ -5,6 +5,13 @@ module Ruby2JS
5
5
  module Functions
6
6
  include SEXP
7
7
 
8
+ VAR_TO_ASSIGN = {
9
+ lvar: :lvasgn,
10
+ ivar: :ivasgn,
11
+ cvar: :cvasgn,
12
+ gvar: :gvasgn
13
+ }
14
+
8
15
  def on_send(node)
9
16
  target, method, *args = node.children
10
17
 
@@ -36,9 +43,9 @@ module Ruby2JS
36
43
 
37
44
  elsif [:sub!, :gsub!].include? method
38
45
  method = :"#{method.to_s[0..-2]}"
39
- if target.type == :lvar
40
- process s(:lvasgn, target.children[0], s(:send,
41
- s(:lvar, target.children[0]), method, *node.children[2..-1]))
46
+ if VAR_TO_ASSIGN.keys.include? target.type
47
+ process s(VAR_TO_ASSIGN[target.type], target.children[0],
48
+ s(:send, target, method, *node.children[2..-1]))
42
49
  elsif target.type == :send
43
50
  if target.children[0] == nil
44
51
  process s(:lvasgn, target.children[1], s(:send,
@@ -1,7 +1,7 @@
1
1
  module Ruby2JS
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 1
4
- MINOR = 7
4
+ MINOR = 8
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
data/ruby2js.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "ruby2js"
5
- s.version = "1.7.0"
5
+ s.version = "1.8.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Sam Ruby"]
9
- s.date = "2014-03-06"
9
+ s.date = "2014-04-02"
10
10
  s.description = " The base package maps Ruby syntax to JavaScript semantics.\n Filters may be provided to add Ruby-specific or framework specific\n behavior.\n"
11
11
  s.email = "rubys@intertwingly.net"
12
12
  s.files = ["ruby2js.gemspec", "README.md", "lib/ruby2js", "lib/ruby2js/rails.rb", "lib/ruby2js/version.rb", "lib/ruby2js/converter", "lib/ruby2js/converter/kwbegin.rb", "lib/ruby2js/converter/const.rb", "lib/ruby2js/converter/return.rb", "lib/ruby2js/converter/prototype.rb", "lib/ruby2js/converter/opasgn.rb", "lib/ruby2js/converter/xstr.rb", "lib/ruby2js/converter/args.rb", "lib/ruby2js/converter/defs.rb", "lib/ruby2js/converter/literal.rb", "lib/ruby2js/converter/array.rb", "lib/ruby2js/converter/if.rb", "lib/ruby2js/converter/nil.rb", "lib/ruby2js/converter/logical.rb", "lib/ruby2js/converter/next.rb", "lib/ruby2js/converter/while.rb", "lib/ruby2js/converter/whilepost.rb", "lib/ruby2js/converter/arg.rb", "lib/ruby2js/converter/case.rb", "lib/ruby2js/converter/break.rb", "lib/ruby2js/converter/hash.rb", "lib/ruby2js/converter/for.rb", "lib/ruby2js/converter/boolean.rb", "lib/ruby2js/converter/module.rb", "lib/ruby2js/converter/var.rb", "lib/ruby2js/converter/undef.rb", "lib/ruby2js/converter/blockpass.rb", "lib/ruby2js/converter/until.rb", "lib/ruby2js/converter/regexp.rb", "lib/ruby2js/converter/untilpost.rb", "lib/ruby2js/converter/masgn.rb", "lib/ruby2js/converter/cvasgn.rb", "lib/ruby2js/converter/block.rb", "lib/ruby2js/converter/super.rb", "lib/ruby2js/converter/ivar.rb", "lib/ruby2js/converter/send.rb", "lib/ruby2js/converter/vasgn.rb", "lib/ruby2js/converter/defined.rb", "lib/ruby2js/converter/def.rb", "lib/ruby2js/converter/sym.rb", "lib/ruby2js/converter/cvar.rb", "lib/ruby2js/converter/ivasgn.rb", "lib/ruby2js/converter/casgn.rb", "lib/ruby2js/converter/self.rb", "lib/ruby2js/converter/begin.rb", "lib/ruby2js/converter/dstr.rb", "lib/ruby2js/converter/class.rb", "lib/ruby2js/cgi.rb", "lib/ruby2js/converter.rb", "lib/ruby2js/filter", "lib/ruby2js/filter/return.rb", "lib/ruby2js/filter/strict.rb", "lib/ruby2js/filter/angularrb.rb", "lib/ruby2js/filter/underscore.rb", "lib/ruby2js/filter/angular-resource.rb", "lib/ruby2js/filter/functions.rb", "lib/ruby2js/filter/jquery.rb", "lib/ruby2js/filter/angular-route.rb", "lib/ruby2js/sinatra.rb", "lib/ruby2js.rb"]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby2js
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Ruby
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-06 00:00:00.000000000 Z
11
+ date: 2014-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser