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.
- data/Changelog +3 -0
- data/Manifest.txt +13 -28
- data/Rakefile +19 -19
- data/bin/js2 +48 -41
- data/lib/javascript/sel_marker.js2 +3 -3
- data/lib/js2/config.rb +6 -1
- data/lib/js2/{process/file_handler.rb → file_handler.rb} +15 -19
- data/lib/js2/foo.js2.haml +3 -0
- data/lib/js2/{process/haml_engine.rb → haml_engine.rb} +1 -1
- data/lib/js2/{parser/haml.rb → haml_parser.rb} +20 -7
- data/lib/js2/js2.js +108 -0
- data/lib/js2/js2bootstrap.js2 +455 -0
- data/lib/js2/parser.rb +3542 -0
- data/lib/js2/processor.rb +14 -65
- data/lib/js2/replace.rb +106 -0
- data/lib/js2/{decorator/test.rb → sel_decorator.rb} +11 -14
- data/{meta/c_tokenizer.rl.erb → lib/js2/tokenizer.rl.erb} +155 -123
- data/lib/js2/tree.rb +340 -0
- data/lib/js2/universe.rb +101 -0
- data/lib/js2.rb +31 -77
- data/lib/tasks/js2.rake +1 -1
- metadata +15 -29
- data/lib/js2/ast/class_node.rb +0 -105
- data/lib/js2/ast/comment_node.rb +0 -2
- data/lib/js2/ast/haml_node.rb +0 -22
- data/lib/js2/ast/include_node.rb +0 -11
- data/lib/js2/ast/inherited_node.rb +0 -7
- data/lib/js2/ast/member_node.rb +0 -18
- data/lib/js2/ast/method_node.rb +0 -29
- data/lib/js2/ast/module_node.rb +0 -6
- data/lib/js2/ast/node.rb +0 -14
- data/lib/js2/ast/nodes.rb +0 -123
- data/lib/js2/ast/stuff_node.rb +0 -6
- data/lib/js2/decorator/app.rb +0 -7
- data/lib/js2/decorator/cleanser.rb +0 -54
- data/lib/js2/decorator/standard.rb +0 -103
- data/lib/js2/parser/fast.rb +0 -3959
- data/lib/js2/process/universe.rb +0 -89
- data/lib/js2/test/selenium.rb +0 -109
- data/lib/js2/test/selenium_element.rb +0 -234
- data/lib/js2/test/selenium_helper.rb +0 -27
- data/lib/js2bootstrap.js2 +0 -274
- data/meta/replace.rb +0 -126
data/lib/js2/process/universe.rb
DELETED
@@ -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
|
data/lib/js2/test/selenium.rb
DELETED
@@ -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
|