marta 0.34054 → 0.35324

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: ebb01908a10c9def323e9ccfb970987b4486be8d
4
- data.tar.gz: 5d21e110d4e26c82d70c8bc6196a338dd6ae7350
3
+ metadata.gz: 61bcb2398f0d8990eae955226b5b40f1eb9e41d9
4
+ data.tar.gz: ee3b776091c0e869eb46a1df7b4d4031c5006674
5
5
  SHA512:
6
- metadata.gz: 201a5d76be951f6d680701686a954cb3ee0001ace4cf051acec597ef25ec936e1df143ff9c4ba53d8486a9ef79200f0ccf9ce5af4c91a61def61c991ce2e4c74
7
- data.tar.gz: d710edc5c7ac865860ab9e8f4d68ae71c51f39d793ac13401e3257867cbe50312b4684ced457c9fd624b92b5bbe07358c135b07e4366be22b53c43918c5d30c0
6
+ metadata.gz: 7b97670a0d556afe54da7c2b4ce0510ab405ba555e9e91200edc6f28de0e32249c2a0dea3bbca80ce29e1a40d9d504ddfc8a5fd677ac84fa2796f2a2cad720cd
7
+ data.tar.gz: 40bb826d1758ec5ccdea71c801fe68e798a61c46e60fd538dcd87ba4b27f8f687c8015ebb26afad395e68f35e79568e3d0d527163ac20e5919a2e8f62c89fd98
data/README.md CHANGED
@@ -276,7 +276,7 @@ g_page.search "I am in love with selenium."
276
276
 
277
277
  **Q: What else?**
278
278
 
279
- *A: Nothing. Marta is under development. Her version is 0.34054 only. And I am not a professional developer. But I am training her on new tricks.*
279
+ *A: Nothing. Marta is under development. Her version is 0.35324. All the necessary features are working already but there are tons of things that should be done. And I am not a professional developer.*
280
280
 
281
281
  ## Internal Design
282
282
 
@@ -11,6 +11,7 @@ require 'marta/json_2_class'
11
11
  require 'marta/black_magic'
12
12
  require 'marta/simple_element_finder'
13
13
  require 'marta/x_path'
14
+ require 'marta/page_arithmetic'
14
15
  require "watir"
15
16
  require 'fileutils'
16
17
  require 'json'
@@ -30,7 +31,7 @@ module Marta
30
31
 
31
32
  include BlackMagic, XPath, SimpleElementFinder, ClassesCreation,
32
33
  PublicMethods, Dialogs, Injector, Lightning, OptionsAndPaths,
33
- Json2Class, ReadWrite, UserValuePrework
34
+ Json2Class, ReadWrite, UserValuePrework, PageArithmetic
34
35
 
35
36
  # open_page can create new instance
36
37
  def self.open_page(*args)
@@ -3,12 +3,22 @@ document.marta_result = {};
3
3
  document.marta_confirm_mark = false;
4
4
  document.marta_test_xx = 0;
5
5
  document.marta_test_yy = 0;
6
+ document.marta_shift = false;
6
7
 
7
8
  document.getElementById("marta_confirm").onclick = function() {document.marta_end_loop()};
8
9
  document.getElementById("marta_set_by_hand").onclick = function() {document.marta_set_by_hand()};
9
10
  document.getElementById("marta_show_html").onclick = function() {document.marta_show_html()};
10
11
  document.getElementById("marta_hide").onclick = function() {document.marta_hide()};
11
12
  document.getElementById("marta_stop").onclick = function() {document.marta_stop()};
13
+ document.getElementById("marta_array").onclick = function() {document.marta_array_switch()};
14
+
15
+ document.marta_array_switch = function(){
16
+ if (document.getElementById("marta_array").checked) {
17
+ document.getElementById("marta_hint").innerHTML = "<p>You are selecting a collection. Select two elements of a kind</p><p>And marta will automatically find all the similar elements</p><p>If Marta found too many elements exclude the wrong element by click on it with Shift</p><p>Note: Marta will return Watir::HTMLElementCollection</p>";
18
+ } else {
19
+ document.getElementById("marta_hint").innerHTML = "<p>You are selecting a single element.</p><p>Remember Marta will perform .to_subtype for it automatically</p>";
20
+ };
21
+ };
12
22
 
