howitzer 0.0.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.
Files changed (45) hide show
  1. data/Gemfile +4 -0
  2. data/Gemfile.lock +113 -0
  3. data/LICENSE +22 -0
  4. data/README.md +44 -0
  5. data/Rakefile +2 -0
  6. data/bin/howitzer +41 -0
  7. data/generators/config/config_generator.rb +24 -0
  8. data/generators/config/templates/cucumber.yml +11 -0
  9. data/generators/config/templates/custom.yml +4 -0
  10. data/generators/config/templates/default.yml +76 -0
  11. data/generators/cucumber/cucumber_generator.rb +31 -0
  12. data/generators/cucumber/templates/common_steps.rb +23 -0
  13. data/generators/cucumber/templates/env.rb +38 -0
  14. data/generators/cucumber/templates/example.feature +16 -0
  15. data/generators/cucumber/templates/transformers.rb +28 -0
  16. data/generators/emails/emails_generator.rb +23 -0
  17. data/generators/emails/templates/example_email.rb +7 -0
  18. data/generators/pages/pages_generator.rb +23 -0
  19. data/generators/pages/templates/example_menu.rb +14 -0
  20. data/generators/pages/templates/example_page.rb +15 -0
  21. data/generators/root/root_generator.rb +25 -0
  22. data/generators/root/templates/.gitignore +20 -0
  23. data/generators/root/templates/Gemfile +4 -0
  24. data/generators/root/templates/Rakefile +4 -0
  25. data/generators/root/templates/boot.rb +16 -0
  26. data/generators/tasks/tasks_generator.rb +22 -0
  27. data/generators/tasks/templates/cucumber.rake +57 -0
  28. data/howitzer.gemspec +36 -0
  29. data/lib/howitzer.rb +5 -0
  30. data/lib/howitzer/helpers.rb +58 -0
  31. data/lib/howitzer/init.rb +5 -0
  32. data/lib/howitzer/utils.rb +14 -0
  33. data/lib/howitzer/utils/capybara_patched.rb +22 -0
  34. data/lib/howitzer/utils/capybara_settings.rb +110 -0
  35. data/lib/howitzer/utils/data_generator/data_storage.rb +41 -0
  36. data/lib/howitzer/utils/data_generator/gen.rb +89 -0
  37. data/lib/howitzer/utils/email/email.rb +46 -0
  38. data/lib/howitzer/utils/email/mail_client.rb +126 -0
  39. data/lib/howitzer/utils/email/mailgun.rb +175 -0
  40. data/lib/howitzer/utils/email/mailgun_helper.rb +35 -0
  41. data/lib/howitzer/utils/locator_store.rb +118 -0
  42. data/lib/howitzer/utils/logger.rb +108 -0
  43. data/lib/howitzer/version.rb +3 -0
  44. data/lib/howitzer/web_page.rb +62 -0
  45. metadata +334 -0
