appmodel 0.1.0.1.pre → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5f2a3bc45bf5eef91f0fd0626a8215516006e372
4
- data.tar.gz: 2f9487919418045f43d9b128f5fac4bfbdc9d6fa
3
+ metadata.gz: 41efe743b89aa154adcefdb0c23bd0363d488f2a
4
+ data.tar.gz: f01726521d2eb27b3a959369f9c87245f86ddc50
5
5
  SHA512:
6
- metadata.gz: 0b3223f17a2f182de27cf7c3bf2e67a5171838dc718d4f7ad42970ddbfb6ccda47676c9b573708803cb59a068f28ee13d8e24001da9da71b8fe71d40c744de43
7
- data.tar.gz: dd153a2b920317100a036b518642bf201c93c98a0719fca4cc46c5b47d7aebb5c51866b33192e2653f8bdb200eab42fed1f1ae6b16eac5b5e5f13a1256efef18
6
+ metadata.gz: 85a79431825b09e89f4ab2479d6773254982fd15a8edf97db08f19657f6ecf98089927ec96e8e6df513bebf66bc620c220414b523011a51630ec40ef4cc2b52c
7
+ data.tar.gz: d0e7e8a9385838606cee347a62ffcf3d64c4853a4ef1e264b31ec6376f9ba4951bed5ceb91a8983438d1ca88e0381d817de366ee8b2913371aeb653e17469fd7
data/appmodel.gemspec CHANGED
@@ -30,4 +30,5 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency "bundler", "~> 1.11"
31
31
  spec.add_development_dependency "rake", "~> 10.0"
32
32
  spec.add_development_dependency "rspec", "~> 3.0"
33
+ spec.add_development_dependency "logging"
33
34
  end
