js2 0.0.8 → 0.0.9

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 (43) hide show
  1. data/Changelog +3 -0
  2. data/Manifest.txt +13 -28
  3. data/Rakefile +19 -19
  4. data/bin/js2 +48 -41
  5. data/lib/javascript/sel_marker.js2 +3 -3
  6. data/lib/js2/config.rb +6 -1
  7. data/lib/js2/{process/file_handler.rb → file_handler.rb} +15 -19
  8. data/lib/js2/foo.js2.haml +3 -0
  9. data/lib/js2/{process/haml_engine.rb → haml_engine.rb} +1 -1
  10. data/lib/js2/{parser/haml.rb → haml_parser.rb} +20 -7
  11. data/lib/js2/js2.js +108 -0
  12. data/lib/js2/js2bootstrap.js2 +455 -0
  13. data/lib/js2/parser.rb +3542 -0
  14. data/lib/js2/processor.rb +14 -65
  15. data/lib/js2/replace.rb +106 -0
  16. data/lib/js2/{decorator/test.rb → sel_decorator.rb} +11 -14
  17. data/{meta/c_tokenizer.rl.erb → lib/js2/tokenizer.rl.erb} +155 -123
  18. data/lib/js2/tree.rb +340 -0
  19. data/lib/js2/universe.rb +101 -0
  20. data/lib/js2.rb +31 -77
  21. data/lib/tasks/js2.rake +1 -1
  22. metadata +15 -29
  23. data/lib/js2/ast/class_node.rb +0 -105
  24. data/lib/js2/ast/comment_node.rb +0 -2
  25. data/lib/js2/ast/haml_node.rb +0 -22
  26. data/lib/js2/ast/include_node.rb +0 -11
  27. data/lib/js2/ast/inherited_node.rb +0 -7
  28. data/lib/js2/ast/member_node.rb +0 -18
  29. data/lib/js2/ast/method_node.rb +0 -29
  30. data/lib/js2/ast/module_node.rb +0 -6
  31. data/lib/js2/ast/node.rb +0 -14
  32. data/lib/js2/ast/nodes.rb +0 -123
  33. data/lib/js2/ast/stuff_node.rb +0 -6
  34. data/lib/js2/decorator/app.rb +0 -7
  35. data/lib/js2/decorator/cleanser.rb +0 -54
  36. data/lib/js2/decorator/standard.rb +0 -103
  37. data/lib/js2/parser/fast.rb +0 -3959
  38. data/lib/js2/process/universe.rb +0 -89
  39. data/lib/js2/test/selenium.rb +0 -109
  40. data/lib/js2/test/selenium_element.rb +0 -234
  41. data/lib/js2/test/selenium_helper.rb +0 -27
  42. data/lib/js2bootstrap.js2 +0 -274
  43. data/meta/replace.rb +0 -126
