howitzer 2.0.3 → 2.3.0

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 (139) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +69 -11
  3. data/LICENSE +1 -1
  4. data/README.md +21 -17
  5. data/bin/howitzer +7 -6
  6. data/generators/base_generator.rb +31 -17
  7. data/generators/config/config_generator.rb +11 -3
  8. data/generators/config/templates/boot.rb +3 -3
  9. data/generators/config/templates/capybara.rb +6 -131
  10. data/generators/config/templates/default.yml +34 -13
  11. data/generators/config/templates/drivers/appium.rb +25 -0
  12. data/generators/config/templates/drivers/browserstack.rb +23 -0
  13. data/generators/config/templates/drivers/crossbrowsertesting.rb +29 -0
  14. data/generators/config/templates/drivers/headless_chrome.rb +15 -0
  15. data/generators/config/templates/drivers/headless_firefox.rb +23 -0
  16. data/generators/config/templates/drivers/sauce.rb +25 -0
  17. data/generators/config/templates/drivers/selenium.rb +24 -0
  18. data/generators/config/templates/drivers/selenium_grid.rb +31 -0
  19. data/generators/config/templates/drivers/testingbot.rb +24 -0
  20. data/generators/cucumber/cucumber_generator.rb +2 -2
  21. data/generators/cucumber/templates/common_steps.rb +3 -3
  22. data/generators/cucumber/templates/cucumber.rake +5 -13
  23. data/generators/cucumber/templates/cuke_sniffer.rake +2 -2
  24. data/generators/cucumber/templates/env.rb +9 -1
  25. data/generators/cucumber/templates/hooks.rb +8 -2
  26. data/generators/cucumber/templates/transformers.rb +11 -25
  27. data/generators/emails/emails_generator.rb +2 -2
  28. data/generators/emails/templates/example_email.rb +1 -1
  29. data/generators/prerequisites/prerequisites_generator.rb +3 -3
  30. data/generators/prerequisites/templates/base.rb +1 -1
  31. data/generators/prerequisites/templates/{factory_girl.rb → factory_bot.rb} +7 -6
  32. data/generators/prerequisites/templates/users.rb +1 -1
  33. data/generators/root/root_generator.rb +3 -3
  34. data/generators/root/templates/Gemfile.erb +16 -22
  35. data/generators/rspec/rspec_generator.rb +2 -2
  36. data/generators/rspec/templates/rspec.rake +8 -8
  37. data/generators/rspec/templates/spec_helper.rb +6 -5
  38. data/generators/tasks/tasks_generator.rb +2 -2
  39. data/generators/turnip/templates/spec_helper.rb +6 -5
  40. data/generators/turnip/turnip_generator.rb +2 -2
  41. data/generators/web/templates/example_page.rb +1 -1
  42. data/generators/web/web_generator.rb +2 -2
  43. data/lib/howitzer/cache.rb +20 -19
  44. data/lib/howitzer/capybara_helpers.rb +58 -13
  45. data/lib/howitzer/email.rb +3 -2
  46. data/lib/howitzer/exceptions.rb +21 -20
  47. data/lib/howitzer/gmail_api/client.rb +31 -0
  48. data/lib/howitzer/gmail_api.rb +7 -0
  49. data/lib/howitzer/log.rb +6 -6
  50. data/lib/howitzer/mail_adapters/gmail.rb +96 -0
  51. data/lib/howitzer/mail_adapters/mailgun.rb +4 -2
  52. data/lib/howitzer/mail_adapters/mailtrap.rb +108 -0
  53. data/lib/howitzer/mailgun_api/client.rb +3 -2
  54. data/lib/howitzer/mailgun_api/connector.rb +1 -0
  55. data/lib/howitzer/mailgun_api/response.rb +1 -2
  56. data/lib/howitzer/mailtrap_api/client.rb +52 -0
  57. data/lib/howitzer/mailtrap_api.rb +7 -0
  58. data/lib/howitzer/meta/actions.rb +35 -0
  59. data/lib/howitzer/meta/element.rb +40 -0
  60. data/lib/howitzer/meta/entry.rb +62 -0
  61. data/lib/howitzer/meta/iframe.rb +41 -0
  62. data/lib/howitzer/meta/section.rb +30 -0
  63. data/lib/howitzer/meta.rb +11 -0
  64. data/lib/howitzer/utils/string_extensions.rb +6 -2
  65. data/lib/howitzer/version.rb +1 -1
  66. data/lib/howitzer/web/base_section.rb +1 -1
  67. data/lib/howitzer/web/capybara_context_holder.rb +1 -0
  68. data/lib/howitzer/web/capybara_methods_proxy.rb +15 -6
  69. data/lib/howitzer/web/element_dsl.rb +104 -44
  70. data/lib/howitzer/web/iframe_dsl.rb +23 -3
  71. data/lib/howitzer/web/page.rb +16 -4
  72. data/lib/howitzer/web/page_dsl.rb +19 -7
  73. data/lib/howitzer/web/page_validator.rb +27 -26
  74. data/lib/howitzer/web/section.rb +13 -2
  75. data/lib/howitzer/web/section_dsl.rb +65 -30
  76. data/lib/howitzer.rb +66 -10
  77. metadata +67 -133
  78. data/.coveralls.yml +0 -1
  79. data/.gitignore +0 -14
  80. data/.rspec +0 -3
  81. data/.rubocop.yml +0 -44
  82. data/.ruby-gemset +0 -1
  83. data/.travis.yml +0 -7
  84. data/Gemfile +0 -13
  85. data/MAINTENANCE.md +0 -32
  86. data/Rakefile +0 -22
  87. data/features/cli_help.feature +0 -31
  88. data/features/cli_new.feature +0 -349
  89. data/features/cli_unknown.feature +0 -17
  90. data/features/cli_update.feature +0 -178
  91. data/features/cli_version.feature +0 -14
  92. data/features/step_definitions/common_steps.rb +0 -29
  93. data/features/support/env.rb +0 -1
  94. data/features/support/transformers.rb +0 -3
  95. data/generators/root/templates/.gitignore +0 -21
  96. data/generators/root/templates/.rubocop.yml +0 -35
  97. data/generators/turnip/templates/.rspec +0 -1
  98. data/howitzer.gemspec +0 -37
  99. data/lib/howitzer/mail_adapters/debugmail.rb +0 -0
  100. data/spec/config/custom.yml +0 -9
  101. data/spec/spec_helper.rb +0 -72
  102. data/spec/support/generator_helper.rb +0 -21
  103. data/spec/support/logger_helper.rb +0 -13
  104. data/spec/support/mailgun_unit_client.rb +0 -68
  105. data/spec/support/shared_examples/capybara_context_holder.rb +0 -33
  106. data/spec/support/shared_examples/capybara_methods_proxy.rb +0 -94
  107. data/spec/support/shared_examples/dynamic_section_methods.rb +0 -35
  108. data/spec/support/shared_examples/element_dsl.rb +0 -242
  109. data/spec/unit/generators/base_generator_spec.rb +0 -272
  110. data/spec/unit/generators/config_generator_spec.rb +0 -38
  111. data/spec/unit/generators/cucumber_generator_spec.rb +0 -62
  112. data/spec/unit/generators/emails_generator_spec.rb +0 -35
  113. data/spec/unit/generators/prerequisites_generator_spec.rb +0 -53
  114. data/spec/unit/generators/root_generator_spec.rb +0 -72
  115. data/spec/unit/generators/rspec_generator_spec.rb +0 -36
  116. data/spec/unit/generators/tasks_generator_spec.rb +0 -31
  117. data/spec/unit/generators/turnip_generator_spec.rb +0 -52
  118. data/spec/unit/generators/web_generator_spec.rb +0 -52
  119. data/spec/unit/lib/cache_spec.rb +0 -85
  120. data/spec/unit/lib/capybara_helpers_spec.rb +0 -696
  121. data/spec/unit/lib/email_spec.rb +0 -186
  122. data/spec/unit/lib/howitzer_spec.rb +0 -40
  123. data/spec/unit/lib/init_spec.rb +0 -2
  124. data/spec/unit/lib/log_spec.rb +0 -122
  125. data/spec/unit/lib/mail_adapters/abstract_spec.rb +0 -62
  126. data/spec/unit/lib/mail_adapters/mailgun_spec.rb +0 -163
  127. data/spec/unit/lib/mailgun_api/client_spec.rb +0 -58
  128. data/spec/unit/lib/mailgun_api/connector_spec.rb +0 -54
  129. data/spec/unit/lib/mailgun_api/response_spec.rb +0 -28
  130. data/spec/unit/lib/utils/string_extensions_spec.rb +0 -77
  131. data/spec/unit/lib/web/base_section_spec.rb +0 -43
  132. data/spec/unit/lib/web/element_dsl_spec.rb +0 -22
  133. data/spec/unit/lib/web/iframe_dsl_spec.rb +0 -144
  134. data/spec/unit/lib/web/page_dsl_spec.rb +0 -74
  135. data/spec/unit/lib/web/page_spec.rb +0 -349
  136. data/spec/unit/lib/web/page_validator_spec.rb +0 -276
  137. data/spec/unit/lib/web/section_dsl_spec.rb +0 -165
  138. data/spec/unit/lib/web/section_spec.rb +0 -63
  139. data/spec/unit/version_spec.rb +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: bb8410811f708378094fa35c54437e100e62efc6