@@ -0,0 +1,397 @@
1
+ require 'json'
2
+ require 'logging'
3
+
4
+ module Appmodel
5
+
6
+ class Model
7
+ attr_accessor :_file
8
+ attr_accessor :app_model
9
+
10
+ def initialize(f=nil)
11
+
12
+ @logger = Logging.logger(STDOUT)
13
+ @logger.level = :warn
14
+
15
+ unless f.nil?
16
+ @_file=f
17
+ loadPages(@_file)
18
+ end
19
+ end
20
+
21
+ def self.toBy(_target, appModel=nil)
22
+ _by=:xpath
23
+ _with = nil
24
+ _locator = !_target.nil? ? _target.clone : nil
25
+
26
+ if Appmodel::Model.isPageObject?(_locator) && !appModel.nil?
27
+ _pg = appModel.getPageElement(_locator)
28
+ if !_pg.nil?
29
+ _locator = _pg['locator']
30
+ else
31
+ _locator=nil
32
+ end
33
+ end
34
+
35
+ if _locator.is_a?(String)
36
+ if _locator.match(/^\s*css\s*=/)
37
+ _with = _locator.match(/^\s*css\s*=(.*)\s*$/)[1]
38
+ seleniumLocator = { :css => _with }
39
+ elsif _locator.match(/^\s*\//)
40
+ seleniumLocator = { :xpath => _locator }
41
+ elsif _locator.match(/^\s*\.\//)
42
+ seleniumLocator = { :xpath => _locator }
43
+ end
44
+ end
45
+
46
+ seleniumLocator
47
+ end
48
+
49
+ # _a : frame(xyz).frame(123), <locator>
50
+ def self.parseLocator(_locator)
51
+ hit=nil
52
+
53
+ if _locator.is_a?(String)
54
+
55
+ rc=_locator.match(/^\s*([([fF]rame\([^\(]*?\)\.)]*)\.([lL]ocator\((.*)\))\s*$/)
56
+
57
+ if rc
58
+ hit = { 'frame' => rc[1], 'locator' => rc[3] }
59
+ elsif _locator.match(/^\s*[lL]ocator\((.*)\)\s*$/)
60
+ hit = { 'locator' => _locator.match(/^\s*[lL]ocator\((.*)\)\s*$/)[1] }
61
+ else
62
+ rc=_locator.match(/^\s*([([fF]rame\([^\(]*?\)\.)]*)\.([lL]ocator\((.*)\))\s*$/)
63
+
64
+ if rc
65
+ hit = { 'frame' => rc[1], 'locator' => rc[2]}
66
+ end
67
+ end
68
+
69
+ elsif _locator.is_a?(Hash) && _locator.has_key?('locator')
70
+ hit = { 'locator' => _locator['locator']}
71
+ if _locator.has_key?('frame')
72
+ hit['frame'] = _locator['frame']
73
+ end
74
+ end
75
+
76
+ hit
77
+
78
+ end
79
+
80
+
81
+ def self.isPageObject?(_locator)
82
+ rc = false
83
+ if _locator.is_a?(String)
84
+ if _locator.match(/^\s*page\s*\(\s*[\w\d_\-]+\s*\)/i)
85
+ rc=true
86
+ elsif _locator.match(/^\s*frame\(.*\)\.locator\(.*\)\s*$/)
87
+ rc=true
88
+ end
89
+
90
+ elsif _locator.is_a?(Hash)
91
+ rc = _locator.has_key?('locator') || _locator.has_key?(:locator)
92
+ end
93
+
94
+ rc
95
+ end
96
+
97
+
98
+
99
+ def getAppModel()
100
+ @app_model
101
+ end
102
+
103
+ def loadPages(jlist)
104
+
105
+ json_list=[]
106
+ if jlist.kind_of?(String)
107
+ json_list << jlist
108
+ else
109
+ json_list=jlist
110
+ end
111
+
112
+ jsonData={}
113
+ json_list.each { |f|
114
+ @logger.debug __FILE__ + (__LINE__).to_s + " JSON.parse(#{f})"
115
+
116
+ begin
117
+ data_hash = JSON.parse File.read(f)
118
+ jsonData.merge!(data_hash)
119
+ rescue JSON::ParserError
120
+ @logger.fatal "raise JSON::ParseError - #{f.to_s}"
121
+ raise "JSONLoadError"
122
+ end
123
+
124
+ }
125
+ @logger.debug "merged jsonData => " + jsonData.to_json
126
+ @app_model = jsonData
127
+ end
128
+
129
+
130
+ # getPageElement("page(login).get(login_form).get(button)")
131
+ def getPageElement(s)
132
+ @logger.debug __FILE__ + (__LINE__).to_s + " getPageElement(#{s})"
133
+
134
+ if s.match(/^\s*\//) || s.match(/^\s*css\s*=/i) || s.match(/^\s*#/)
135
+ @logger.debug __FILE__ + (__LINE__).to_s + " getPageElement(#{s} return nil"
136
+ return nil
137
+ end
138
+
139
+ hit = @app_model
140
+
141
+ nodes = s.split(/\./)
142
+
143
+ if nodes
144
+ nodes.each { |elt|
145
+
146
+ @logger.debug __FILE__ + (__LINE__).to_s + " process #{elt}"
147
+ getter = elt.split(/\(/)[0]
148
+ _obj = elt.match(/\((.*)\)/)[1]
149
+
150
+ @logger.debug __FILE__ + (__LINE__).to_s + " getter : #{getter} obj: #{_obj}"
151
+
152
+ if getter.downcase.match(/(page|pg)/)
153
+ @logger.debug __FILE__ + (__LINE__).to_s + " -- process page --"
154
+ hit=@app_model[_obj]
155
+ elsif getter.downcase=='get'
156
+
157
+ if !hit.nil? && hit.has_key?(_obj)
158
+ hit=hit[_obj]
159
+
160
+ if hit.is_a?(String) && hit.match(/\s*(file)\((.*)\)/)
161
+ @logger.debug __FILE__ + (__LINE__).to_s + " LOAD Sub pageObject: #{hit}"
162
+ end
163
+
164
+ else
165
+ @logger.debug __FILE__ + (__LINE__).to_s + " Missing getter : #{_obj.to_s}"
166
+ return nil
167
+ end
168
+
169
+ else
170
+ @logger.debug __FILE__ + (__LINE__).to_s + " getter : #{getter} is unknown."
171
+ return nil
172
+ end
173
+ @logger.debug __FILE__ + (__LINE__).to_s + " HIT => #{hit}"
174
+ }
175
+ end
176
+
177
+
178
+ hit
179
+
180
+ end
181
+
182
+
183
+
184
+ # visible_when: hover(page(x).get(y).get(z))
185
+ def itemize(condition='visible_when', _action='hover', _pgObj=nil)
186
+ @results=hits(nil, @app_model, condition, _action, _pgObj)
187
+ @logger.debug "[itemize] => #{@results}"
188
+ @results
189
+ end
190
+
191
+
192
+ def hits(parent, h, condition, _action, pg)
193
+ # @logger.debug __FILE__ + (__LINE__).to_s + " collect_item_attributes(#{h})"
194
+ result = []
195
+
196
+ if h.is_a?(Hash)
197
+
198
+ h.each do |k, v|
199
+ @logger.debug __FILE__ + (__LINE__).to_s + " Key: #{k} => #{v}"
200
+ if k == condition
201
+ # h[k].each {|k, v| result[k] = v } # <= tweak here
202
+ if !v.is_a?(Array) && v.match(/^\s*#{_action}\s*\((.*)\)\s*$/i)
203
+
204
+ pageObject=v.match(/^\s*#{_action}\s*\((.*)\)\s*$/i)[1]
205
+
206
+ @logger.debug __FILE__ + (__LINE__).to_s + " <pg, pageObject> : <#{pg}, #{pageObject}>"
207
+
208
+ if pg.nil?
209
+ result << parent
210
+ elsif pg == pageObject
211
+ result << parent
212
+ end
213
+
214
+ elsif v.is_a?(Array)
215
+
216
+ v.each do |vh|
217
+ @logger.debug " =====> #{vh}"
218
+
219
+ if vh.is_a?(Hash) && vh.has_key?(condition) && vh[condition].match(/^\s*#{_action}\s*/i)
220
+
221
+ pageObject=vh[condition].match(/^\s*#{_action}\s*\((.*)\)\s*$/i)[1]
222
+
223
+
224
+ @logger.debug __FILE__ + (__LINE__).to_s + " matched on #{_action}, pg:#{pg}, #{pageObject}"
225
+
226
+ if pg.nil?
227
+ result << parent
228
+ elsif pg == pageObject
229
+ result << parent
230
+ end
231
+
232
+ end
233
+
234
+ end
235
+
236
+ end
237
+
238
+ elsif v.is_a? Hash
239
+ if parent.nil?
240
+ _rc = hits("page(#{k})", h[k], condition, _action, pg)
241
+ else
242
+ _rc = hits("#{parent}.get(#{k})", h[k], condition, _action, pg)
243
+ end
244
+
245
+
246
+ if !(_rc.nil? || _rc.empty?)
247
+ result << _rc
248
+ @logger.debug __FILE__ + (__LINE__).to_s + " ADDING #{k} : #{_rc}"
249
+ result.flatten!
250
+ end
251
+
252
+ end
253
+ end
254
+
255
+ end
256
+
257
+ result=nil if result.empty?
258
+ @logger.debug __FILE__ + (__LINE__).to_s + " result : #{result}"
259
+ result
260
+ end
261
+
262
+ def flattenPageObject(h, path="")
263
+ rc=iterate(h, path)
264
+ if rc.is_a?(Array)
265
+ return rc[0]
266
+ end
267
+
268
+ nil
269
+ end
270
+
271
+ def iterate(h, path="")
272
+ rc=true
273
+ assertions=[]
274
+
275
+ @logger.debug __FILE__ + (__LINE__).to_s + " ===== iterate(#{h}, #{path}) ====="
276
+
277
+ if h.is_a?(String)
278
+ @logger.debug __FILE__ + (__LINE__).to_s + " => process #{h}"
279
+ if h.match(/^\s*(page)\s*\(.*\)\s*$/i)
280
+ @logger.debug __FILE__ + (__LINE__).to_s + " => process Page #{h}"
281
+ page_elt = getPageElement(h)
282
+ @logger.debug __FILE__ + (__LINE__).to_s + " => #{page_elt}"
283
+ assertions << iterate(page_elt, path)
284
+ else
285
+ @logger.debug __FILE__ + (__LINE__).to_s + " UNKNOWN: #{h}"
286
+ assertions << "#{h} : unknown"
287
+ end
288
+
289
+ elsif h.is_a?(Hash) && h.has_key?('locator')
290
+
291
+ @logger.debug __FILE__ + (__LINE__).to_s + " == add #{h} =="
292
+ assertions << { :path => path, :data => h }
293
+
294
+ elsif h.is_a?(Hash)
295
+
296
+ @logger.debug __FILE__ + (__LINE__).to_s + "Keys.size: #{h.keys[0]}"
297
+
298
+ if h.keys.size==1 && h[h.keys[0]].is_a?(Hash) && h[h.keys[0]].has_key?('locator')
299
+
300
+ @logger.debug __FILE__ + (__LINE__).to_s + " add assertion #{h}"
301
+ assertions << { :path => path, :data => h }
302
+
303
+ elsif h.keys.size==1 && h[h.keys[0]].is_a?(Hash)
304
+
305
+ _id = h.keys[0]
306
+ @logger.debug __FILE__ + (__LINE__).to_s + " LocatorID : #{_id}"
307
+
308
+ if true
309
+ h[_id].each_pair { |_k, _h|
310
+
311
+ @logger.debug __FILE__ + (__LINE__).to_s + " | id(#{_id}) => #{_k}, #{_h}"
312
+
313
+ if _h.keys.size==1 && _h[_h.keys[0]].is_a?(Hash) && !_h[_h.keys[0]].has_key?('locator')
314
+ @logger.debug __FILE__ + (__LINE__).to_s + " id(#{_id}) => #{_h}"
315
+ _a = iterate(_h, "#{path}.#{_id}")
316
+ _a.each do |_e|
317
+ assertions << _e
318
+ end
319
+ elsif _h.keys.size==1 && _h[_h.keys[0]].is_a?(Hash) && _h[_h.keys[0]].has_key?('locator')
320
+ assertions << { :path => "#{path}.#{_id}", :data => h[_h.keys[0]] }
321
+ elsif _h.is_a?(Hash) && _h.has_key?('locator')
322
+ assertions << { :path => "#{path}.#{_id}.#{_k}", :data => _h }
323
+ else
324
+ @logger.debug __FILE__ + (__LINE__).to_s + " | id(#{path}.#{_id}.#{_k}) - #{_h}"
325
+
326
+ _h.each do |k, v|
327
+ # @logger.debug __FILE__ + (__LINE__).to_s + " processing #{_id}.#{k}, #{v}"
328
+ if v.is_a?(Hash) && v.has_key?('locator')
329
+ @logger.debug __FILE__ + (__LINE__).to_s + " processing #{_id}.#{_k}.#{k}"
330
+ elsif v.is_a?(Hash) || v.is_a?(Array)
331
+ @logger.debug __FILE__ + (__LINE__).to_s + " processing #{_id}.#{k} - #{v}"
332
+ _a = iterate(v, "#{path}.#{_id}.#{k}")
333
+ _a.each do |_e|
334
+ assertions << _e
335
+ end
336
+ else
337
+ puts("Assert => k is #{k}, value is #{v}")
338
+ # assertions << "#{k} #{v}"
339
+ rc=rc && true
340
+ end
341
+ end
342
+
343
+ @logger.debug __FILE__ + (__LINE__).to_s + " adding assertions id(#{_id}.#{_k}) - #{_h}"
344
+ assertions << "id(#{_id}.#{_k}) - #{_h}"
345
+ end
346
+
347
+ }
348
+ end
349
+
350
+ else
351
+
352
+ @logger.debug __FILE__ + (__LINE__).to_s + " ** process #{h} **"
353
+ _list=Array.new
354
+ h.each do |k, v|
355
+ if v.is_a?(Hash) && v.has_key?('locator')
356
+
357
+ @logger.debug __FILE__ + (__LINE__).to_s + " add to assertion #{k} => #{v}"
358
+ _list.push({ :path => "#{path}.get(#{k})", :dat => v })
359
+
360
+ @logger.debug " _list ==> #{_list}"
361
+ elsif v.is_a?(Hash) || v.is_a?(Array)
362
+
363
+ @logger.debug __FILE__ + (__LINE__).to_s + " >>>> #{k} => #{v} <<<<<"
364
+
365
+ _a = iterate(v, "#{path}.get(#{k})")
366
+ _a.each do |_e|
367
+ assertions << _e
368
+ end
369
+ else
370
+ @logger.debug(__FILE__ + (__LINE__).to_s + " k is #{k}, value is #{v}")
371
+ assertions << "#{k} #{v}"
372
+ end
373
+ end
374
+
375
+ # assertions << _list.flatten
376
+ if !_list.empty?
377
+ _list.each do |_e|
378
+ assertions << _e
379
+ end
380
+ end
381
+
382
+ end
383
+
384
+ else
385
+ @logger.debug __FILE__ + (__LINE__).to_s + " Huh?"
386
+ assertions << nil
387
+ end
388
+
389
+ @logger.debug __FILE__ + (__LINE__).to_s + " assertions => #{assertions}"
390
+ assertions
391
+
392
+ end
393
+
394
+ end
395
+
396
+ end
397
+
@@ -1,3 +1,3 @@
1
1
  module Appmodel
2
- VERSION = "0.1.0.1.pre"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appmodel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.1.pre
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - H20Dragon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-04-08 00:00:00.000000000 Z
11
+ date: 2017-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: logging
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: Simple, scalable pageObject design and modeling.
56
70
  email:
57
71
  - h20dragon@outlook.com
@@ -71,6 +85,7 @@ files:
71
85
  - bin/console
72
86
  - bin/setup
73
87
  - lib/appmodel.rb
88
+ - lib/appmodel/model/model.rb
74
89
  - lib/appmodel/version.rb
75
90
  homepage: http://github.com/h20dragon.
76
91
  licenses:
@@ -87,9 +102,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
87
102
  version: '0'
88
103
  required_rubygems_version: !ruby/object:Gem::Requirement
89
104
  requirements:
90
- - - ">"
105
+ - - ">="
91
106
  - !ruby/object:Gem::Version
92
- version: 1.3.1
107
+ version: '0'
93
108
  requirements: []
94
109
  rubyforge_project:
95
110
  rubygems_version: 2.6.2