mini_autobot 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +26 -0
  3. data/.rspec +2 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +3 -0
  6. data/Gemfile.lock +191 -0
  7. data/LICENSE +22 -0
  8. data/README.md +632 -0
  9. data/bin/mini_autobot +5 -0
  10. data/lib/mini_autobot.rb +44 -0
  11. data/lib/mini_autobot/connector.rb +288 -0
  12. data/lib/mini_autobot/console.rb +15 -0
  13. data/lib/mini_autobot/emails.rb +5 -0
  14. data/lib/mini_autobot/emails/mailbox.rb +15 -0
  15. data/lib/mini_autobot/endeca/base.rb +6 -0
  16. data/lib/mini_autobot/init.rb +63 -0
  17. data/lib/mini_autobot/logger.rb +12 -0
  18. data/lib/mini_autobot/page_objects.rb +22 -0
  19. data/lib/mini_autobot/page_objects/base.rb +264 -0
  20. data/lib/mini_autobot/page_objects/overlay/base.rb +76 -0
  21. data/lib/mini_autobot/page_objects/widgets/base.rb +47 -0
  22. data/lib/mini_autobot/parallel.rb +197 -0
  23. data/lib/mini_autobot/runner.rb +91 -0
  24. data/lib/mini_autobot/settings.rb +78 -0
  25. data/lib/mini_autobot/test_case.rb +233 -0
  26. data/lib/mini_autobot/test_cases.rb +7 -0
  27. data/lib/mini_autobot/utils.rb +10 -0
  28. data/lib/mini_autobot/utils/assertion_helper.rb +35 -0
  29. data/lib/mini_autobot/utils/castable.rb +103 -0
  30. data/lib/mini_autobot/utils/data_generator_helper.rb +145 -0
  31. data/lib/mini_autobot/utils/endeca_helper.rb +46 -0
  32. data/lib/mini_autobot/utils/loggable.rb +16 -0
  33. data/lib/mini_autobot/utils/overlay_and_widget_helper.rb +78 -0
  34. data/lib/mini_autobot/utils/page_object_helper.rb +209 -0
  35. data/lib/mini_autobot/version.rb +3 -0
  36. data/lib/minitap/minitest5_rent.rb +22 -0
  37. data/lib/minitest/autobot_settings_plugin.rb +77 -0
  38. data/lib/tapout/custom_reporters/fancy_tap_reporter.rb +94 -0
  39. data/lib/yard/tagged_test_case_handler.rb +61 -0
  40. data/mini_autobot.gemspec +38 -0
  41. metadata +299 -0