4
- data.tar.gz: 9b2fa233a0ccc0ce63c8a4f410a053228dd6bace
2
+ SHA256:
3
+ metadata.gz: 1c577b57b08ceb6da2f3a82b8b7e29950f02903fd519379bf42d49bfbb98d619
4
+ data.tar.gz: 3c3ee954802caa64bddd20e53c230dae5a6442bd83860b85058f90a61bf8cbc3
5
5
  SHA512:
6
- metadata.gz: 2ec55c0135ef0929e65808aa5a1d61aa62b96b40f29ab0ce13fb57b6c0dd14ff5730358d3a7812e66c999f758f3c9b4b6aeeb3c5b62b1547a6fbbe0e096c2e45
7
- data.tar.gz: 7f02cc2ba7ffe493e812b84fa2167c120af2bd7f2238e88c334e70dd5fced7d5b9f8f1c0f0057dd47f3d944e0ae0e3f4b54cb2bc6dd5e9aceefadd20d9a9d126
6
+ metadata.gz: 1bbe3fe208d2d92ebfa7b04e6ae7fa7842ff8400515f8e699ab8587cbdb1ee8206f2cfc0a9e7b3841173fd6c4f7d0ab01341dc24172ca0a3fb4136c07a14ca46
7
+ data.tar.gz: 3f98ca3bc90bd1e35b7b2a87bbc8059878de7bbe08109cbdeff83e46f02bf9a8503f3bc4d034028fbef73718aac71702424276a49d59f892e25bf771d21e8f4d
data/CHANGELOG.md CHANGED
@@ -1,8 +1,66 @@
1
- ## [In git](https://github.com/strongqa/howitzer/compare/v2.0.3...master)
1
+ ## [In git](https://github.com/strongqa/howitzer/compare/v2.3.0...master)
2
2
 
