appmodel 0.1.0.1.pre → 0.1.1

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 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