@@ -1,89 +0,0 @@
1
- class JS2::Process::Universe
2
- attr_accessor :compilations
3
-
4
- def initialize
5
- @class_lookup = Hash.new
6
- @haml_lookup = Hash.new
7
- @node_containers = Array.new
8
- @mod_lookup = Hash.new
9
-
10
- @compilations = Hash.new
11
- end
12
-
13
- def add_nodes (nodes)
14
- nodes.select { |n| n.is_a? JS2::AST::ClassNode }.each do |k|
15
- @class_lookup[k.name] = k
16
- end
17
-
18
- nodes.select { |n| n.is_a? JS2::AST::ModuleNode }.each do |k|
19
- @class_lookup[k.name] = k
20
- end
21
-
22
- @node_containers << nodes
23
- end
24
-
25
- def add_yml (yml, filename)
26
- yml.each_pair do |klass_name, config|
27
- template = config['template']
28
- next unless template
29
-
30
- str = " function getTemplate () { return #{template.to_json} }"
31
- node = JS2::AST::MethodNode.new(filename, 0, str)
32
- k = @class_lookup[klass_name]
33
- k.members << node
34
- k.mem_hash['getTemplate'] = node
35
-
36
- if config['make_compilation']
37
- compilation = [ k.filename ]
38
-
39
- if config['include']
40
- compilation += config['include'].collect { |name| @class_lookup[name].filename }
41
- end
42
-
43
- template.each do |t|
44
- klass_name = t['class']
45
- klass = @class_lookup[klass_name]
46
- compilation << klass.filename
47
- end
48
- @compilations[k.filename] = compilation
49
- end
50
- end
51
- end
52
-
53
- def node_containers
54
- return @node_containers
55
- end
56
-
57
- def add_haml_hash (hash)
58
- hash.each_pair do |name, haml_hash|
59
- @haml_lookup[name] ||= JS2::AST::HamlNode.new
60
- haml = @haml_lookup[name]
61
-
62
- haml_hash.each_pair do |k,v|
63
- haml[k] = v
64
- end
65
- end
66
- end
67
-
68
- def finalize! ()
69
- @class_lookup.values.each do |k|
70
- # set parents
71
- k.parent = @class_lookup[k.extends] if k.extends
72
- included_mods = []
73
- k.includes.each do |mod_node|
74
- m = @class_lookup[mod_node.name]
75
- included_mods << m if m
76
- end
77
-
78
- k.included_mods = included_mods
79
-
80
- # set haml
81
- k.haml = @haml_lookup[k.name] if @haml_lookup[k.name]
82
- end
83
-
84
- @class_lookup.values.each do |k|
85
- k.finalize!
86
- end
87
- end
88
-
89
- end
@@ -1,109 +0,0 @@
1
- begin
2
- require 'rubygems'
3
- gem "selenium-client", ">=1.2.16"
4
- require "selenium/client"
5
- require "yaml"
6
- require "json"
7
-
8
-
9
- class JS2::Test::Selenium < Selenium::Client::Driver
10
- attr_accessor :reference_dir, :child_selector
11
-
12
- RESET_SEL_MARKER = "if (window.JS2) { window.USE_SEL_MARKER = window.JS2.SEL_MARKER; }"
13
-
14
- class << self
15
-
16
- def logger
17
- return @logger || nil
18
- end
19
-
20
- def logger= (a_logger)
21
- @logger = a_logger
22
- end
23
-
24
- def connect (config_file, env = nil)
25
- config = YAML.load_file(config_file)
26
- config = config[env] if env
27
-
28
- reference_dir = config['reference_dir'] || './spec/js2refs'
29
- config = config['selenium']
30
- ret = self.new( :host => config['host'] || 'localhost',
31
- :port => config['port'] || 4444,
32
- :browser => config['browser'] || '*firefox',
33
- :url => config['url'] || 'http://www.factual.com',
34
-
35
- :timeout_in_second => config[:timeout] || 60,
36
- :highlight_located_element => config['highlight'] || false,
37
- :javascript_framework => config['framework'] || 'jquery' )
38
-
39
- # hack to get an instance var in.
40
- ret.reference_dir = reference_dir
41
- ret.child_selector = nil
42
- return ret
43
- end
44
- end
45
-
46
- def get_sel_markers ()
47
- json = self.execute("JS2.SEL_MARKER.toJson()")
48
- struct = JSON.parse(json)
49
- puts YAML::dump(struct)
50
- end
51
-
52
- def open!(uri)
53
- ret = self.open(uri)
54
- self.wait_for_page
55
- self.set_sel_marker!
56
- return ret
57
- end
58
-
59
- def execute (js)
60
- puts js
61
- return self.js_eval("window.eval(#{js.to_json});")
62
- end
63
-
64
- def uri
65
- return self.location.sub(%r|^https?://(.*)?/|, '/')
66
- end
67
-
68
- def get_helper (klass_name)
69
- klass = klass_name
70
- ref_file = %|#{@reference_dir}/#{klass_name}.yml|
71
- lookup = if File.exist? ref_file
72
- YAML.load_file(ref_file)
73
- else
74
- Hash.new
75
- end
76
-
77
- return JS2::Test::SeleniumHelper.new(klass_name, lookup, self)
78
- end
79
-
80
- def child_scope (selector)
81
- js = "if (window.JS2) { window.USE_SEL_MARKER = window.JS2.SEL_MARKER."
82
- js << selector.split('>').collect { |s| "children.#{s}" }.join('.')
83
- js << '};'
84
- @keep_selector = js
85
- self.set_sel_marker!
86
- yield()
87
- @keep_selector = nil
88
- self.set_sel_marker!
89
- end
90
-
91
- def set_sel_marker!
92
- self.execute(@keep_selector || RESET_SEL_MARKER)
93
- end
94
-
95
- def scope(klass_name)
96
- self.set_sel_marker!
97
- helper = get_helper(klass_name)
98
- if block_given?
99
- yield(helper)
100
- else
101
- return helper
102
- end
103
- end
104
-
105
- end
106
-
107
- rescue Exception => e
108
- warn "No support for selenium"
109
- end
@@ -1,234 +0,0 @@
1
- class JS2::Test::SeleniumElement
2
- attr_accessor :options
3
- QUICK_WAIT_FOR = 5
4
- AJAX_TIME_OUT = 60
5
- def initialize (sel, klass, key, selector = nil)
6
- @sel = sel
7
- @key = key
8
- @klass = klass
9
- @selector = selector
10
- end
11
-
12
- def log (str)
13
- if JS2::Test::Selenium.logger
14
- JS2::Test::Selenium.logger.info(str)
15
- end
16
- end
17
-
18
- def raw
19
- ret = self.class.new(@sel, @klass, @key, @selector)
20
- ret.options[:raw] = true
21
- return ret
22
- end
23
-
24
- def check
25
- return execute('checked=true')
26
- end
27
-
28
- def uncheck
29
- return execute('checked=false')
30
- end
31
-
32
- def checked?
33
- return execute('checked')
34
- end
35
-
36
- def execute (str)
37
- wait_for_ajax
38
- return @sel.execute(get_js_locator() + '.' + str)
39
- end
40
-
41
- def visible?(wait_for = nil)
42
- return self.check_attribute(':visible', true, wait_for);
43
- end
44
-
45
- def sel_visible?()
46
- return @sel.visible?(get_ele())
47
- end
48
-
49
- def hidden?(wait_for = nil)
50
- return self.check_attribute(':visible', false, wait_for);
51
- end
52
-
53
- def find (str, idx = 0)
54
- selector = "window.$(#{get_js_locator()}).find(#{str.to_json})[#{idx}]"
55
- return self.class.new(@sel, @klass, @key, selector)
56
- end
57
-
58
- def filter (str, idx = 0)
59
- selector = "window.$(#{get_js_locator()}).filter(#{str.to_json})[#{idx}]"
60
- return self.class.new(@sel, @klass, @key, selector)
61
- end
62
-
63
- def get (idx)
64
- # when jqObjects in //@+
65
- selector = "#{get_js_locator()}[#{idx}][0]"
66
- return self.class.new(@sel, @klass, @key, selector)
67
- end
68
-
69
- def [] (idx)
70
- selector = "#{get_js_locator()}[#{idx}]"
71
- return self.class.new(@sel, @klass, @key, selector)
72
- end
73
-
74
- def attr (attr)
75
- get_ele()
76
- js = %{window.$(#{get_js_locator()}).attr(#{attr.to_json});}
77
- return @sel.js_eval(js)
78
- end
79
-
80
- def jq_attr (attr)
81
- return @sel.execute("window.$(#{get_js_locator()}).#{attr};")
82
- end
83
-
84
- def check_attribute (attr, val, wait_for = nil)
85
- wait_for ||= QUICK_WAIT_FOR
86
- get_ele()
87
- js = %{window.$(#{get_js_locator()}).is('#{attr}') == #{val.to_json};}
88
- begin
89
- log "Waiting for #{@key}.#{attr} to be #{val.to_json}... Waiting #{wait_for} secs."
90
- @sel.wait_for_condition(js, wait_for)
91
- rescue Selenium::CommandError
92
- return false
93
- end
94
-
95
- return true
96
- end
97
-
98
- def containsp? (str)
99
- wait_for_ajax
100
- js = %{window.$(#{get_js_locator()}).html().toLowerCase().indexOf(#{str.to_json.downcase}) >= 0;}
101
- begin
102
- @sel.wait_for_condition(js, QUICK_WAIT_FOR)
103
- return true
104
- rescue Selenium::CommandError
105
- return false
106
- end
107
- end
108
-
109
- def contains? (str,timeout=QUICK_WAIT_FOR)
110
- wait_for_ajax
111
- js = %{window.$(#{get_js_locator()}).html().indexOf(#{str.to_json}) >= 0;}
112
- begin
113
- @sel.wait_for_condition(js, timeout)
114
- return true
115
- rescue Selenium::CommandError
116
- return false
117
- end
118
- end
119
-
120
- def click (options = {})
121
- @sel.click(get_ele(), options)
122
- end
123
-
124
- def text
125
- return @sel.text(get_ele())
126
- end
127
-
128
- def get_value
129
- return @sel.get_value(get_ele())
130
- end
131
-
132
- def click! (options = {})
133
- @sel.click(get_ele(), options)
134
- @sel.wait_for_page
135
- end
136
-
137
- def mouse_up ()
138
- trigger("LEFT_MOUSE_UP")
139
- end
140
-
141
- def mouse_down ()
142
- trigger("LEFT_MOUSE_DOWN")
143
- end
144
-
145
- def mouse_over
146
- @sel.mouse_over(get_ele())
147
- end
148
-
149
- def mouse_out
150
- @sel.mouse_out(get_ele())
151
- end
152
-
153
- def key_down(value)
154
- @sel.key_down(get_ele(), value)
155
- end
156
-
157
- def type (*params)
158
- elem = get_ele()
159
- @sel.type(elem, *params)
160
- @sel.fire_event(elem, 'blur')
161
- end
162
-
163
- def select(params)
164
- elem = get_ele()
165
- @sel.select(elem, params)
166
- @sel.fire_event(elem, 'blur')
167
- end
168
-
169
- def html ()
170
- wait_for_ajax
171
- js = get_js_locator()
172
- return @sel.js_eval("#{js}.innerHTML;")
173
- end
174
-
175
- private
176
-
177
- def get_locator
178
- js = get_js_locator()
179
- dom_locator = "dom=#{js};"
180
- return dom_locator
181
- end
182
-
183
- def get_ele
184
- real_locator = get_locator()
185
- wait_for_ele()
186
-
187
- return real_locator
188
- end
189
-
190
- def get_js_locator
191
- if @selector
192
- return @selector
193
- end
194
-
195
- filtered_locator = @key.to_s
196
- int = ''
197
-
198
- if m = filtered_locator.match(/([^\[\]]+)(\[([^\]]*)\])/)
199
- log "filtered: #{filtered_locator} #{m.inspect}"
200
- filtered_locator = m[1]
201
- int = ', ' + m[3] if m[3]
202
- end
203
-
204
- funct = 'getVal'
205
- get_val = "window.USE_SEL_MARKER.#{funct}('#{@klass}', '#{filtered_locator}'#{int})"
206
-
207
- return get_val
208
- end
209
-
210
- def wait_for_ele ()
211
- real_locator = get_locator
212
- puts "waiting for #{real_locator}"
213
- wait_for_ajax
214
- @sel.wait_for_condition real_locator, QUICK_WAIT_FOR
215
- puts "found #{real_locator}"
216
- end
217
-
218
- def wait_for_ajax
219
- @sel.wait_for_condition('selenium.browserbot.getCurrentWindow().jQuery.active == 0', AJAX_TIME_OUT)
220
- end
221
-
222
- def trigger (event)
223
- get_ele()
224
- @sel.execute("window.$(#{get_js_locator}).trigger(JS2.SEL_EVENTS.#{event})")
225
- end
226
-
227
- def method_missing (method, *arg)
228
- if @sel.respond_to?(method)
229
- return @sel.send(method, get_js_locator, *arg)
230
- else
231
- raise "Method missing: #{method}"
232
- end
233
- end
234
- end
@@ -1,27 +0,0 @@
1
- class JS2::Test::SeleniumHelper
2
- attr_accessor :klass, :lookup
3
-
4
- def initialize (klass, lookup, sel)
5
- @klass = klass
6
- @lookup = lookup
7
- @sel = sel
8
- @all_eles = Hash.new
9
- end
10
-
11
- def [] (key, tail = nil)
12
- key = key.to_s
13
-
14
- return @all_eles[key] if @all_eles[key]
15
-
16
- # TODO: support inheritence
17
- #raise "invalid key #{key}" unless @lookup[key]
18
-
19
- return @all_eles[key] = JS2::Test::SeleniumElement.new(@sel, @klass, key, tail)
20
- end
21
-
22
- def type_form (params = {})
23
- params.each_pair do |k,v|
24
- self[k].type(v)
25
- end
26
- end
27
- end