codemodels-html 0.1.0-java
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.
- checksums.yaml +7 -0
- data/.gitignore +30 -0
- data/Gemfile +4 -0
- data/LICENSE +191 -0
- data/README.md +30 -0
- data/Rakefile +9 -0
- data/codemodels-html.gemspec +30 -0
- data/lib/codemodels/html/angular_embedding_rules.rb +87 -0
- data/lib/codemodels/html/language.rb +18 -0
- data/lib/codemodels/html/metamodel.rb +48 -0
- data/lib/codemodels/html/model_building.rb +32 -0
- data/lib/codemodels/html/monkey_patching.rb +18 -0
- data/lib/codemodels/html/parser.rb +272 -0
- data/lib/codemodels/html/version.rb +5 -0
- data/lib/codemodels/html.rb +8 -0
- data/lib/jars/jericho-html-3.3.jar +0 -0
- data/test/data/puzzle.html +67 -0
- data/test/test_basic_info.rb +67 -0
- data/test/test_basic_parsing.rb +79 -0
- data/test/test_helper.rb +74 -0
- data/test/test_info_extraction.rb +37 -0
- data/test/test_monkey_patching.rb +20 -0
- data/test/test_parsing_embedded_languages.rb +54 -0
- data/test/test_parsing_puzzle.rb +170 -0
- metadata +173 -0
@@ -0,0 +1,170 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestParsingPuzzle < Test::Unit::TestCase
|
4
|
+
|
5
|
+
include TestHelper
|
6
|
+
include CodeModels
|
7
|
+
include CodeModels::Html
|
8
|
+
|
9
|
+
def test_root_structure
|
10
|
+
code = IO.read('test/data/puzzle.html')
|
11
|
+
r = Html.parse_code(code)
|
12
|
+
assert_class HtmlDocument, r
|
13
|
+
|
14
|
+
# child 0: <!DOCTYPE html>
|
15
|
+
assert_equal 2, r.children.count
|
16
|
+
assert_class Node, r.children[1]
|
17
|
+
assert_equal 'html', r.children[1].name
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_body_tag
|
21
|
+
code = IO.read('test/data/puzzle.html')
|
22
|
+
r = Html.parse_code(code)
|
23
|
+
|
24
|
+
body = nil
|
25
|
+
r.traverse do |n|
|
26
|
+
body=n if n.is_a?(Node) && n.name=='body'
|
27
|
+
end
|
28
|
+
assert_not_nil body
|
29
|
+
assert_equal 1,body.attributes.count
|
30
|
+
assert_equal 'ng-app',body.attributes[0].name
|
31
|
+
assert_equal 'puzzleApp',body.attributes[0].value
|
32
|
+
|
33
|
+
assert body.all_children.include?(body.attributes[0])
|
34
|
+
assert body.all_children_deep.include?(body.attributes[0])
|
35
|
+
|
36
|
+
assert body.values_map.has_key?('ng-app')
|
37
|
+
assert body.values_map.has_key?('puzzleApp')
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_no_double_foreign_asts
|
41
|
+
code = IO.read('test/data/puzzle.html')
|
42
|
+
r = AngularJs.parser_considering_angular_embedded_code.parse_code(code)
|
43
|
+
r.traverse do |n|
|
44
|
+
fa = n.class.ecore.eAllReferences.select{|ref|ref.name=='foreign_asts'}
|
45
|
+
fail("Node #{n} has #{fa.count} references with the name 'foreign_asts'") if fa.count > 1
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_js_names_title
|
50
|
+
code = IO.read('test/data/puzzle.html')
|
51
|
+
r = AngularJs.parser_considering_angular_embedded_code.parse_code(code)
|
52
|
+
jstitles = r.all_children_deep_also_foreign.select {|n| n.is_a?(CodeModels::Js::Name) && n.identifier=='title'}
|
53
|
+
assert_equal 2,jstitles.count
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_js_names_title_position_relative
|
57
|
+
code = IO.read('test/data/puzzle.html')
|
58
|
+
r = AngularJs.parser_considering_angular_embedded_code.parse_code(code)
|
59
|
+
jstitles = r.all_children_deep_also_foreign.select {|n| n.is_a?(CodeModels::Js::Name) && n.identifier=='title'}
|
60
|
+
|
61
|
+
assert_equal SourcePoint.new(1,3),jstitles[0].source.begin_point(:relative)
|
62
|
+
assert_equal SourcePoint.new(1,7),jstitles[0].source.end_point(:relative)
|
63
|
+
assert_equal SourcePoint.new(1,8),jstitles[1].source.begin_point(:relative)
|
64
|
+
assert_equal SourcePoint.new(1,12),jstitles[1].source.end_point(:relative)
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_js_names_title_position_absolute
|
68
|
+
code = IO.read('test/data/puzzle.html')
|
69
|
+
r = AngularJs.parser_considering_angular_embedded_code.parse_code(code)
|
70
|
+
jstitles = r.all_children_deep_also_foreign.select {|n| n.is_a?(CodeModels::Js::Name) && n.identifier=='title'}
|
71
|
+
|
72
|
+
assert_equal SourcePoint.new(15,32),jstitles[0].source.begin_point(:absolute)
|
73
|
+
assert_equal SourcePoint.new(15,36),jstitles[0].source.end_point(:absolute)
|
74
|
+
assert_equal SourcePoint.new(33,18),jstitles[1].source.begin_point(:absolute)
|
75
|
+
assert_equal SourcePoint.new(33,22),jstitles[1].source.end_point(:absolute)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_js_names_artifact_code
|
79
|
+
code = IO.read('test/data/puzzle.html')
|
80
|
+
r = AngularJs.parser_considering_angular_embedded_code.parse_code(code)
|
81
|
+
jstitles = r.all_children_deep_also_foreign.select {|n| n.is_a?(CodeModels::Js::Name) && n.identifier=='title'}
|
82
|
+
|
83
|
+
assert_equal 't.title',jstitles[0].source.artifact.code
|
84
|
+
assert_equal 'puzzle.title',jstitles[1].source.artifact.code
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_js_names_title_code
|
88
|
+
code = IO.read('test/data/puzzle.html')
|
89
|
+
r = AngularJs.parser_considering_angular_embedded_code.parse_code(code)
|
90
|
+
jstitles = r.all_children_deep_also_foreign.select {|n| n.is_a?(CodeModels::Js::Name) && n.identifier=='title'}
|
91
|
+
assert_equal 'title',jstitles[0].source.code
|
92
|
+
assert_equal 'title',jstitles[1].source.code
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_position_of_embedded_js_verify_t_1
|
96
|
+
code = %q{<!DOCTYPE html><html><li ng-repeat="t in types"></html>}
|
97
|
+
r = AngularJs.parser_considering_angular_embedded_code.parse_code(code)
|
98
|
+
jsNames = r.all_children_deep(:also_foreign).select{|n|n.class==CodeModels::Js::Name}
|
99
|
+
ts = jsNames.select{|n|n.identifier=='t'}
|
100
|
+
assert_equal 1, ts.count
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_position_of_embedded_js_verify_t_2
|
104
|
+
code = %q{<!DOCTYPE html><html><li ng-class="{'selected': t.id == type}"></html>}
|
105
|
+
r = AngularJs.parser_considering_angular_embedded_code.parse_code(code)
|
106
|
+
jsNames = r.all_children_deep(:also_foreign).select{|n|n.class==CodeModels::Js::Name}
|
107
|
+
ts = jsNames.select{|n|n.identifier=='t'}
|
108
|
+
assert_equal 1, ts.count
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_position_of_embedded_js_verify_t_3
|
112
|
+
code = %q{<!DOCTYPE html><html><a ng-href="#/{{t.id}}"/></html>}
|
113
|
+
r = AngularJs.parser_considering_angular_embedded_code.parse_code(code)
|
114
|
+
jsNames = r.all_children_deep(:also_foreign).select{|n|n.class==CodeModels::Js::Name}
|
115
|
+
ts = jsNames.select{|n|n.identifier=='t'}
|
116
|
+
assert_equal 1, ts.count
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_position_of_embedded_js_verify_t_4
|
120
|
+
code = %q{<!DOCTYPE html><html><a>{{t.title}}</a></html>}
|
121
|
+
r = AngularJs.parser_considering_angular_embedded_code.parse_code(code)
|
122
|
+
jsNames = r.all_children_deep(:also_foreign).select{|n|n.class==CodeModels::Js::Name}
|
123
|
+
ts = jsNames.select{|n|n.identifier=='t'}
|
124
|
+
assert_equal 1, ts.count
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_position_of_embedded_js
|
128
|
+
code = %q{<!DOCTYPE html>
|
129
|
+
<html>
|
130
|
+
<body ng-app="puzzleApp">
|
131
|
+
<ul id="types">
|
132
|
+
<li ng-repeat="t in types" ng-class="{'selected': t.id == type}">
|
133
|
+
<a ng-href="#/{{t.id}}">{{t.title}}</a>
|
134
|
+
</li>
|
135
|
+
</ul>
|
136
|
+
|
137
|
+
<div ng-include="type">
|
138
|
+
</div>
|
139
|
+
</body>
|
140
|
+
</html>}
|
141
|
+
r = AngularJs.parser_considering_angular_embedded_code.parse_code(code)
|
142
|
+
jsNames = r.all_children_deep(:also_foreign).select{|n|n.class==CodeModels::Js::Name}
|
143
|
+
assert_equal 'puzzleApp',jsNames[0].identifier
|
144
|
+
assert_equal 3,jsNames[0].source.position(:absolute).begin_line
|
145
|
+
ts = jsNames.select{|n|n.identifier=='t'}
|
146
|
+
types = jsNames.select{|n|n.identifier=='types'}
|
147
|
+
ids = jsNames.select{|n|n.identifier=='id'}
|
148
|
+
typess = jsNames.select{|n|n.identifier=='type'}
|
149
|
+
titles = jsNames.select{|n|n.identifier=='title'}
|
150
|
+
assert_equal 4,ts.count
|
151
|
+
assert_equal [5,5,6,6],ts.map{|n| n.source.position(:absolute).begin_line}
|
152
|
+
assert_equal 1,types.count
|
153
|
+
assert_equal [5],types.map{|n| n.source.position(:absolute).begin_line}
|
154
|
+
assert_equal 2,ids.count
|
155
|
+
assert_equal [5,6],ids.map{|n| n.source.position(:absolute).begin_line}
|
156
|
+
assert_equal 2,typess.count
|
157
|
+
assert_equal [5,10],typess.map{|n| n.source.position(:absolute).begin_line}
|
158
|
+
assert_equal 1,titles.count
|
159
|
+
assert_equal [6],titles.map{|n| n.source.position(:absolute).begin_line}
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_double_elements_in_html_attribute_are_parsed
|
163
|
+
code = '<html><sliding-puzzle api="puzzle.api" size="{{puzzle.rows}}x{{puzzle.cols}}" src="{{puzzle.src}}"></sliding-puzzle></html>'
|
164
|
+
r = AngularJs.parser_considering_angular_embedded_code.parse_code(code)
|
165
|
+
jsNames = r.all_children_deep(:also_foreign).select{|n|n.class==CodeModels::Js::Name}
|
166
|
+
assert_not_nil jsNames.find{|n| n.identifier=='rows'}
|
167
|
+
assert_not_nil jsNames.find{|n| n.identifier=='cols'}
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
metadata
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: codemodels-html
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: java
|
6
|
+
authors:
|
7
|
+
- Federico Tomassetti
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: codemodels
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
requirement: !ruby/object:Gem::Requirement
|
21
|
+
requirements:
|
22
|
+
- - '>='
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: '0'
|
25
|
+
prerelease: false
|
26
|
+
type: :runtime
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: codemodels-js
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
prerelease: false
|
40
|
+
type: :runtime
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rgen
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
prerelease: false
|
54
|
+
type: :runtime
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.3'
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ~>
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '1.3'
|
67
|
+
prerelease: false
|
68
|
+
type: :development
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
requirement: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - '>='
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
prerelease: false
|
82
|
+
type: :development
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: simplecov
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
requirement: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
prerelease: false
|
96
|
+
type: :development
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubygems-tasks
|
99
|
+
version_requirements: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
requirement: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
prerelease: false
|
110
|
+
type: :development
|
111
|
+
description: CodeModels for HTML
|
112
|
+
email:
|
113
|
+
- f.tomassetti@gmail.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- .gitignore
|
119
|
+
- Gemfile
|
120
|
+
- LICENSE
|
121
|
+
- README.md
|
122
|
+
- Rakefile
|
123
|
+
- codemodels-html.gemspec
|
124
|
+
- lib/codemodels/html.rb
|
125
|
+
- lib/codemodels/html/angular_embedding_rules.rb
|
126
|
+
- lib/codemodels/html/language.rb
|
127
|
+
- lib/codemodels/html/metamodel.rb
|
128
|
+
- lib/codemodels/html/model_building.rb
|
129
|
+
- lib/codemodels/html/monkey_patching.rb
|
130
|
+
- lib/codemodels/html/parser.rb
|
131
|
+
- lib/codemodels/html/version.rb
|
132
|
+
- lib/jars/jericho-html-3.3.jar
|
133
|
+
- test/data/puzzle.html
|
134
|
+
- test/test_basic_info.rb
|
135
|
+
- test/test_basic_parsing.rb
|
136
|
+
- test/test_helper.rb
|
137
|
+
- test/test_info_extraction.rb
|
138
|
+
- test/test_monkey_patching.rb
|
139
|
+
- test/test_parsing_embedded_languages.rb
|
140
|
+
- test/test_parsing_puzzle.rb
|
141
|
+
homepage: https://github.com/ftomassetti/codemodels-html
|
142
|
+
licenses:
|
143
|
+
- Apache License 2
|
144
|
+
metadata: {}
|
145
|
+
post_install_message:
|
146
|
+
rdoc_options: []
|
147
|
+
require_paths:
|
148
|
+
- lib
|
149
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - '>='
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - '>='
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
requirements: []
|
160
|
+
rubyforge_project:
|
161
|
+
rubygems_version: 2.2.0
|
162
|
+
signing_key:
|
163
|
+
specification_version: 4
|
164
|
+
summary: CodeModels for HTML
|
165
|
+
test_files:
|
166
|
+
- test/data/puzzle.html
|
167
|
+
- test/test_basic_info.rb
|
168
|
+
- test/test_basic_parsing.rb
|
169
|
+
- test/test_helper.rb
|
170
|
+
- test/test_info_extraction.rb
|
171
|
+
- test/test_monkey_patching.rb
|
172
|
+
- test/test_parsing_embedded_languages.rb
|
173
|
+
- test/test_parsing_puzzle.rb
|