@@ -0,0 +1,35 @@
1
+ module MailgunHelper
2
+
3
+ def create_mailbox(user_name,
4
+ domain=settings.mail_pop3_domain,
5
+ password=settings.mail_pop3_user_pass)
6
+ log.info "Create '#{user_name}@#{domain}' mailbox"
7
+ mbox = Mailbox.new(:user => user_name, :domain => domain, :password => password)
8
+ mbox.upsert()
9
+ mbox
10
+ end
11
+
12
+ def delete_mailbox(mailbox)
13
+ log.info "Delete '#{mailbox.user}@#{mailbox.domain}' mailbox"
14
+ begin
15
+ Mailbox.remove(mailbox)
16
+ rescue Exception => e
17
+ log.warn "Unable to delete '#{mailbox.user}' mailbox: #{e.message}"
18
+ end
19
+ end
20
+
21
+ def delete_all_mailboxes(*exceptions)
22
+ puts exceptions.inspect
23
+ exceptions += %w"postmaster@#{settings.mail_smtp_domain}" #system and default mailbox
24
+ exceptions = exceptions.uniq
25
+ log.info "Delete all mailboxes #{"except: " + exceptions.inspect unless exceptions.empty?}"
26
+ i = 0
27
+ Mailbox.find(:all).each do |m|
28
+ next if exceptions.include?("#{m.user}@#{m.domain}")
29
+ Mailbox.delete(m.id)
30
+ i += 1
31
+ end
32
+
33
+ log.info "Were deleted '#{i}' mailboxes"
34
+ end
35
+ end
@@ -0,0 +1,118 @@
1
+ #The following are locator aliases:
2
+ #
3
+ #1) locator
4
+ #Type: :css(by default), :xpath
5
+ #Method example: find, all, first
6
+ #
7
+ #2) link_locator
8
+ #Type: id, text
9
+ #Method example: click_link, find_link
10
+ #
11
+ #3) button_locator
12
+ #Type: id, name, value
13
+ #Method example: click_button, find_button
14
+ #
15
+ #4) field_locator
16
+ #Type: name, id, text
17
+ #Method example: find_field, fill_in
18
+
19
+
20
+ module LocatorStore
21
+ def self.included(base)
22
+ base.extend(ClassMethods)
23
+ end
24
+
25
+ module ClassMethods
26
+ class BadLocatorParamsError < StandardError; end
27
+ class LocatorNotSpecifiedError < StandardError; end
28
+
29
+ def add_locator(name, params)
30
+ add_locator_by_type(:base, name, params)
31
+ end
32
+
33
+ def add_link_locator(name, params)
34
+ add_locator_by_type(:link, name, params)
35
+ end
36
+
37
+ def add_field_locator(name, params)
38
+ add_locator_by_type(:field, name, params)
39
+ end
40
+
41
+ def add_button_locator(name, params)
42
+ add_locator_by_type(:button, name, params)
43
+ end
44
+
45
+ def locator(name)
46
+ locator_by_type(:base, name)
47
+ end
48
+
49
+ def link_locator(name)
50
+ locator_by_type(:link, name)
51
+ end
52
+
53
+ def field_locator(name)
54
+ locator_by_type(:field, name)
55
+ end
56
+
57
+ def button_locator(name)
58
+ locator_by_type(:button, name)
59
+ end
60
+
61
+ def apply(locator, *values)
62
+ locator.call(*values).to_a.flatten
63
+ end
64
+
65
+ protected
66
+
67
+ def parent_locator(type, name)
68
+ if !@locators.nil? && @locators.key?(self.name) && @locators[self.name].key?(type) && @locators[self.name][type].key?(name)
69
+ @locators[self.name][type][name]
70
+ else
71
+ self.superclass.parent_locator(type, name) unless self.superclass == Object
72
+ end
73
+ end
74
+
75
+ private
76
+
77
+ def locator_by_type(type, name)
78
+ locator = parent_locator(type, name)
79
+ raise(LocatorNotSpecifiedError, name) if locator.nil?
80
+ locator
81
+ end
82
+
83
+ def add_locator_by_type(type, name, params)
84
+ @locators ||= {}
85
+ @locators[self.name] ||= {}
86
+ @locators[self.name][type] ||= {}
87
+ raise BadLocatorParamsError, args.inspect if params.nil? || (!params.is_a?(Proc) && params.empty?)
88
+ case params.class.name
89
+ when 'Hash'
90
+ @locators[self.name][type][name] = [params.keys.first.to_sym, params.values.first.to_s]
91
+ when 'Proc'
92
+ @locators[self.name][type][name] = params
93
+ else
94
+ @locators[self.name][type][name] = params.to_s
95
+ end
96
+ end
97
+ end
98
+
99
+ def locator(name)
100
+ self.class.locator(name)
101
+ end
102
+
103
+ def link_locator(name)
104
+ self.class.link_locator(name)
105
+ end
106
+
107
+ def field_locator(name)
108
+ self.class.field_locator(name)
109
+ end
110
+
111
+ def button_locator(name)
112
+ self.class.button_locator(name)
113
+ end
114
+
115
+ def apply(locator, *values)
116
+ self.class.apply(locator, *values)
117
+ end
118
+ end
@@ -0,0 +1,108 @@
1
+ require 'log4r'
2
+ require 'fileutils'
3
+
4
+ module AppLogger
5
+ include Log4r
6
+
7
+ @logger = Logger.new("ruby_log")
8
+
9
+ #STDOUT
10
+ console_log = StdoutOutputter.new(:console)
11
+ console_log.only_at(INFO, DEBUG, WARN)
12
+ @logger.add(console_log)
13
+
14
+ #STDERR
15
+ error_log = StderrOutputter.new(:error, 'level' => ERROR)
16
+ @logger.add(error_log)
17
+
18
+ #Txt outputter
19
+ FileUtils.mkdir_p(settings.log_dir) unless File.exists?(settings.log_dir)
20
+ filename = File.join(settings.log_dir, settings.txt_log)
21
+
22
+ txt_log = FileOutputter.new(:txt_log, :filename => filename, :trunc => true)
23
+ @logger.add(txt_log)
24
+
25
+
26
+ def self.log
27
+ @logger
28
+ end
29
+
30
+ def self.blank_formatter
31
+ PatternFormatter.new(:pattern => "%m")
32
+ end
33
+
34
+ def self.default_formatter
35
+
36
+ if settings.hide_datetime_from_log
37
+ params = {pattern: "[%l] %m"}
38
+ else
39
+ params = {pattern: "%d [%l] :: %m", date_pattern: "%Y/%m/%d %H:%M:%S"}
40
+ end
41
+ PatternFormatter.new(params)
42
+ end
43
+
44
+ def self.base_formatter=(formatter)
45
+ @logger.outputters.each {|outputter| outputter.formatter = formatter}
46
+ end
47
+
48
+ AppLogger.base_formatter = AppLogger.default_formatter
49
+ Logger["ruby_log"].level = settings.debug_mode ? ALL : INFO
50
+ Logger["ruby_log"].trace = true
51
+ end
52
+
53
+ def log
54
+ AppLogger.log
55
+ end
56
+
57
+ AppLogger.base_formatter = AppLogger.blank_formatter
58
+ #log.info settings.pretty_formatted_properties
59
+ AppLogger.base_formatter = AppLogger.default_formatter
60
+
61
+ def log.print_feature_name(text)
62
+ AppLogger.base_formatter = AppLogger.blank_formatter
63
+ log.info "*** Feature: #{text.upcase} ***"
64
+ AppLogger.base_formatter = AppLogger.default_formatter
65
+ end
66
+
67
+ def log.settings_as_formatted_text
68
+ AppLogger.base_formatter = AppLogger.blank_formatter
69
+ log.info settings.as_formatted_text
70
+ AppLogger.base_formatter = AppLogger.default_formatter
71
+ end
72
+
73
+ def log.print_scenario_name(text)
74
+ AppLogger.base_formatter = AppLogger.blank_formatter
75
+ log.info " => Scenario: #{text}"
76
+ AppLogger.base_formatter = AppLogger.default_formatter
77
+ end
78
+
79
+ class << log
80
+ eval "alias :n_error :error"
81
+ end
82
+
83
+ # examples:
84
+ # log.error MyException, 'Some error text', caller
85
+ # log.error 'Some error text', caller
86
+ # log.error 'Some error text'
87
+ # log.error err_object
88
+ def log.error(*args)
89
+ if args.first.nil?
90
+ object = $!
91
+ else
92
+ object = case args.size
93
+ when 1
94
+ args.first.is_a?(Exception) ? args.first : RuntimeError.new(args.first)
95
+ when 2
96
+ exception = RuntimeError.new(args.first)
97
+ exception.set_backtrace(args.last)
98
+ exception
99
+ when 3
100
+ exception = args.first.new(args[1])
101
+ exception.set_backtrace(args.last)
102
+ exception
103
+ end
104
+ end
105
+ err_backtrace = "\n\t#{object.backtrace.join("\n\t")}" unless object.backtrace.nil?
106
+ self.n_error("[#{object.class}] #{object.message}#{err_backtrace}")
107
+ fail(object)
108
+ end
@@ -0,0 +1,3 @@
1
+ module Howitzer
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,62 @@
1
+ require "rspec/expectations"
2
+ require 'howitzer/utils/locator_store'
3
+
4
+ class WebPage
5
+
6
+ BLANK_PAGE = 'about:blank'
7
+
8
+ #TODO include Capybara DSL here
9
+ include LocatorStore
10
+ include RSpec::Matchers
11
+
12
+ def self.open(url="#{settings.app_url}#{self::URL}")
13
+ log.info "Open #{self.name} page by '#{url}' url"
14
+ retryable(tries: 2, logger: log, trace: true, on: Exception) do |retries|
15
+ log.info "Retry..." unless retries.zero?
16
+ visit url
17
+ end
18
+ new
19
+ end
20
+
21
+ def self.given
22
+ new
23
+ end
24
+
25
+ def wait_for_ajax(timeout=settings.timeout_small, message=nil)
26
+ end_time = ::Time.now + timeout
27
+ until ::Time.now > end_time
28
+ return if page.evaluate_script('$.active') == 0
29
+ sleep 0.25
30
+ log.info "#{Time.now}"
31
+ end
32
+ log.error message || "Timed out waiting for ajax requests to complete"
33
+
34
+ end
35
+
36
+ def wait_for_url(expected_url, time_out=settings.timeout_small)
37
+ wait_until(time_out) do
38
+ operator = expected_url.is_a?(Regexp) ? :=~ : :==
39
+ current_url.send(operator, expected_url).tap{|res| sleep 1 unless res}
40
+ end
41
+ rescue
42
+ log.error "Current url: #{current_url}, expected: #{expected_url}"
43
+ end
44
+
45
+ def reload
46
+ log.info "Reload '#{current_url}'"
47
+ visit current_url
48
+ end
49
+
50
+ def self.current_url
51
+ page.current_url
52
+ end
53
+
54
+ def self.text
55
+ page.find('body').text
56
+ end
57
+
58
+ private
59
+ def initialize
60
+ wait_for_url(self.class::URL_PATTERN)
61
+ end
62
+ end
metadata ADDED
@@ -0,0 +1,334 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: howitzer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Roman Parashchenko, Konstantin Lynda, Nikolay Zozulyak
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rubigen
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: i18n
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: cucumber
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: '2.0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '2.0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: sexy_settings
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: repeater
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: selenium-webdriver
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: capybara
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: launchy
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: log4r
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :runtime
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ - !ruby/object:Gem::Dependency
191
+ name: mail
192
+ requirement: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ type: :runtime
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ! '>='
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ - !ruby/object:Gem::Dependency
207
+ name: rest-client
208
+ requirement: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ! '>='
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ type: :runtime
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ - !ruby/object:Gem::Dependency
223
+ name: poltergeist
224
+ requirement: !ruby/object:Gem::Requirement
225
+ none: false
226
+ requirements:
227
+ - - ! '>='
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :runtime
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ none: false
234
+ requirements:
235
+ - - ! '>='
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ - !ruby/object:Gem::Dependency
239
+ name: activeresource
240
+ requirement: !ruby/object:Gem::Requirement
241
+ none: false
242
+ requirements:
243
+ - - '='
244
+ - !ruby/object:Gem::Version
245
+ version: 3.2.8
246
+ type: :runtime
247
+ prerelease: false
248
+ version_requirements: !ruby/object:Gem::Requirement
249
+ none: false
250
+ requirements:
251
+ - - '='
252
+ - !ruby/object:Gem::Version
253
+ version: 3.2.8
254
+ description: The framework is based on Page Object pattern, Capybara and Rspec/Cucumber
255
+ libraries
256
+ email:
257
+ - strongqa@gmail.com
258
+ executables:
259
+ - howitzer
260
+ extensions: []
261
+ extra_rdoc_files: []
262
+ files:
263
+ - Gemfile
264
+ - Gemfile.lock
265
+ - LICENSE
266
+ - README.md
267
+ - Rakefile
268
+ - bin/howitzer
269
+ - generators/config/config_generator.rb
270
+ - generators/config/templates/cucumber.yml
271
+ - generators/config/templates/custom.yml
272
+ - generators/config/templates/default.yml
273
+ - generators/cucumber/cucumber_generator.rb
274
+ - generators/cucumber/templates/common_steps.rb
275
+ - generators/cucumber/templates/env.rb
276
+ - generators/cucumber/templates/example.feature
277
+ - generators/cucumber/templates/transformers.rb
278
+ - generators/emails/emails_generator.rb
279
+ - generators/emails/templates/example_email.rb
280
+ - generators/pages/pages_generator.rb
281
+ - generators/pages/templates/example_menu.rb
282
+ - generators/pages/templates/example_page.rb
283
+ - generators/root/root_generator.rb
284
+ - generators/root/templates/.gitignore
285
+ - generators/root/templates/Gemfile
286
+ - generators/root/templates/Rakefile
287
+ - generators/root/templates/boot.rb
288
+ - generators/tasks/tasks_generator.rb
289
+ - generators/tasks/templates/cucumber.rake
290
+ - howitzer.gemspec
291
+ - lib/howitzer.rb
292
+ - lib/howitzer/helpers.rb
293
+ - lib/howitzer/init.rb
294
+ - lib/howitzer/utils.rb
295
+ - lib/howitzer/utils/capybara_patched.rb
296
+ - lib/howitzer/utils/capybara_settings.rb
297
+ - lib/howitzer/utils/data_generator/data_storage.rb
298
+ - lib/howitzer/utils/data_generator/gen.rb
299
+ - lib/howitzer/utils/email/email.rb
300
+ - lib/howitzer/utils/email/mail_client.rb
301
+ - lib/howitzer/utils/email/mailgun.rb
302
+ - lib/howitzer/utils/email/mailgun_helper.rb
303
+ - lib/howitzer/utils/locator_store.rb
304
+ - lib/howitzer/utils/logger.rb
305
+ - lib/howitzer/version.rb
306
+ - lib/howitzer/web_page.rb
307
+ homepage: https://github.com/romikoops/howitzer
308
+ licenses: []
309
+ post_install_message:
310
+ rdoc_options: []
311
+ require_paths:
312
+ - lib
313
+ required_ruby_version: !ruby/object:Gem::Requirement
314
+ none: false
315
+ requirements:
316
+ - - ~>
317
+ - !ruby/object:Gem::Version
318
+ version: 1.9.2
319
+ required_rubygems_version: !ruby/object:Gem::Requirement
320
+ none: false
321
+ requirements:
322
+ - - ! '>='
323
+ - !ruby/object:Gem::Version
324
+ version: '0'
325
+ segments:
326
+ - 0
327
+ hash: 549866793313446351
328
+ requirements: []
329
+ rubyforge_project:
330
+ rubygems_version: 1.8.24
331
+ signing_key:
332
+ specification_version: 3
333
+ summary: Universal Ruby Test Framework for black box testing
334
+ test_files: []