13
23
  document.marta_stop = function() {
14
24
  if (document.getElementById("marta_magic_div").getAttribute("martastyle") == "off"){
@@ -26,7 +36,8 @@ document.marta_magic_click = function(e) {
26
36
  if (document.marta_test_xx == 0) {var xx = e.clientX} else {var xx = document.marta_test_xx};
27
37
  if (document.marta_test_yy == 0) {var yy = e.clientY} else {var yy = document.marta_test_yy};
28
38
  document.getElementById("marta_magic_div").setAttribute("martastyle", "off");
29
- document.marta_click_work(document.elementFromPoint(xx, yy));
39
+ var is_shift = e.shiftKey||document.marta_shift;
40
+ document.marta_click_work(document.elementFromPoint(xx, yy), is_shift);
30
41
  document.getElementById("marta_magic_div").setAttribute("martastyle", "at_large");
31
42
  };
32
43
 
@@ -56,7 +67,12 @@ document.marta_add_field = function(title, what, key, marker) {
56
67
  var headerDiv = document.marta_create_element(divtest, "div", {"martaclass": "marta_smthing", "class": "label", "id": "marta_title"+document.marta_room}, "ATTR");
57
68
  var contentDiv = document.marta_create_element(divtest, "div", {"martaclass": "marta_smthing", "martastyle": "field_line", "class": "content", "id": "marta_staff"+document.marta_room}, "");
58
69
  var nameField = document.marta_create_element(contentDiv, "input", {"martaclass": "marta_smthing", "martastyle": "name_field", "class": "marta_s_name_field", "type": "text", "disabled": "disabled;", "id": "marta_name"+document.marta_room, "value": ""}, "");
59
- var valueField = document.marta_create_element(contentDiv, "input", {"martaclass": "marta_smthing", "martastyle": "value_field", "type": "text", "id": "marta_default_value"+document.marta_room, "value": ""}, "");
70
+ var valueStyle = "value_field";
71
+ if (title.indexOf("not_") == 0) {
72
+ var isNot = document.marta_create_element(contentDiv, "input", {"martaclass": "marta_smthing", "martastyle": "not_field", "class": "marta_s_not_field", "type": "text", "disabled": "disabled;", "value": " IS NOT "}, "");
73
+ valueStyle = "not_value_field";
74
+ };
75
+ var valueField = document.marta_create_element(contentDiv, "input", {"martaclass": "marta_smthing", "martastyle": valueStyle, "type": "text", "id": "marta_default_value"+document.marta_room, "value": ""}, "");
60
76
  var cancelButton = document.marta_create_element(contentDiv, "input", {"martaclass": "marta_smthing", "martaroom": document.marta_room, "martastyle": "cancel_button", "type": "button", "id": "delete_marta_value"+document.marta_room, "value": "Delete"}, "");
61
77
  document.getElementById("marta_title"+document.marta_room ).innerHTML = title;
62
78
  document.getElementById("marta_name"+document.marta_room ).value = what;
@@ -136,11 +152,15 @@ document.marta_add_data = function() {
136
152
  for (var key in document.old_marta_Data[what]){
137
153
  if (/class/.test(key) == true){
138
154
  for (var k = 0, length = document.old_marta_Data[what][key].length; k < length; k++){
139
- document.marta_add_field(what, key, document.old_marta_Data[what][key][k], k);
155
+ if ((document.old_marta_Data[what][key][k] != "") && (document.old_marta_Data[what][key][k] != null)){
156
+ document.marta_add_field(what, key, document.old_marta_Data[what][key][k], k);
157
+ };
140
158
  };
141
159
  }else
142
160
  {
143
- document.marta_add_field(what, key, document.old_marta_Data[what][key], "-1");
161
+ if ((document.old_marta_Data[what][key] != "") && (document.old_marta_Data[what][key] != null)){
162
+ document.marta_add_field(what, key, document.old_marta_Data[what][key], "-1");
163
+ };
144
164
  };
145
165
  };
146
166
  };
@@ -153,13 +173,13 @@ document.marta_show_html = function() {
153
173
  area.innerHTML = document.spaninize(document.documentElement.innerHTML);
154
174
  };
155
175
 
156
- document.marta_touch = function(element) {
176
+ document.marta_touch = function(element, shift) {
157
177
  var control = element.textContent.replace(/</g,"&lt;").replace(/>/g,"&gt;");
158
178
  var everything = document.getElementsByTagName("*");
159
179
  for (var i=0, max=everything.length; i < max; i++) {
160
180
  var check = everything[i].outerHTML.replace(/</g,"&lt;").replace(/>/g,"&gt;");
161
181
  if (check == control) {
162
- document.marta_click_work(everything[i]);
182
+ document.marta_click_work(everything[i], shift);
163
183
  };
164
184
  };
165
185
  };
@@ -197,23 +217,32 @@ document.spaninize = function(string) {
197
217
  document.pretouch = function(e) {
198
218
  if (e.target !== e.currentTarget) {
199
219
  var clickedItem = e.target;
200
- document.marta_touch(clickedItem);
220
+ document.marta_touch(clickedItem, e.shiftKey);
201
221
  };
202
222
  };
203
223
 
204
- document.marta_click_work = function(target) {
224
+ document.marta_click_work = function(target, shift) {
205
225
  var marta_smthing = target.getAttribute("martaclass")=="marta_smthing";
206
226
  if(!marta_smthing){
227
+ if (shift) {
228
+ var self = "not_self";
229
+ var pappy = "not_pappy";
230
+ var granny = "not_granny";
231
+ } else {
232
+ var self = "self";
233
+ var pappy = "pappy";
234
+ var granny = "granny";
235
+ };
207
236
  document.getElementById("attr_fields").innerHTML="";
208
237
  document.marta_room = 0;
209
238
  document.marta_result = {};
210
239
  document.marta_result["options"] = {};
211
- document.marta_after_click(target,"self");
240
+ document.marta_after_click(target, self);
212
241
  if (!!target.parentElement){
213
- document.marta_after_click(target.parentElement,"pappy");
242
+ document.marta_after_click(target.parentElement, pappy);
214
243
  };
215
244
  if (!!target.parentElement.parentElement){
216
- document.marta_after_click(target.parentElement.parentElement,"granny");
245
+ document.marta_after_click(target.parentElement.parentElement, granny);
217
246
  };
218
247
  document.marta_confirm();
219
248
  };
@@ -238,7 +267,7 @@ document.marta_after_click = function(el, what) {
238
267
  };
239
268
  };
240
269
  };
241
- if (what == "self"){
270
+ if ((what == "self")||(what == "not_self")){
242
271
  try{
243
272
  document.marta_result[what]["retrieved_by_marta_text"]=el.firstChild.nodeValue;
244
273
  }catch(e){};
@@ -330,6 +330,16 @@ input[martastyle=name_field]:disabled, input[martastyle=value_field]:disabled{
330
330
  background: linear-gradient(to right, lightgrey , white);
331
331
  }
332
332
 
333
+ input[type=text][martastyle=not_value_field] {
334
+ width: 40%;
335
+ }
336
+
337
+ input[type=text][martastyle=not_field] {
338
+ width: 10%;
339
+ color:red;
340
+ background-color: darkblue;
341
+ }
342
+
333
343
  input[martaclass=marta_smthing][type=checkbox] {
334
344
  -webkit-appearance: none;
335
345
  background-color: white;
@@ -3,6 +3,7 @@ require 'marta/x_path'
3
3
  require 'marta/lightning'
4
4
  require 'marta/injector'
5
5
  require 'marta/public_methods'
6
+ require 'marta/page_arithmetic'
6
7
 
7
8
  module Marta
8
9
 
@@ -21,7 +22,8 @@ module Marta
21
22
  # @note It is believed that no user will use it
22
23
  class MethodSpeaker
23
24
 
24
- include XPath, Lightning, Injector, PublicMethods, SimpleElementFinder
25
+ include XPath, Lightning, Injector, PublicMethods, SimpleElementFinder,
26
+ PageArithmetic
25
27
 
26
28
  def initialize(method_name, requestor)
27
29
  @class_name = requestor.class_name
@@ -58,7 +60,7 @@ module Marta
58
60
  @result = ask_for_elements
59
61
  mass_highlight_turn(@mass, false)
60
62
  if @result.class == Hash
61
- @attrs = @result
63
+ attrs_plus_result
62
64
  elsif @result != '1'
63
65
  xpath_way
64
66
  end
@@ -70,6 +72,25 @@ module Marta
70
72
  end
71
73
  end
72
74
 
75
+ #
76
+ # This method is responsible for collection in two clicks feature
77
+ #
78
+ # If we have two elements of collection this methods returns hash of
79
+ # element without diffs (only the same attributes). As well this method
80
+ # is responsible for adding excluding attributes to collection.
81
+ # Rare case with single element that not has some attribute is not
82
+ # implemented so far. All that party is for collections now.
83
+ def attrs_plus_result
84
+ if !attrs_exists?
85
+ @attrs = @result
86
+ elsif !@attrs['options']['collection'] or
87
+ !@result['options']['collection']
88
+ @attrs = @result
89
+ else
90
+ @attrs = make_collection(@attrs, @result)
91
+ end
92
+ end
93
+
73
94
  # Asking: "What are you looking for?"
74
95
  def ask_for_elements
75
96
  ask 'element', "Found #{@found} elements for #{@title}", @attrs
@@ -7,14 +7,24 @@ module Marta
7
7
 
8
8
  # We can highlight an element
9
9
  def highlight(element)
10
- engine.execute_script("arguments[0].setAttribute"\
10
+ if is_here?(element)
11
+ engine.execute_script("arguments[0].setAttribute"\
11
12
  "('martaclass','foundbymarta')", element)
13
+ end
12
14
  end
13
15
 
14
16
  # We can unhighlight an element
15
17
  def unhighlight(element)
16
- engine.execute_script("arguments[0].removeAttribute('martaclass')",
17
- element)
18
+ if is_here?(element)
19
+ engine.execute_script("arguments[0].removeAttribute('martaclass')",
20
+ element)
21
+ end
22
+ end
23
+
24
+ def is_here?(element)
25
+ element.exists?
26
+ rescue
27
+ false
18
28
  end
19
29
 
20
30
  # We can highlight\unhighlight tons of elements at once
@@ -0,0 +1,147 @@
1
+ module Marta
2
+
3
+ #
4
+ # This is for merging of Smartpages and elements.
5
+ #
6
+ # There is a need too form a right collection out of two elements
7
+ # Page merging will live here as well.
8
+ module PageArithmetic
9
+
10
+ private
11
+
12
+ #
13
+ # This class is used to merge hashes of elements\methods
14
+ #
15
+ # @note It is believed that no user will use it
16
+ # Now it has only one way to merge hashes
17
+ # This method is getting common only of two methods in order to generate a
18
+ # correct hash for collection element. Methods of the class are pretty
19
+ # esoteric. Refactoring is a must here.
20
+ class MethodMerger
21
+
22
+ # Class is taking two hashes. Sometimes order is valuable
23
+ def initialize(main_hash, second_hash)
24
+ @main_hash = main_hash
25
+ @second_hash = second_hash
26
+ end
27
+
28
+ POSITIVE = ['self', 'pappy', 'granny']
29
+ NEGATIVE = ['not_self', 'not_pappy', 'not_granny']
30
+
31
+ # Main method for adding two elements into a large-wide collection
32
+ def do_collection
33
+ result = Hash.new
34
+ result['options'] = options_merge
35
+ NEGATIVE.each do |key|
36
+ result[key] = all_of key
37
+ end
38
+ POSITIVE.each do |key|
39
+ result[key], result["not_#{key}"] =
40
+ passive_exclude(common_of(key), result["not_#{key}"])
41
+ end
42
+ result
43
+ end
44
+
45
+ # The most esoteric part of merging elements into collection
46
+ # Now we are loosing nots tags if they are not good for us
47
+ # As well we are loosing positive tags by merging them into alltags
48
+ # symbol == *. The way out is to use arrays for tags.
49
+ def options_merge
50
+ temp = Hash.new
51
+ temp['collection'] = @main_hash['options']['collection']
52
+ POSITIVE.each do |key|
53
+ value = @main_hash['options'][key]
54
+ main_negative = @main_hash['options']["not_#{key}"]
55
+ second_negative = @second_hash['options']["not_#{key}"]
56
+ if (@second_hash['options'][key] == value) or
57
+ ((@second_hash['options'][key].nil?) and (!value.nil?))
58
+ temp[key] = value
59
+ else
60
+ temp[key] = "*"
61
+ end
62
+ if (second_negative != temp[key]) and
63
+ ((second_negative == main_negative) or
64
+ (main_negative.nil?))
65
+ temp["not_#{key}"] = second_negative
66
+ end
67
+ end
68
+ temp
69
+ end
70
+
71
+ # This method will leave only common elements of both hashes
72
+ def common_of(what)
73
+ temp = Hash.new
74
+ first, second = @main_hash[what], @second_hash[what]
75
+ if !first.nil? and !second.nil?
76
+ first.each_pair do |key, value|
77
+ if second[key] == value
78
+ temp[key] = value
79
+ elsif second[key].class == Array and value.class == Array
80
+ temp[key] = value & second[key]
81
+ end
82
+ end
83
+ else
84
+ temp = first
85
+ end
86
+ temp
87
+ end
88
+
89
+ # This method will leave all the elements of hashes. But if one attribute
90
+ # is presented in both. Method will use the one from the main.
91
+ # When it will be possible to use arrays for tags and attributes this
92
+ # logic will be changed
93
+ def all_of(what)
94
+ temp = Hash.new
95
+ first, second = @main_hash[what], @second_hash[what]
96
+ if !first.nil?
97
+ temp = first
98
+ end
99
+ if !second.nil? and !temp.nil?
100
+ second.each_pair do |key, value|
101
+ if (temp[key].nil?) or ((temp[key] != value) and
102
+ (temp[key].class != Array) and (value.class != Array))
103
+ temp[key] = value
104
+ elsif (temp[key].class == Array) and (value.class == Array)
105
+ temp[key] = (value + temp[key]).uniq
106
+ end
107
+ end
108
+ if !first.nil?
109
+ first.each_pair do |key, value|
110
+ if second[key].nil? and !value.nil?
111
+ temp[key] = nil
112
+ end
113
+ end
114
+ end
115
+ else
116
+ temp = second
117
+ end
118
+ temp
119
+ end
120
+
121
+ # That is about excluding only attributes that are not presented as
122
+ # positives.
123
+ def passive_exclude(main, passive)
124
+ temp = main
125
+ not_temp = passive
126
+ if !passive.nil?
127
+ passive.each_pair do |key, value|
128
+ if !main[key].nil?
129
+ if main[key] == value
130
+ not_temp[key] = value.class == Array ? []:nil
131
+ elsif (value.class == Array) and (main[key].class == Array)
132
+ not_temp[key] = value - main[key]
133
+ end
134
+ end
135
+ end
136
+ end
137
+ return temp, not_temp
138
+ end
139
+ end
140
+
141
+ # Form collection out of two element hashes
142
+ def make_collection(one, two)
143
+ merger = MethodMerger.new(one, two)
144
+ merger.do_collection
145
+ end
146
+ end
147
+ end
@@ -16,7 +16,7 @@ module Marta
16
16
  def self.file_write(name, data)
17
17
  file_name = File.join(SettingMaster.pageobjects_folder, name + '.json')
18
18
  File.open(file_name,"w") do |f|
19
- f.write(data.to_json)
19
+ f.write(JSON.pretty_generate(data))
20
20
  end
21
21
  file_name
22
22
  end
@@ -56,7 +56,11 @@ module Marta
56
56
 
57
57
  # Transforming an element to a subtype
58
58
  def subtype_of(element)
59
- @engine.element(xpath: @xpath).to_subtype
59
+ if @engine.element(xpath: @xpath).exists?
60
+ @engine.element(xpath: @xpath).to_subtype
61
+ else
62
+ @engine.element(xpath: @xpath)
63
+ end
60
64
  end
61
65
 
62
66
  # Main logic. We are returning a prefinded collection
@@ -1,4 +1,4 @@
1
1
  module Marta
2
- VERSION = "0.34054"
2
+ VERSION = "0.35324"
3
3
  NAME = "marta"
4
4
  end
@@ -8,7 +8,7 @@ module Marta
8
8
  private
9
9
 
10
10
  #
11
- # Here we are crating xpath including arrays of xpaths with one-two-...-x
11
+ # Here we are creating xpath including arrays of xpaths with one-two-...-x
12
12
  # parts that are not known
13
13
  #
14
14
  # @note It is believed that no user will use it
@@ -34,7 +34,10 @@ module Marta
34
34
  # Getting a part (by data or empty=any)
35
35
  def get_xpaths(todo, what)
36
36
  if todo
37
- form_array_hash(@meth['options'][what], @meth[what])
37
+ result = form_array_hash(@meth['options'][what], @meth[what])
38
+ result = result + form_array_hash(@meth['options']['not_' + what],
39
+ @meth['not_' + what], true)
40
+ result
38
41
  else
39
42
  [make_hash("//", "//"), make_hash("*", "*")]
40
43
  end
@@ -118,44 +121,61 @@ module Marta
118
121
  end
119
122
 
120
123
  # Creating a small part of array hash for tag
121
- def form_array_hash_for_tag(tag)
124
+ def form_array_hash_for_tag(tag, negative)
122
125
  result_array = Array.new
123
- result_array.push make_hash("/", "//")
124
- result_array.push make_hash(tag, "*")
126
+ if negative
127
+ if !tag.nil? and tag != ""
128
+ result_array.push make_hash("[not(self::#{tag})]", "")
129
+ end
130
+ else
131
+ result_array.push make_hash("/", "//")
132
+ result_array.push make_hash(tag, "*")
133
+ end
125
134
  result_array
126
135
  end
127
136
 
128
137
  # Creating an array hash
129
- def form_array_hash(tag, attrs)
130
- result_array = form_array_hash_for_tag(tag)
131
- attrs.each_pair do |attribute, value|
132
- if attribute.include?('class')
133
- result_array = result_array +
134
- form_array_hash_for_class(attribute, value)
135
- else
136
- result_array.push form_hash_for_attribute(attribute, value)
138
+ def form_array_hash(tag, attrs, negative = false)
139
+ result_array = form_array_hash_for_tag(tag, negative)
140
+ if !attrs.nil?
141
+ attrs.each_pair do |attribute, value|
142
+ if attribute.include?('class')
143
+ result_array = result_array +
144
+ form_array_hash_for_class(attribute, value, negative)
145
+ else
146
+ if !value.nil? and value != ""
147
+ result_array.push form_hash_for_attribute(attribute,
148
+ value,
149
+ negative)
150
+ end
151
+ end
137
152
  end
138
153
  end
139
154
  result_array
140
155
  end
141
156
 
142
157
  # Creating a small part of array hash for attribute
143
- def form_hash_for_attribute(attribute, value)
144
- result_array = Array.new
145
- if attribute == 'retrieved_by_marta_text'
146
- make_hash("[contains(text(),'#{value}')]", "")
158
+ def form_hash_for_attribute(attribute, value, negative)
159
+ not_start, not_end = get_nots_frames(negative)
160
+ if (attribute == 'retrieved_by_marta_text')
161
+ make_hash("[#{not_start}contains(text(),'#{value}')#{not_end}]", "")
147
162
  else
148
- make_hash("[@#{attribute}='#{value}']", "")
163
+ make_hash("[#{not_start}@#{attribute}='#{value}'#{not_end}]", "")
149
164
  end
150
165
  end
151
166
 
167
+ def get_nots_frames (negative)
168
+ return negative ? ["not(", ")"] : ["", ""]
169
+ end
170
+
152
171
  # Creating a small part of array hash for attribute contains 'class'
153
- def form_array_hash_for_class(attribute, value)
172
+ def form_array_hash_for_class(attribute, value, negative)
154
173
  result_array = Array.new
174
+ not_start, not_end = get_nots_frames(negative)
155
175
  value.each do |value_part|
156
176
  if value_part.gsub(' ','') != ''
157
- result_array.push make_hash("[contains(@#{attribute},"\
158
- "'#{value_part}')]", "")
177
+ result_array.push make_hash("[#{not_start}contains(@#{attribute},"\
178
+ "'#{value_part}')#{not_end}]", "")
159
179
  end
160
180
  end
161
181
  result_array
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = "https://github.com/sseleznevqa/marta"
15
15
  spec.license = "MIT"
16
16
 
17
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } + Dir.glob("lib/marta/data/*")
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|readme_files)/}) } + Dir.glob("lib/marta/data/*")
18
18
  spec.bindir = "exe"
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marta
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.34054'
4
+ version: '0.35324'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergei Seleznev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-09-12 00:00:00.000000000 Z
11
+ date: 2017-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -136,6 +136,7 @@ files:
136
136
  - lib/marta/json_2_class.rb
137
137
  - lib/marta/lightning.rb
138
138
  - lib/marta/options_and_paths.rb
139
+ - lib/marta/page_arithmetic.rb
139
140
  - lib/marta/public_methods.rb
140
141
  - lib/marta/read_write.rb
141
142
  - lib/marta/simple_element_finder.rb
@@ -143,14 +144,6 @@ files:
143
144
  - lib/marta/version.rb
144
145
  - lib/marta/x_path.rb
145
146
  - marta.gemspec
146
- - readme_files/456steps.png
147
- - readme_files/8step.png
148
- - readme_files/hide.png
149
- - readme_files/html.png
150
- - readme_files/itemprop.png
151
- - readme_files/itemprop2.png
152
- - readme_files/stop.png
153
- - readme_files/xpath.png
154
147
  homepage: https://github.com/sseleznevqa/marta
155
148
  licenses:
156
149
  - MIT
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file