3
3
  ### New Features
4
4
 
5
- ### Bugfixes
5
+ ### Bug-fixes
6
+
7
+ ## [v2.3.0](https://github.com/strongqa/howitzer/compare/v2.2.0...v2.3.0)
8
+
9
+ ### New Features
10
+ - Support Ruby 3.0 (minimum version is 2.6.8)
11
+ - Unlock Activesupport 6.x
12
+ - Support latest versions of Cucumber
13
+ - Integrate rubocop-rspec linter
14
+ - Use latest version Rubocop
15
+ - Stop capybara-webkit support
16
+ - Stop poltergeist support
17
+ - Stop Apium driver support
18
+ - remove gmail gem from dependencies and add it only when it is really required
19
+ - Migrate to new Travis CI domain
20
+ - Replace abandoned Coveralls integration with Codecov [codecov.io](https://codecov.io/gh/strongqa/howitzer/)
21
+
22
+ ## [v2.2.0](https://github.com/strongqa/howitzer/compare/v2.1.1...v2.2.0)
23
+
24
+ ### New Features
25
+ - [#293](https://github.com/strongqa/howitzer/issues/293) add support ordering for run tests
26
+ - [#276](https://github.com/strongqa/howitzer/issues/276) Add support Capybara v3
27
+ - [#280](https://github.com/strongqa/howitzer/issues/280) Add support Firefox Headless
28
+ - [#241](https://github.com/strongqa/howitzer/issues/241) meta interface added. Allows tracking elements,sections, iframes on the page.
29
+ - [#266](https://github.com/strongqa/howitzer/issues/266) ruby 2.2 no longer supported
30
+ - [#265](https://github.com/strongqa/howitzer/issues/265) Add Appium driver
31
+ ### Bug-fixes
32
+ - [#286](https://github.com/strongqa/howitzer/issues/286) [Installation] generated rubocop.yml doesn't cover ruby sources
33
+ - [#274](https://github.com/strongqa/howitzer/issues/274) Stopped PhantomJS supporting
34
+ - [#282](https://github.com/strongqa/howitzer/issues/282) Multiple sessions don't work properly
35
+
36
+ ## [v2.1.1](https://github.com/strongqa/howitzer/compare/v2.1.0...v2.1.1)
37
+
38
+ ### New Features
39
+ - Cucumber rake tasks minor updates
40
+ - [#257](https://github.com/strongqa/howitzer/issues/257) Simplify working with multiple domains
41
+
42
+ ### Bug-fixes
43
+ - [#225](https://github.com/strongqa/howitzer/issues/225) Frames under namespace support
44
+ - [#254](https://github.com/strongqa/howitzer/issues/254) Screenshot driver now created for the active driver
45
+ - [#252](https://github.com/strongqa/howitzer/issues/252) Wrong location of log files fixed
46
+ - [#248](https://github.com/strongqa/howitzer/issues/248) FactoryGirl renamed to FactoryBot in cucumber transformation.
47
+ - [#246](https://github.com/strongqa/howitzer/issues/246) Options fixed for rspec rake tasks
48
+
49
+ ## [v2.1.0](https://github.com/strongqa/howitzer/compare/v2.0.3...v2.1.0)
50
+
51
+ ### New Features
52
+ - Integrate CrossBrowserTesting
53
+ - Add Mailtrap support
54
+ - Add Gmail support
55
+ - Add Colorized output
56
+ - Add new option **user_agent** to allow custom user agent setup
57
+ - **mailgun_sleep_time** deprecated, **mail_sleep_time** used instead for all mail adapters
58
+ - Split Capybara drivers configuration to separate files
59
+ - Migrate FactoryGirl to FactoryBot
60
+ - Support Cucumber 3
61
+
62
+ ### Bug-fixes
63
+ - [#231](https://github.com/strongqa/howitzer/issues/231) **window_maximized** option fixed for chrome browser on MacOS
6
64
 
7
65
  ## [v2.0.3](https://github.com/strongqa/howitzer/compare/v2.0.2...v2.0.3)
8
66
 
@@ -11,7 +69,7 @@
11
69
  - Stop supported **mailgun_idle_timeout** deprecated setting
12
70
  - Added maintenance instructions for releasing
13
71
 
14
- ### Bugfixes
72
+ ### Bug-fixes
15
73
  - [#222](https://github.com/strongqa/howitzer/issues/222) fix issue with incorrect iframe scope identifying
16
74
 
17
75
  ## [v2.0.2](https://github.com/strongqa/howitzer/compare/v2.0.1...v2.0.2)
@@ -26,7 +84,7 @@
26
84
  - Add element_presence argument validation
27
85
  - Review and improve tests quality
28
86
 
29
- ### Bugfixes
87
+ ### Bug-fixes
30
88
  - Fix element capybara options merging
31
89
  - [#211](https://github.com/strongqa/howitzer/issues/211) Validation for iframe does not operate as intended
32
90
  - [#210](https://github.com/strongqa/howitzer/issues/210) Options like "wait" can not be used with iframe methods
@@ -42,7 +100,7 @@
42
100
  - Implement wait_for_xxx_element method for sync
43
101
  - Implement within_xxx_element method like Capybara.within
44
102
 
45
- ### Bugfixes
103
+ ### Bug-fixes
46
104
  - [#188](https://github.com/strongqa/howitzer/issues/188) Page validation by element presence does not work properly
47
105
  - [#191](https://github.com/strongqa/howitzer/issues/191) Generated project is broken
48
106
  - [#195](https://github.com/strongqa/howitzer/issues/195) Incorrect parameters passing in lambda locators
@@ -54,7 +112,7 @@
54
112
  ## [v2.0.0](https://github.com/strongqa/howitzer/compare/v1.1.1...v2.0.0)
55
113
 
56
114
  ### New Features
57
- - Added REST API prerequisites with FactoryGirl
115
+ - Added REST API prerequisites with FactoryBot
58
116
  - Added Turnip supporting
59
117
  - Restricted using several bdd frameworks at the same time
60
118
  - Removed Opera browser supporting
@@ -80,7 +138,7 @@
80
138
 
81
139
  ## [v1.1.1](https://github.com/strongqa/howitzer/compare/v1.1.0...v1.1.1)
82
140
 
83
- ### Bugfixes
141
+ ### Bug-fixes
84
142
  - fixed problem with Mailgun
85
143
  - fixed problems with gems
86
144
 
@@ -103,7 +161,7 @@
103
161
  - Integrated YardDoc
104
162
  - Integrated Gitter
105
163
 
106
- ### Bugfixes
164
+ ### Bug-fixes
107
165
  - Fixed issue with loading ActiveSupport
108
166
 
109
167
  ## [v1.0.2](https://github.com/strongqa/howitzer/compare/v1.0.1...v1.0.2)
@@ -121,14 +179,14 @@
121
179
  - Rewritten command line interface and covered by acceptance tests fully
122
180
  - Simplified DataStorage clearing after each tests
123
181
 
124
- ### Bugfixes
182
+ ### Bug-fixes
125
183
  - Fixed reset session after each scenario against to IE
126
184
  - Corrected default Cucumber and Rspec formatters
127
185
  - Minor bug fixing and code refactoring
128
186
 
129
187
  ## [v1.0.1](https://github.com/strongqa/howitzer/compare/v1.0...v1.0.1)
130
188
 
131
- ### Bugfixes
189
+ ### Bug-fixes
132
190
  - Fixed unit tests
133
191
  - Fixed correct Ruby version supporting
134
192
 
@@ -145,7 +203,7 @@ It is major release, so there are many new features, refactoring, unit tests, co
145
203
 
146
204
  * Added supporting poltergeist driver
147
205
 
148
- ### Bugfixes
206
+ ### Bug-fixes
149
207
 
150
208
  * Fixed problem with dependencies
151
209
 
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2016 Roman Parashchenko and StrongQA, Ltd.
1
+ Copyright (c) 2012-2021 Roman Parashchenko and StrongQA, LLC.
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,21 +1,22 @@
1
1
  <p align="center" style="overflow: hidden;">
2
- <a href="http://howitzer-framework.io">
2
+ <a href="https://howitzer-framework.io">
3
3
  <img src="https://raw.githubusercontent.com/strongqa/howitzer/gh-pages/images/howitzer-logo.png" alt="Howitzer" />
4
4
  </a>
5
5
  <br/>
6
6
 
7
- <p align="center"><b>Ruby-based framework for acceptance testing of web applications.</b></p>
7
+ <p align="center"><b>A Ruby-based framework for acceptance testing of web applications.</b></p>
8
8
 
9
9
  <p align="center">The framework was built with modern patterns, techniques, and tools in automated testing in order to speed up tests development and simplify supporting.</p>
10
10
 
11
11
  <p align="center">
12
12
  <a href="https://gitter.im/strongqa/howitzer"><img src="https://badges.gitter.im/Join%20Chat.svg" /></a>
13
- <a href="https://rubygems.org/gems/howitzer"><img src="http://img.shields.io/gem/v/howitzer.svg" /></a>
14
- <a href="https://travis-ci.org/strongqa/howitzer"><img src="https://travis-ci.org/strongqa/howitzer.svg?branch=master" /></a>
15
- <a href='https://gemnasium.com/strongqa/howitzer'><img src="https://gemnasium.com/strongqa/howitzer.svg" /></a>
13
+ <a href="https://rubygems.org/gems/howitzer"><img src="https://img.shields.io/gem/v/howitzer.svg" /></a>
14
+ <a href="https://app.travis-ci.com/github/strongqa/howitzer"><img src="https://app.travis-ci.com/strongqa/howitzer.svg?branch=master" /></a>
16
15
  <a href="https://codeclimate.com/github/strongqa/howitzer"><img src="https://codeclimate.com/github/strongqa/howitzer.png" /></a>
17
- <a href='https://coveralls.io/github/strongqa/howitzer?branch=master'><img src='https://coveralls.io/repos/github/strongqa/howitzer/badge.svg?branch=master' alt='Coverage Status' /></a>
18
- <a href="https://github.com/strongqa/howitzer/blob/master/LICENSE"><img src="http://img.shields.io/badge/license-MIT-blue.svg" /></a>
16
+ <a href="https://codecov.io/gh/strongqa/howitzer">
17
+ <img src="https://codecov.io/gh/strongqa/howitzer/branch/master/graph/badge.svg?token=vB8DYQtmjA"/>
18
+ </a>
19
+ <a href="https://github.com/strongqa/howitzer/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" /></a>
19
20
  </p>
20
21
 
21
22
  </p>
@@ -25,12 +26,13 @@
25
26
  - Fast installation and configuration of the complete testing infrastructure (takes less than 5 minutes).
26
27
  - Elegant, intuitive and powerful Ruby language underneath.
27
28
  - Possibility to choose your favorite BDD tool (Cucumber, RSpec or Turnip).
28
- - Integration with SauceLabs, Testingbot, BrowserStack and MailGun web services.
29
+ - Integration with SauceLabs, Testingbot, BrowserStack, CrossBrowserTesting cloud services.
30
+ - Integration with MailGun, Gmail, Mailtrap email services.
29
31
  - Easy tests support based on the best patterns, techniques, principles.
30
32
  - Ability to execute tests against to both browserless driver and actual browsers with no changes in your tests.
31
33
 
32
34
  ## Documentation
33
- Refer to the [GETTING STARTED](http://docs.howitzer-framework.io) document to start working with *Howitzer*.
35
+ Refer to the [GETTING STARTED](https://docs.howitzer-framework.io) document to start working with *Howitzer*.
34
36
 
35
37
  You can also find the Rdoc documentation on [Rubygems](https://rubygems.org/gems/howitzer).
36
38
 
@@ -41,14 +43,14 @@ You can also find the Rdoc documentation on [Rubygems](https://rubygems.org/gems
41
43
 
42
44
  ## Requirements
43
45
  * Supported OS: Mac OS X, Linux, Windows
44
- * [Ruby](https://www.ruby-lang.org/en/downloads/) 2.2.2+
46
+ * [Ruby](https://www.ruby-lang.org/en/downloads/) 2.6.8+
45
47
  * [DevKit](https://github.com/oneclick/rubyinstaller/wiki/Development-Kit#installation-instructions) (For **Windows** only)
46
- * [PhantomJS](http://phantomjs.org/download.html) (For **phantomjs** and **poltergeist** drivers only)
47
48
  * [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/) (For **chrome** selenium browser, 2.29+ for headless mode)
48
49
  * [GeckoDriver](https://github.com/mozilla/geckodriver/releases) (For **firefox** selenium browser)
49
50
  * [SafariDriver](https://webkit.org/blog/6900/webdriver-support-in-safari-10/) (For **safari** selenium browser)
50
- * [QT](https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit) (For **webkit** driver only)
51
51
  * [Chrome](https://www.google.com/chrome/browser/desktop/index.html) v.59+ (For **headless chrome** support)
52
+ * [Firefox](https://www.mozilla.org/en-US/firefox/new/) v.56+ (For **headless firefox** support)
53
+ * [Android SDK](https://developer.android.com/studio) and [Appium](https://appium.io/docs/en/about-appium/getting-started) (For Appium driver)
52
54
  ## Setup
53
55
  To install, type
54
56
 
@@ -65,7 +67,7 @@ To generate the project with [Cucumber](https://cucumber.io/), type:
65
67
  howitzer new <PROJECT NAME> --cucumber
66
68
  ```
67
69
 
68
- With [Rspec](http://rspec.info/):
70
+ With [Rspec](https://rspec.info/):
69
71
 
70
72
  ```bash
71
73
  howitzer new <PROJECT NAME> --rspec
@@ -133,6 +135,8 @@ Don't forget to review the difference, to see if there were any unexpected chang
133
135
  Contributing
134
136
  ------------
135
137
 
138
+ [![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/0)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/0)[![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/1)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/1)[![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/2)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/2)[![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/3)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/3)[![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/4)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/4)[![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/5)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/5)[![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/6)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/6)[![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/7)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/7)
139
+
136
140
  Please see [CONTRIBUTING.md](CONTRIBUTING.md).
137
141
 
138
142
  howitzer was originally designed by Roman Parashchenko and is now maintained by StrongQA team. You can find list of contributors here [open source
@@ -141,7 +145,7 @@ community](https://github.com/strongqa/howitzer/graphs/contributors).
141
145
  License
142
146
  -------
143
147
 
144
- howitzer is Copyright © 2012-2017 Roman Parashchenko and StrongQA Ltd. It is free
148
+ howitzer is Copyright © 2012-2021 Roman Parashchenko and StrongQA LLC. It is free
145
149
  software, and may be redistributed under the terms specified in the
146
150
  [LICENSE](LICENSE) file.
147
151
 
@@ -150,11 +154,11 @@ About StrongQA
150
154
 
151
155
  ![StrongQA](https://github.com/strongqa/howitzer/blob/gh-pages/images/strongqa-logo.png)
152
156
 
153
- howitzer is maintained and funded by StrongQA, Ltd.
154
- The names and logos for StrongQA are trademarks of StrongQA, Ltd.
157
+ howitzer is maintained and funded by StrongQA, LLC.
158
+ The names and logos for StrongQA are trademarks of StrongQA, LLC.
155
159
 
156
160
  We love open source software!
157
161
  See [our other projects][testing_solutions] or [hire us][hire] to consult and develop testing solutions.
158
162
 
159
- [testing_solutions]: http://strongqa.com/testing_solutions/?utm_source=github
163
+ [testing_solutions]: https://strongqa.com/services/testing-solutions?utm_source=github
160
164
  [hire]: https://strongqa.com?utm_source=github
data/bin/howitzer CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'colorized_string'
2
3
  require 'gli'
3
4
  require_relative '../lib/howitzer/version'
4
5
 
@@ -26,9 +27,9 @@ module HowitzerCli
26
27
  validate_options(options)
27
28
  load_generators
28
29
  path_to_dir = File.join(Dir.pwd, args.first)
29
- puts ' * New project directory creation ...'
30
+ puts ColorizedString.new(' * New project directory creation ...').light_cyan
30
31
  Dir.mkdir(path_to_dir)
31
- puts " Created new './#{args.first}' folder"
32
+ puts " #{ColorizedString.new('Created').light_green} './#{args.first}' folder"
32
33
  Dir.chdir(path_to_dir)
33
34
  Howitzer::ConfigGenerator.new(options)
34
35
  Howitzer::WebGenerator.new(options)
@@ -43,9 +44,9 @@ module HowitzerCli
43
44
  elsif options['turnip']
44
45
  Howitzer::TurnipGenerator.new(options)
45
46
  end
46
- puts '[WARN] Extra parameters were skipped' if args.size > 1
47
+ puts ColorizedString.new('[WARN] Extra parameters were skipped').yellow if args.size > 1
47
48
  elsif args.size.zero?
48
- exit_now!('Please specify <PROJECT NAME>', 64)
49
+ exit_now!(ColorizedString.new('Please specify <PROJECT NAME>').red, 64)
49
50
  end
50
51
  end
51
52
  end
@@ -80,11 +81,11 @@ module HowitzerCli
80
81
  def validate_options(options)
81
82
  return if [options[:cucumber], options[:rspec], options[:turnip]].count { |el| el } == 1
82
83
 
83
- exit_now!('Provide --cucumber, --rspec or --turnip option', 64)
84
+ exit_now!(ColorizedString.new('Provide --cucumber, --rspec or --turnip option').red, 64)
84
85
  end
85
86
 
86
87
  def check_project_presence
87
- exit_now!('Current directory is not Howitzer project', 126) unless howitzer_project?
88
+ exit_now!(ColorizedString.new('Current directory is not Howitzer project').red, 126) unless howitzer_project?
88
89
  end
89
90
 
90
91
  def howitzer_project?
@@ -1,3 +1,4 @@
1
+ require 'colorized_string'
1
2
  require 'fileutils'
2
3
  require 'erb'
3
4
  require 'ostruct'
@@ -29,7 +30,7 @@ module Howitzer
29
30
  end
30
31
 
31
32
  def print_banner
32
- logger.puts banner unless banner.empty?
33
+ logger.puts ColorizedString.new(banner.chomp).light_cyan unless banner.empty?
33
34
  end
34
35
 
35
36
  def print_info(data)
@@ -41,7 +42,7 @@ module Howitzer
41
42
  end
42
43
 
43
44
  def puts_error(data)
44
- logger.puts " ERROR: #{data}"
45
+ logger.puts ColorizedString.new(" ERROR: #{data}").red
45
46
  end
46
47
  end
47
48
 
@@ -88,7 +89,8 @@ module Howitzer
88
89
  copy_templates_file_exist(data, destination_path, source_path)
89
90
  else
90
91
  write_template(destination_path, source_path)
91
- puts_info "Added template '#{data[:source]}' with params '#{@options}' to destination '#{data[:destination]}'"
92
+ puts_info "#{ColorizedString.new('Added').light_green} template '#{data[:source]}' with"\
93
+ " params '#{@options}' to destination '#{data[:destination]}'"
92
94
  end
93
95
  end
94
96
  end
@@ -103,14 +105,13 @@ module Howitzer
103
105
  end
104
106
 
105
107
  def copy_with_path(data)
106
- src = source_path(data[:source])
107
- dst = dest_path(data[:destination])
108
+ src, dst = get_source_and_destination(data)
108
109
  FileUtils.mkdir_p(File.dirname(dst))
109
110
  if File.exist?(dst)
110
111
  copy_with_path_file_exist(data, src, dst)
111
112
  else
112
113
  FileUtils.cp(src, dst)
113
- puts_info("Added '#{data[:destination]}' file")
114
+ puts_info("#{ColorizedString.new('Added').light_green} '#{data[:destination]}' file")
114
115
  end
115
116
  rescue => e
116
117
  puts_error("Impossible to create '#{data[:destination]}' file. Reason: #{e.message}")
@@ -118,24 +119,37 @@ module Howitzer
118
119
 
119
120
  def write_template(dest_path, source_path)
120
121
  File.open(dest_path, 'w+') do |f|
121
- f.write(ERB.new(File.open(source_path, 'r').read).result(OpenStruct.new(@options).instance_eval { binding }))
122
+ f.write(ERB.new(File.open(source_path, 'r').read, trim_mode: '-')
123
+ .result(OpenStruct.new(@options).instance_eval { binding }))
122
124
  end
123
125
  end
124
126
 
125
127
  private
126
128
 
129
+ def get_source_and_destination(data)
130
+ [source_path(data[:source]), dest_path(data[:destination])]
131
+ end
132
+
133
+ def conflict_file_msg(data)
134
+ ColorizedString.new("Conflict with '#{data[:destination]}' file").yellow
135
+ end
136
+
137
+ def overwrite_file_msg(data)
138
+ ColorizedString.new(" Overwrite '#{data[:destination]}' file? [Yn]:").yellow
139
+ end
140
+
127
141
  def copy_templates_file_exist(data, destination_path, source_path)
128
- puts_info("Conflict with '#{data[:destination]}' template")
129
- print_info(" Overwrite '#{data[:destination]}' template? [Yn]:")
142
+ puts_info(ColorizedString.new("Conflict with '#{data[:destination]}' template").yellow)
143
+ print_info(ColorizedString.new(" Overwrite '#{data[:destination]}' template? [Yn]:").yellow)
130
144
  copy_templates_overwrite(gets.strip.downcase, data, destination_path, source_path)
131
145
  end
132
146
 
133
147
  def copy_with_path_file_exist(data, source, destination)
134
148
  if FileUtils.identical?(source, destination)
135
- puts_info("Identical '#{data[:destination]}' file")
149
+ puts_info("#{ColorizedString.new('Identical').light_green} '#{data[:destination]}' file")
136
150
  else
137
- puts_info("Conflict with '#{data[:destination]}' file")
138
- print_info(" Overwrite '#{data[:destination]}' file? [Yn]:")
151
+ puts_info(conflict_file_msg(data))
152
+ print_info(overwrite_file_msg(data))
139
153
  copy_with_path_overwrite(gets.strip.downcase, data, source, destination)
140
154
  end
141
155
  end
@@ -144,9 +158,9 @@ module Howitzer
144
158
  case answer
145
159
  when 'y'
146
160
  write_template(destination_path, source_path)
147
- puts_info(" Forced '#{data[:destination]}' template")
161
+ puts_info(" #{ColorizedString.new('Forced').light_green} '#{data[:destination]}' template")
148
162
  when 'n'
149
- puts_info(" Skipped '#{data[:destination]}' template")
163
+ puts_info(" #{ColorizedString.new('Skipped').light_black} '#{data[:destination]}' template")
150
164
  else nil
151
165
  end
152
166
  end
@@ -155,9 +169,9 @@ module Howitzer
155
169
  case answer
156
170
  when 'y'
157
171
  FileUtils.cp(source, destination)
158
- puts_info(" Forced '#{data[:destination]}' file")
159
- when 'n' then
160
- puts_info(" Skipped '#{data[:destination]}' file")
172
+ puts_info(" #{ColorizedString.new('Forced').light_green} '#{data[:destination]}' file")
173
+ when 'n'
174
+ puts_info(" #{ColorizedString.new('Skipped').light_black} '#{data[:destination]}' file")
161
175
  else nil
162
176
  end
163
177
  end
@@ -8,16 +8,24 @@ module Howitzer
8
8
  { source: 'boot.rb', destination: 'config/boot.rb' },
9
9
  { source: 'custom.yml', destination: 'config/custom.yml' },
10
10
  { source: 'capybara.rb', destination: 'config/capybara.rb' },
11
- { source: 'default.yml', destination: 'config/default.yml' }
11
+ { source: 'default.yml', destination: 'config/default.yml' },
12
+ { source: 'drivers/browserstack.rb', destination: 'config/drivers/browserstack.rb' },
13
+ { source: 'drivers/crossbrowsertesting.rb', destination: 'config/drivers/crossbrowsertesting.rb' },
14
+ { source: 'drivers/headless_chrome.rb', destination: 'config/drivers/headless_chrome.rb' },
15
+ { source: 'drivers/headless_firefox.rb', destination: 'config/drivers/headless_firefox.rb' },
16
+ { source: 'drivers/sauce.rb', destination: 'config/drivers/sauce.rb' },
17
+ { source: 'drivers/selenium.rb', destination: 'config/drivers/selenium.rb' },
18
+ { source: 'drivers/selenium_grid.rb', destination: 'config/drivers/selenium_grid.rb' },
19
+ { source: 'drivers/testingbot.rb', destination: 'config/drivers/testingbot.rb' }
12
20
  ] }
13
21
  end
14
22
 
15
23
  protected
16
24
 
17
25
  def banner
18
- <<-EOF
26
+ <<-MSG
19
27
  * Config files generation ...
20
- EOF
28
+ MSG
21
29
  end
22
30
  end
23
31
  end
@@ -3,12 +3,12 @@ require 'bundler/setup'
3
3
 
4
4
  Bundler.require(:default)
5
5
 
6
- Dir[
6
+ Dir[ # rubocop:disable Lint/NonDeterministicRequireOrder
7
7
  './emails/**/*.rb',
8
8
  './web/sections/**/*.rb',
9
9
  './web/pages/**/*.rb',
10
10
  './prerequisites/models/**/*.rb',
11
- './prerequisites/factory_girl.rb'
11
+ './prerequisites/factory_bot.rb'
12
12
  ].each { |f| require f }
13
13
 
14
- String.send(:include, Howitzer::Utils::StringExtensions)
14
+ String.include Howitzer::Utils::StringExtensions
@@ -1,18 +1,18 @@
1
1
  HOWITZER_KNOWN_DRIVERS = %i[
2
+ appium
2
3
  selenium
3
4
  selenium_grid
4
- webkit
5
- poltergeist
6
- phantomjs
7
5
  sauce
8
6
  testingbot
9
7
  browserstack
8
+ crossbrowsertesting
10
9
  headless_chrome
10
+ headless_firefox
11
11
  ].freeze
12
12
 
13
13
  unless HOWITZER_KNOWN_DRIVERS.include?(Howitzer.driver.to_s.to_sym)
14
14
  raise Howitzer::UnknownDriverError, "Unknown '#{Howitzer.driver}' driver." \
15
- " Check your settings, it should be one of #{HOWITZER_KNOWN_DRIVERS}"
15
+ " Check your settings, it should be one of #{HOWITZER_KNOWN_DRIVERS}"
16
16
  end
17
17
 
18
18
  Capybara.configure do |config|
@@ -36,135 +36,10 @@ module CapybaraHelpers
36
36
  extend Howitzer::CapybaraHelpers
37
37
  end
38
38
 
39
- # :selenium driver
40
-
41
- Capybara.register_driver :selenium do |app|
42
- params = { browser: Howitzer.selenium_browser.to_s.to_sym }
43
- if CapybaraHelpers.ff_browser?
44
- ff_profile = Selenium::WebDriver::Firefox::Profile.new.tap do |profile|
45
- profile['network.http.phishy-userpass-length'] = 255
46
- profile['browser.safebrowsing.malware.enabled'] = false
47
- profile['network.automatic-ntlm-auth.allow-non-fqdn'] = true
48
- profile['network.ntlm.send-lm-response'] = true
49
- profile['network.automatic-ntlm-auth.trusted-uris'] = Howitzer.app_host
50
- end
51
- params[:profile] = ff_profile
52
- end
53
- Capybara::Selenium::Driver.new app, params
54
- end
55
-
56
- # :headless_chrome driver
57
-
58
- Capybara.register_driver :headless_chrome do |app|
59
- startup_flags = ['--headless']
60
- startup_flags << '-start-maximized' if Howitzer.maximized_window
61
- startup_flags.concat(Howitzer.headless_chrome_flags.split(/\s*,\s*/)) if Howitzer.headless_chrome_flags
62
- params = { browser: :chrome, switches: startup_flags }
63
- Capybara::Selenium::Driver.new app, params
64
- end
65
-
66
- # :webkit driver
67
-
68
- if Howitzer.driver.to_sym == :webkit
69
- CapybaraHelpers.load_driver_gem!(:webkit, 'capybara-webkit', 'capybara-webkit')
70
- Capybara::Webkit.configure do |config|
71
- config.allow_url(Howitzer.app_host)
72
- end
73
- end
74
-
75
- # :poltergeist driver
76
-
77
- if Howitzer.driver.to_sym == :poltergeist
78
- CapybaraHelpers.load_driver_gem!(:poltergeist, 'capybara/poltergeist', 'poltergeist')
79
-
80
- Capybara.register_driver :poltergeist do |app|
81
- Capybara::Poltergeist::Driver.new(
82
- app,
83
- js_errors: !Howitzer.phantom_ignore_js_errors,
84
- phantomjs_options: ["--ignore-ssl-errors=#{Howitzer.phantom_ignore_ssl_errors ? 'yes' : 'no'}"]
85
- )
86
- end
87
- end
88
-
89
- # :phantomjs driver
90
-
91
- Capybara.register_driver :phantomjs do |app|
92
- Capybara::Selenium::Driver.new(
93
- app, browser: :phantomjs,
94
- desired_capabilities: {
95
- javascript_enabled: !Howitzer.phantom_ignore_js_errors
96
- },
97
- driver_opts: {
98
- args: ["--ignore-ssl-errors=#{Howitzer.phantom_ignore_ssl_errors ? 'yes' : 'no'}"]
99
- }
100
- )
101
- end
102
-
103
- # :sauce driver
104
-
105
- Capybara.register_driver :sauce do |app|
106
- caps = CapybaraHelpers.required_cloud_caps.merge(
107
- maxDuration: Howitzer.cloud_max_duration,
108
- idleTimeout: Howitzer.cloud_sauce_idle_timeout,
109
- recordScreenshots: Howitzer.cloud_sauce_record_screenshots,
110
- videoUploadOnPass: Howitzer.cloud_sauce_video_upload_on_pass
111
- )
112
- url = "http://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@ondemand.saucelabs.com:80/wd/hub"
113
- CapybaraHelpers.cloud_driver(app, caps, url)
114
- end
115
-
116
- # :testingbot driver
117
-
118
- Capybara.register_driver :testingbot do |app|
119
- caps = CapybaraHelpers.required_cloud_caps.merge(
120
- maxduration: Howitzer.cloud_max_duration,
121
- idletimeout: Howitzer.cloud_testingbot_idle_timeout,
122
- screenshot: Howitzer.cloud_testingbot_screenshots
123
- )
124
- url = "http://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@hub.testingbot.com/wd/hub"
125
- CapybaraHelpers.cloud_driver(app, caps, url)
126
- end
127
-
128
- # :browserstack driver
129
-
130
- Capybara.register_driver :browserstack do |app|
131
- caps = CapybaraHelpers.required_cloud_caps.merge(
132
- project: Howitzer.cloud_bstack_project,
133
- build: Howitzer.cloud_bstack_build
134
- )
135
- caps[:resolution] = Howitzer.cloud_bstack_resolution if Howitzer.cloud_bstack_resolution.present?
136
- caps[:device] = Howitzer.cloud_bstack_mobile_device if Howitzer.cloud_bstack_mobile_device.present?
137
- url = "http://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@hub.browserstack.com/wd/hub"
138
- CapybaraHelpers.cloud_driver(app, caps, url)
139
- end
140
-
141
- # :selenium_grid driver
142
-
143
- Capybara.register_driver :selenium_grid do |app|
144
- caps = if CapybaraHelpers.ie_browser?
145
- Selenium::WebDriver::Remote::Capabilities.internet_explorer
146
- elsif CapybaraHelpers.ff_browser?
147
- Selenium::WebDriver::Remote::Capabilities.firefox
148
- elsif CapybaraHelpers.chrome_browser?
149
- Selenium::WebDriver::Remote::Capabilities.chrome
150
- elsif CapybaraHelpers.safari_browser?
151
- Selenium::WebDriver::Remote::Capabilities.safari
152
- else
153
- raise Howitzer::UnknownBrowserError, "Unknown '#{Howitzer.selenium_browser}' selenium_browser." \
154
- ' Check your settings, it should be one of' \
155
- ' [:ie, :iexplore, :ff, :firefox, :chrome, safari]'
156
- end
157
-
158
- Capybara::Selenium::Driver.new(app, browser: :remote, url: Howitzer.selenium_hub_url, desired_capabilities: caps)
159
- end
39
+ require_relative "drivers/#{Howitzer.driver}"
160
40
 
161
41
  Capybara.save_path = Howitzer.log_dir
162
- Capybara::Screenshot.register_driver(:phantomjs) do |driver, path|
163
- driver.browser.save_screenshot path
164
- end
165
- Capybara::Screenshot.register_driver(:headless_chrome) do |driver, path|
166
- driver.browser.save_screenshot path
167
- end
42
+
168
43
  Capybara::Screenshot.append_timestamp = false
169
44
  Capybara::Screenshot.register_filename_prefix_formatter(:default) do
170
45
  "capybara-screenshot-#{Gen.serial}"