@@ -0,0 +1,3 @@
1
+ module MiniAutobot
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,22 @@
1
+ require 'minitap'
2
+
3
+ module Minitest
4
+
5
+ ##
6
+ # Base class for TapY and TapJ runners.
7
+ #
8
+ class Minitap
9
+
10
+ def tapout_before_case(test_case)
11
+ doc = {
12
+ 'type' => 'case',
13
+ 'subtype' => '',
14
+ 'label' => "#{test_case}",
15
+ 'level' => 0
16
+ }
17
+ return doc
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,77 @@
1
+ module Minitest
2
+
3
+ # Minitest plugin: autobot_settings
4
+ #
5
+ # This is where the options are propagated to +MiniAutobot.settings+.
6
+ def self.plugin_autobot_settings_init(options)
7
+ MiniAutobot.settings = options
8
+
9
+ MiniAutobot.logger = MiniAutobot::Logger.new('mini_autobot.log', 'daily').tap do |logger|
10
+ logger.formatter = proc do |sev, ts, prog, msg|
11
+ msg = msg.inspect unless String === msg
12
+ "#{ts.strftime('%Y-%m-%dT%H:%M:%S.%6N')} #{sev}: #{String === msg ? msg : msg.inspect}\n"
13
+ end
14
+ logger.level = case MiniAutobot.settings.verbosity_level
15
+ when 0
16
+ Logger::WARN
17
+ when 1
18
+ Logger::INFO
19
+ else
20
+ Logger::DEBUG
21
+ end
22
+ logger.info("Booting up with arguments: #{options[:args].inspect}")
23
+ at_exit { logger.info("Shutting down") }
24
+ end
25
+
26
+ MiniAutobot::Console.bootstrap! if options[:console]
27
+
28
+ self
29
+ end
30
+
31
+ # Minitest plugin: autobot_settings
32
+ #
33
+ # This plugin for minitest injects mini_autobot-specific command-line arguments, and
34
+ # passes it along to mini_autobot.
35
+ def self.plugin_autobot_settings_options(parser, options)
36
+ options[:auto_finalize] = true
37
+ parser.on('-Q', '--no-auto-quit-driver', "Don't automatically quit the driver after a test case") do |value|
38
+ options[:auto_finalize] = value
39
+ end
40
+
41
+ options[:connector] = ENV['AUTOBOT_CONNECTOR'] if ENV.has_key?('AUTOBOT_CONNECTOR')
42
+ parser.on('-c', '--connector TYPE', 'Run using a specific connector profile') do |value|
43
+ options[:connector] = value
44
+ end
45
+
46
+ options[:env] = ENV['AUTOBOT_ENV'] if ENV.has_key?('AUTOBOT_ENV')
47
+ parser.on('-e', '--env ENV', 'Run against a specific environment, host_env') do |value|
48
+ options[:env] = value
49
+ end
50
+
51
+ options[:console] = false
52
+ parser.on('-i', '--console', 'Run an interactive session within the context of an empty test') do |value|
53
+ options[:console] = true
54
+ end
55
+
56
+ options[:reuse_driver] = false
57
+ parser.on('-r', '--reuse-driver', "Reuse driver between tests") do |value|
58
+ options[:reuse_driver] = value
59
+ end
60
+
61
+ parser.on('-t', '--tag TAGLIST', 'Run only tests matching a specific tag, tags, or tagsets') do |value|
62
+ options[:tags] ||= [ ]
63
+ options[:tags] << value.to_s.split(',').map { |t| t.to_sym }
64
+ end
65
+
66
+ options[:verbosity_level] = 0
67
+ parser.on('-v', '--verbose', 'Output verbose logs to the log file') do |value|
68
+ options[:verbosity_level] += 1
69
+ end
70
+
71
+ options[:parallel] = false
72
+ parser.on('-P', '--parallel', 'Run in parallel') do |value|
73
+ options[:parallel] = value
74
+ end
75
+ end
76
+
77
+ end
@@ -0,0 +1,94 @@
1
+ class FancyTapReporter < Tapout::Reporters::Abstract
2
+
3
+ #
4
+ def start_suite(entry)
5
+ @start = Time.now
6
+ @i = 0
7
+ #n = 0
8
+ #suite.concerns.each{ |f| f.concerns.each { |s| n += s.ok.size } }
9
+ puts "1..#{entry['count']}"
10
+ end
11
+
12
+ #
13
+ def start_case(entry)
14
+ #$stdout.puts concern.label.ansi(:bold)
15
+ end
16
+
17
+ #
18
+ def pass(entry)
19
+ super(entry)
20
+
21
+ @i += 1
22
+ #desc = entry['message'] #+ " #{ok.arguments.inspect}"
23
+
24
+ puts "ok".ansi(*config.pass) + highlight(" #{@i} - #{entry['label']}")
25
+ end
26
+
27
+ #
28
+ def fail(entry)
29
+ super(entry)
30
+
31
+ @i += 1
32
+ x = entry['exception']
33
+
34
+ #desc = #ok.concern.label + " #{ok.arguments.inspect}"
35
+
36
+ body = []
37
+ body << "FAIL #{x['file']}:#{x['line']}" #clean_backtrace(exception.backtrace)[0]
38
+ body << "#{x['message']}"
39
+ body << x['snippet']
40
+ body << x['backtrace']
41
+ body << entry['stdout']
42
+ body = body.join("\n").gsub(/^/, ' # ')
43
+
44
+ puts "not ok".ansi(*config.fail) + highlight(" #{@i} - #{entry['label']}")
45
+ puts body
46
+ end
47
+
48
+ #
49
+ def error(entry)
50
+ super(entry)
51
+
52
+ @i += 1
53
+ x = entry['exception']
54
+
55
+ #desc = ok.concern.label + " #{ok.arguments.inspect}"
56
+
57
+ body = []
58
+ body << "ERROR #{x['file']}:#{x['line']}" #clean_backtrace(exception.backtrace)[0..2].join(" \n")
59
+ body << "#{x['class']}: #{x['message']}"
60
+ body << ""
61
+ body << x['backtrace']
62
+ body << entry['stdout']
63
+ body = body.join("\n").gsub(/^/, ' # ')
64
+
65
+ puts "not ok".ansi(*config.error) + highlight(" #{@i} - #{entry['label']}")
66
+ puts body
67
+ end
68
+
69
+ def todo(entry)
70
+ super(entry)
71
+ @i += 1
72
+ puts 'ok'.ansi(*config.pass) + highlight(" #{@i} - #{entry['label']} # skip #{entry['exception']['message']}")
73
+ puts " # #{entry['exception']['message']}"
74
+ end
75
+
76
+ def highlight(anything)
77
+ anything.ansi(*config.highlight)
78
+ end
79
+
80
+ # to print out formatted time and rates
81
+ def finish_suite(entry)
82
+ time, rate, avg = time_tally(entry)
83
+ delta = duration(time)
84
+
85
+ ending = []
86
+ ending << ""
87
+ ending << tally_message(entry)
88
+ ending << "[%s %.2ft/s %.4fs/t] " % [delta, rate, avg] + "Finished at: #{Time.now}"
89
+ ending = ending.join("\n").gsub(/^/, ' # ')
90
+
91
+ puts ending
92
+ end
93
+
94
+ end
@@ -0,0 +1,61 @@
1
+
2
+ module YARD
3
+
4
+ # Intercept all tagged test case definitions in order to document test case
5
+ # taggings automatically.
6
+ class TaggedTestCaseHandler < YARD::Handlers::Ruby::Base
7
+ # Register ourselves to handle method calls to `test`. Limit our interactions
8
+ # to the current namespace only.
9
+ handles method_call(:test)
10
+ namespace_only
11
+
12
+ # Process the method call to `test do ... end` as a dynamic method definition.
13
+ def process
14
+ # Retrieve the currently-active statement and its parameters
15
+ stmt = self.statement
16
+ params = stmt.parameters
17
+
18
+ # Move the AST pointer to the first parameter that is either a string or
19
+ # an identifier (e.g., inner symbol)
20
+ name = params.first.jump(:tstring_content, :ident).source
21
+
22
+ # Create a new method object in the namespace with the correct name
23
+ object = YARD::CodeObjects::MethodObject.new(self.namespace, "test_#{name}")
24
+
25
+ # Parse the block between the `test do` and `end` and attribute it to the
26
+ # method object above
27
+ self.parse_block(stmt.last.last, owner: object)
28
+
29
+ # Annotate it as a dynamic object with custom attributes
30
+ object.dynamic = true
31
+
32
+ # The options s-exp looks like:
33
+ #
34
+ # s(s(:assoc, s(:label, 'Key1'), s(...)),
35
+ # s(:assoc, s(:label, 'Key2'), s(...))
36
+ # )
37
+ #
38
+ # if one exists (nil otherwise)
39
+ if opts_sexp = params[1]
40
+ object['test_case_attrs'] = opts_sexp.inject(Hash.new) do |hsh, kv|
41
+ key_sexp, value_sexp = kv.jump(:assoc)
42
+
43
+ if (string_sexp = value_sexp.jump(:tstring_content)) && (string_sexp.type == :tstring_content)
44
+ hsh[key_sexp.first] = string_sexp.first
45
+ elsif (array_sexp = value_sexp.jump(:array)) && (array_sexp.type == :array)
46
+ hsh[key_sexp.first] = array_sexp.first.map { |sexp| sexp.jump(:tstring_content, :ident).first }
47
+ else
48
+ raise ArgumentError, "Cannot parse and render: #{kv.inspect}"
49
+ end
50
+
51
+ hsh
52
+ end
53
+ end
54
+
55
+ # Register the object
56
+ self.register(object)
57
+ end
58
+
59
+ end
60
+
61
+ end
@@ -0,0 +1,38 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'mini_autobot/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "mini_autobot"
7
+ s.version = MiniAutobot::VERSION
8
+ s.authors = ["Ripta Pasay", "Peijie Hu", "RentPath"]
9
+
10
+ s.summary = %q{Web automation framework on minitest, selenium webdriver, and page objects.}
11
+ s.description = %q{Wrapper of minitest and selenium-webdriver that supports multiple webapps
12
+ and multiple OS/browser ui automation testing, ready to be integrated in
13
+ development pipeline with jenkins and saucelabs.}
14
+ s.homepage = "https://github.com/rentpath/autobots"
15
+ s.license = "MIT"
16
+
17
+ s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ s.bindir = "bin"
19
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency 'activesupport', '~> 4.2'
23
+ s.add_dependency 'faker', '~> 1.4'
24
+ s.add_dependency 'google-api-client', '~> 0.8'
25
+ s.add_dependency 'google_drive', '~> 1.0'
26
+ s.add_dependency 'mail', '~> 2.6'
27
+ s.add_dependency 'minitap', '~> 0.5.3'
28
+ s.add_dependency 'pry', '~> 0.10'
29
+ s.add_dependency 'minitest', '~>5.4.0'
30
+ s.add_dependency 'selenium-webdriver', '~> 2.46'
31
+ s.add_dependency 'rest-client', '~> 1.8'
32
+
33
+ s.add_development_dependency 'rake'
34
+ s.add_development_dependency 'rspec', '~> 3.3.0'
35
+ s.add_development_dependency 'guard'
36
+ s.add_development_dependency 'guard-minitest'
37
+ s.add_development_dependency 'yard'
38
+ end
metadata ADDED
@@ -0,0 +1,299 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mini_autobot
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ripta Pasay
8
+ - Peijie Hu
9
+ - RentPath
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2015-08-11 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activesupport
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '4.2'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '4.2'
29
+ - !ruby/object:Gem::Dependency
30
+ name: faker
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '1.4'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '1.4'
43
+ - !ruby/object:Gem::Dependency
44
+ name: google-api-client
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '0.8'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '0.8'
57
+ - !ruby/object:Gem::Dependency
58
+ name: google_drive
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '1.0'
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '1.0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: mail
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '2.6'
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '2.6'
85
+ - !ruby/object:Gem::Dependency
86
+ name: minitap
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: 0.5.3
92
+ type: :runtime
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: 0.5.3
99
+ - !ruby/object:Gem::Dependency
100
+ name: pry
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '0.10'
106
+ type: :runtime
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '0.10'
113
+ - !ruby/object:Gem::Dependency
114
+ name: minitest
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: 5.4.0
120
+ type: :runtime
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: 5.4.0
127
+ - !ruby/object:Gem::Dependency
128
+ name: selenium-webdriver
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '2.46'
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: '2.46'
141
+ - !ruby/object:Gem::Dependency
142
+ name: rest-client
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '1.8'
148
+ type: :runtime
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - "~>"
153
+ - !ruby/object:Gem::Version
154
+ version: '1.8'
155
+ - !ruby/object:Gem::Dependency
156
+ name: rake
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ type: :development
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ - !ruby/object:Gem::Dependency
170
+ name: rspec
171
+ requirement: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - "~>"
174
+ - !ruby/object:Gem::Version
175
+ version: 3.3.0
176
+ type: :development
177
+ prerelease: false
178
+ version_requirements: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - "~>"
181
+ - !ruby/object:Gem::Version
182
+ version: 3.3.0
183
+ - !ruby/object:Gem::Dependency
184
+ name: guard
185
+ requirement: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ type: :development
191
+ prerelease: false
192
+ version_requirements: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ version: '0'
197
+ - !ruby/object:Gem::Dependency
198
+ name: guard-minitest
199
+ requirement: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ type: :development
205
+ prerelease: false
206
+ version_requirements: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - ">="
209
+ - !ruby/object:Gem::Version
210
+ version: '0'
211
+ - !ruby/object:Gem::Dependency
212
+ name: yard
213
+ requirement: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: '0'
218
+ type: :development
219
+ prerelease: false
220
+ version_requirements: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ version: '0'
225
+ description: |-
226
+ Wrapper of minitest and selenium-webdriver that supports multiple webapps
227
+ and multiple OS/browser ui automation testing, ready to be integrated in
228
+ development pipeline with jenkins and saucelabs.
229
+ email:
230
+ executables:
231
+ - mini_autobot
232
+ extensions: []
233
+ extra_rdoc_files: []
234
+ files:
235
+ - ".gitignore"
236
+ - ".rspec"
237
+ - ".ruby-version"
238
+ - Gemfile
239
+ - Gemfile.lock
240
+ - LICENSE
241
+ - README.md
242
+ - bin/mini_autobot
243
+ - lib/mini_autobot.rb
244
+ - lib/mini_autobot/connector.rb
245
+ - lib/mini_autobot/console.rb
246
+ - lib/mini_autobot/emails.rb
247
+ - lib/mini_autobot/emails/mailbox.rb
248
+ - lib/mini_autobot/endeca/base.rb
249
+ - lib/mini_autobot/init.rb
250
+ - lib/mini_autobot/logger.rb
251
+ - lib/mini_autobot/page_objects.rb
252
+ - lib/mini_autobot/page_objects/base.rb
253
+ - lib/mini_autobot/page_objects/overlay/base.rb
254
+ - lib/mini_autobot/page_objects/widgets/base.rb
255
+ - lib/mini_autobot/parallel.rb
256
+ - lib/mini_autobot/runner.rb
257
+ - lib/mini_autobot/settings.rb
258
+ - lib/mini_autobot/test_case.rb
259
+ - lib/mini_autobot/test_cases.rb
260
+ - lib/mini_autobot/utils.rb
261
+ - lib/mini_autobot/utils/assertion_helper.rb
262
+ - lib/mini_autobot/utils/castable.rb
263
+ - lib/mini_autobot/utils/data_generator_helper.rb
264
+ - lib/mini_autobot/utils/endeca_helper.rb
265
+ - lib/mini_autobot/utils/loggable.rb
266
+ - lib/mini_autobot/utils/overlay_and_widget_helper.rb
267
+ - lib/mini_autobot/utils/page_object_helper.rb
268
+ - lib/mini_autobot/version.rb
269
+ - lib/minitap/minitest5_rent.rb
270
+ - lib/minitest/autobot_settings_plugin.rb
271
+ - lib/tapout/custom_reporters/fancy_tap_reporter.rb
272
+ - lib/yard/tagged_test_case_handler.rb
273
+ - mini_autobot.gemspec
274
+ homepage: https://github.com/rentpath/autobots
275
+ licenses:
276
+ - MIT
277
+ metadata: {}
278
+ post_install_message:
279
+ rdoc_options: []
280
+ require_paths:
281
+ - lib
282
+ required_ruby_version: !ruby/object:Gem::Requirement
283
+ requirements:
284
+ - - ">="
285
+ - !ruby/object:Gem::Version
286
+ version: '0'
287
+ required_rubygems_version: !ruby/object:Gem::Requirement
288
+ requirements:
289
+ - - ">="
290
+ - !ruby/object:Gem::Version
291
+ version: '0'
292
+ requirements: []
293
+ rubyforge_project:
294
+ rubygems_version: 2.2.2
295
+ signing_key:
296
+ specification_version: 4
297
+ summary: Web automation framework on minitest, selenium webdriver, and page objects.
298
+ test_files: []
299
+ has_rdoc: