howitzer 2.5.0 → 2.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -3
- data/MAINTENANCE.md +31 -0
- data/README.md +1 -1
- data/Rakefile +40 -0
- data/bin/howitzer +10 -10
- data/generators/base_generator.rb +18 -8
- data/generators/root/root_generator.rb +5 -1
- data/generators/root/templates/.dockerignore +13 -0
- data/generators/root/templates/.gitignore +21 -0
- data/generators/root/templates/.rubocop.yml.erb +71 -0
- data/generators/root/templates/Dockerfile +34 -0
- data/generators/root/templates/README.md.erb +33 -0
- data/generators/root/templates/docker-compose.yml.erb +9 -0
- data/generators/turnip/templates/.rspec +1 -0
- data/howitzer.gemspec +48 -0
- data/lib/howitzer/utils/argument_convertable.rb +54 -0
- data/lib/howitzer/utils.rb +1 -0
- data/lib/howitzer/version.rb +1 -1
- data/lib/howitzer/web/element_dsl.rb +2 -54
- data/lib/howitzer/web/page_dsl.rb +1 -1
- data/lib/howitzer/web/section_dsl.rb +23 -23
- metadata +17 -62
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e852d31ef96f01da8783feb0688f34901f36958feb9502a4acaf039b0222a784
|
4
|
+
data.tar.gz: db26af1725f61c09a8eada615759f7faf328eb31842f1037fe8c3c420b3a5f0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f186c042c5e2e408b447efab984d7ee29c02da4f3914ae6fc8c78fd7e0c9a07a4cbbfd4e82d09b498b66dc77bcebdde0b33413d1321bc03a45ca276184308e39
|
7
|
+
data.tar.gz: 87cf762790229be3a790c03958d2bd1320b91a7b4383b183ada710b85f56f77ff222fda0d4fbe629331a850a31e0f9565688beab1462406a4d460bd1d27855a4
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,25 @@
|
|
1
|
-
## [
|
1
|
+
## [2.6.0](https://github.com/strongqa/howitzer/compare/v2.5.0...v2.6.0) (2023-01-16)
|
2
2
|
|
3
|
-
### New Features
|
4
3
|
|
5
|
-
###
|
4
|
+
### Features
|
5
|
+
|
6
|
+
* Add Docker support ([#321](https://github.com/strongqa/howitzer/issues/321)) ([d0e7bc9](https://github.com/strongqa/howitzer/commit/d0e7bc953182b13e93b74ab4b609316ece6cf956))
|
7
|
+
* Ruby3.2 support ([#327](https://github.com/strongqa/howitzer/issues/327)) ([265acc3](https://github.com/strongqa/howitzer/commit/265acc34fb2eac9b879e097ae938e66c62a6e7f7))
|
8
|
+
|
9
|
+
|
10
|
+
### Bug Fixes
|
11
|
+
|
12
|
+
* Handle section options ([#324](https://github.com/strongqa/howitzer/issues/324)) ([b976e5b](https://github.com/strongqa/howitzer/commit/b976e5b83800fa1c0671857daba796dd8a1048f4))
|
13
|
+
* Section method typo ([#318](https://github.com/strongqa/howitzer/issues/318)) ([984deeb](https://github.com/strongqa/howitzer/commit/984deebe817d27278b93517b3f0e1338af25128a))
|
14
|
+
|
15
|
+
## [2.6.1](https://github.com/strongqa/howitzer/compare/v2.6.0...v2.6.1) (2023-02-24)
|
16
|
+
|
17
|
+
|
18
|
+
### Bug Fixes
|
19
|
+
|
20
|
+
* add missing hidden files to gem ([#335](https://github.com/strongqa/howitzer/issues/335)) ([60d0559](https://github.com/strongqa/howitzer/commit/60d0559df9e639d72eaf3428979e2fd4de04137b))
|
21
|
+
* changed Target ruby version ([#329](https://github.com/strongqa/howitzer/issues/329)) ([911d4a7](https://github.com/strongqa/howitzer/commit/911d4a7ce7690d0d1edd2e14ae34ae0a8d5d23a7))
|
22
|
+
* dev dependecies moved to Gemfile ([#333](https://github.com/strongqa/howitzer/issues/333)) ([ed289de](https://github.com/strongqa/howitzer/commit/ed289deada87bf18d80a5104e7b3cb774499c90f))
|
6
23
|
|
7
24
|
## [2.5.0](https://github.com/strongqa/howitzer/compare/v2.4.0...v2.5.0) (2022-08-16)
|
8
25
|
|
data/MAINTENANCE.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# Howitzer Maintenance
|
2
|
+
|
3
|
+
This guide provides detailed instructions how to release a new Howitzer version
|
4
|
+
|
5
|
+
To release a new Howitzer version:
|
6
|
+
|
7
|
+
* Make sure all pull requests have been merged to master branch
|
8
|
+
* Make sure last build is passed in [TravisCI](https://app.travis-ci.com/github/strongqa/howitzer)
|
9
|
+
* Make sure the code is covered 100% in [Codecov](https://codecov.io/gh/strongqa/howitzer/branch/master)
|
10
|
+
* Make sure the code is documented 100% with following command:
|
11
|
+
```
|
12
|
+
rake yard
|
13
|
+
```
|
14
|
+
* [Upgrade](https://github.com/strongqa/howitzer/wiki/Migration-to-new-version) Howitzer examples [Cucumber](https://github.com/strongqa/howitzer_example_cucumber), [Rspec](https://github.com/strongqa/howitzer_example_rspec) and [Turnip](https://github.com/strongqa/howitzer_example_turnip) to last version of code from master and make sure all builds are green
|
15
|
+
* Bump [version](lib/howitzer/version.rb). Please note howitzer uses [semantic versioning](https://semver.org/)
|
16
|
+
* Verify and actualize [ChangeLog](CHANGELOG.md)
|
17
|
+
* Commit all changes and push to origin master
|
18
|
+
* Specify credentials for Rubygems.org (once only) with following commands:
|
19
|
+
```bash
|
20
|
+
curl https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials
|
21
|
+
chmod 0600 ~/.gem/credentials
|
22
|
+
```
|
23
|
+
* Release Gem with following command:
|
24
|
+
```bash
|
25
|
+
rake release
|
26
|
+
```
|
27
|
+
* Verify successful release on [Rubygems](https://rubygems.org/gems/howitzer)
|
28
|
+
* Force API documentation indexing for the new version on [Rubygems](https://rubygems.org/gems/howitzer)
|
29
|
+
* Update new link to documentation on [web site](https://github.com/romikoops/howitzer-framework.io/tree/gh-pages) Note: The web site will be updated automatically after pushing code to Github
|
30
|
+
* Update [Howitzer Guides](https://github.com/strongqa/docs.howitzer-framework.io/blob/gh-pages/README.md) regarding new changes
|
31
|
+
* Notify Community (Gitter, Twitter, Google Group) about the new release
|
data/README.md
CHANGED
@@ -11,7 +11,7 @@
|
|
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
13
|
<a href="https://rubygems.org/gems/howitzer"><img src="https://img.shields.io/gem/v/howitzer.svg" /></a>
|
14
|
-
<a href="https://
|
14
|
+
<a href="https://github.com/strongqa/howitzer/actions/workflows/ci.yml"><img src="https://github.com/strongqa/howitzer/actions/workflows/ci.yml/badge.svg" /></a>
|
15
15
|
<a href="https://codeclimate.com/github/strongqa/howitzer"><img src="https://codeclimate.com/github/strongqa/howitzer.png" /></a>
|
16
16
|
<a href="https://codecov.io/gh/strongqa/howitzer">
|
17
17
|
<img src="https://codecov.io/gh/strongqa/howitzer/branch/master/graph/badge.svg?token=vB8DYQtmjA"/>
|
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
Bundler.setup
|
4
|
+
|
5
|
+
require 'rake'
|
6
|
+
require 'yard'
|
7
|
+
require 'stringio'
|
8
|
+
require 'rspec/core/rake_task'
|
9
|
+
require 'cucumber/rake/task'
|
10
|
+
require 'rubocop/rake_task'
|
11
|
+
|
12
|
+
Bundler::GemHelper.install_tasks
|
13
|
+
RSpec::Core::RakeTask.new(:spec) { |_spec| nil }
|
14
|
+
|
15
|
+
Cucumber::Rake::Task.new(:cucumber, 'Run all cucumber features') do |t|
|
16
|
+
t.fork = false
|
17
|
+
t.cucumber_opts = %w[--publish-quiet]
|
18
|
+
end
|
19
|
+
|
20
|
+
RuboCop::RakeTask.new
|
21
|
+
|
22
|
+
YARD::Rake::YardocTask.new { |_t| nil }
|
23
|
+
|
24
|
+
namespace :yard do
|
25
|
+
desc 'Validate yard coverage'
|
26
|
+
task :validate do
|
27
|
+
log = StringIO.new
|
28
|
+
YARD::Logger.instance(log)
|
29
|
+
doc = YARD::CLI::Yardoc.new
|
30
|
+
doc.use_document_file = false
|
31
|
+
doc.use_yardopts_file = false
|
32
|
+
doc.generate = false
|
33
|
+
doc.run('stats --list-undoc')
|
34
|
+
output = log.string
|
35
|
+
puts output
|
36
|
+
exit(1) unless output.include?('100.00% documented')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
task default: %i[rubocop yard:validate spec cucumber]
|
data/bin/howitzer
CHANGED
@@ -31,21 +31,21 @@ module HowitzerCli
|
|
31
31
|
Dir.mkdir(path_to_dir)
|
32
32
|
puts " #{ColorizedString.new('Created').light_green} './#{args.first}' folder"
|
33
33
|
Dir.chdir(path_to_dir)
|
34
|
-
Howitzer::ConfigGenerator.new(options)
|
35
|
-
Howitzer::WebGenerator.new(options)
|
36
|
-
Howitzer::TasksGenerator.new(options)
|
37
|
-
Howitzer::EmailsGenerator.new(options)
|
38
|
-
Howitzer::RootGenerator.new(options)
|
39
|
-
Howitzer::PrerequisitesGenerator.new(options)
|
34
|
+
Howitzer::ConfigGenerator.new(options, args)
|
35
|
+
Howitzer::WebGenerator.new(options, args)
|
36
|
+
Howitzer::TasksGenerator.new(options, args)
|
37
|
+
Howitzer::EmailsGenerator.new(options, args)
|
38
|
+
Howitzer::RootGenerator.new(options, args)
|
39
|
+
Howitzer::PrerequisitesGenerator.new(options, args)
|
40
40
|
if options[:cucumber]
|
41
|
-
Howitzer::CucumberGenerator.new(options)
|
41
|
+
Howitzer::CucumberGenerator.new(options, args)
|
42
42
|
elsif options[:rspec]
|
43
|
-
Howitzer::RspecGenerator.new(options)
|
43
|
+
Howitzer::RspecGenerator.new(options, args)
|
44
44
|
elsif options['turnip']
|
45
|
-
Howitzer::TurnipGenerator.new(options)
|
45
|
+
Howitzer::TurnipGenerator.new(options, args)
|
46
46
|
end
|
47
47
|
puts ColorizedString.new('[WARN] Extra parameters were skipped').yellow if args.size > 1
|
48
|
-
elsif args.
|
48
|
+
elsif args.empty?
|
49
49
|
exit_now!(ColorizedString.new('Please specify <PROJECT NAME>').red, 64)
|
50
50
|
end
|
51
51
|
end
|
@@ -54,8 +54,8 @@ module Howitzer
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
def initialize
|
58
|
-
super
|
57
|
+
def initialize
|
58
|
+
super
|
59
59
|
|
60
60
|
manifest.each do |type, list|
|
61
61
|
case type
|
@@ -72,6 +72,12 @@ module Howitzer
|
|
72
72
|
[]
|
73
73
|
end
|
74
74
|
|
75
|
+
def template_context
|
76
|
+
data = options
|
77
|
+
data = options.merge(project_name: project_name) unless project_name.nil?
|
78
|
+
OpenStruct.new(data) # rubocop:disable Style/OpenStructUse
|
79
|
+
end
|
80
|
+
|
75
81
|
protected
|
76
82
|
|
77
83
|
def copy_files(list)
|
@@ -90,7 +96,7 @@ module Howitzer
|
|
90
96
|
else
|
91
97
|
write_template(destination_path, source_path)
|
92
98
|
puts_info "#{ColorizedString.new('Added').light_green} template '#{data[:source]}' with " \
|
93
|
-
"params '#{
|
99
|
+
"params '#{template_context.to_h}' to destination '#{data[:destination]}'"
|
94
100
|
end
|
95
101
|
end
|
96
102
|
end
|
@@ -118,8 +124,10 @@ module Howitzer
|
|
118
124
|
end
|
119
125
|
|
120
126
|
def write_template(dest_path, source_path)
|
121
|
-
File.write(
|
122
|
-
|
127
|
+
File.write(
|
128
|
+
dest_path,
|
129
|
+
ERB.new(File.read(source_path), trim_mode: '-').result(template_context.instance_eval { binding })
|
130
|
+
)
|
123
131
|
end
|
124
132
|
|
125
133
|
private
|
@@ -177,14 +185,16 @@ module Howitzer
|
|
177
185
|
|
178
186
|
# Parent class for all generators
|
179
187
|
class BaseGenerator
|
180
|
-
attr_reader :options
|
188
|
+
attr_reader :options, :args, :project_name
|
181
189
|
|
182
190
|
include Outputable
|
183
191
|
include Copyable
|
184
192
|
|
185
|
-
def initialize(options = {})
|
193
|
+
def initialize(options = {}, args = [])
|
186
194
|
@options = options.symbolize_keys
|
187
|
-
|
195
|
+
@args = args
|
196
|
+
@project_name = args.first
|
197
|
+
super()
|
188
198
|
end
|
189
199
|
end
|
190
200
|
end
|
@@ -7,12 +7,16 @@ module Howitzer
|
|
7
7
|
{ files:
|
8
8
|
[
|
9
9
|
{ source: '.gitignore', destination: '.gitignore' },
|
10
|
+
{ source: '.dockerignore', destination: '.dockerignore' },
|
11
|
+
{ source: 'Dockerfile', destination: 'Dockerfile' },
|
10
12
|
{ source: 'Rakefile', destination: 'Rakefile' }
|
11
13
|
],
|
12
14
|
templates:
|
13
15
|
[
|
14
16
|
{ source: '.rubocop.yml.erb', destination: '.rubocop.yml' },
|
15
|
-
{ source: '
|
17
|
+
{ source: 'docker-compose.yml.erb', destination: 'docker-compose.yml' },
|
18
|
+
{ source: 'Gemfile.erb', destination: 'Gemfile' },
|
19
|
+
{ source: 'README.md.erb', destination: 'README.md' }
|
16
20
|
] }
|
17
21
|
end
|
18
22
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
.idea/
|
2
|
+
custom.yml
|
3
|
+
bin/
|
4
|
+
log/
|
5
|
+
eylogs/
|
6
|
+
spec/results/
|
7
|
+
spec/sandbox/
|
8
|
+
tmp/
|
9
|
+
*.swp
|
10
|
+
*.orig
|
11
|
+
.rakeTasks
|
12
|
+
.bundle
|
13
|
+
.DS_STORE
|
14
|
+
.DS_Store
|
15
|
+
*.xml
|
16
|
+
*.log
|
17
|
+
*.pem
|
18
|
+
build-number.txt
|
19
|
+
sauce_connect.log*
|
20
|
+
*.*~
|
21
|
+
capybara-*.html
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# See full list of defaults here: https://github.com/bbatsov/rubocop/blob/master/config/default.yml
|
2
|
+
# To see all cops used see here: https://github.com/bbatsov/rubocop/blob/master/config/enabled.yml
|
3
|
+
<% if rspec || turnip -%>
|
4
|
+
require: rubocop-rspec
|
5
|
+
<% end -%>
|
6
|
+
|
7
|
+
AllCops:
|
8
|
+
DisplayCopNames: true
|
9
|
+
NewCops: enable
|
10
|
+
TargetRubyVersion: 3
|
11
|
+
|
12
|
+
Layout/CaseIndentation:
|
13
|
+
Enabled: false
|
14
|
+
|
15
|
+
Layout/LineLength:
|
16
|
+
Max: 120
|
17
|
+
<% if cucumber -%>
|
18
|
+
|
19
|
+
Lint/AmbiguousBlockAssociation:
|
20
|
+
Enabled: false
|
21
|
+
<% end -%>
|
22
|
+
|
23
|
+
Lint/AmbiguousRegexpLiteral:
|
24
|
+
Enabled: false
|
25
|
+
|
26
|
+
Metrics/BlockLength:
|
27
|
+
Enabled: false
|
28
|
+
|
29
|
+
Metrics/ModuleLength:
|
30
|
+
Max: 150
|
31
|
+
|
32
|
+
Style/CaseEquality:
|
33
|
+
Enabled: false
|
34
|
+
|
35
|
+
Style/Documentation:
|
36
|
+
Enabled: false
|
37
|
+
|
38
|
+
Style/EmptyElse:
|
39
|
+
Enabled: false
|
40
|
+
|
41
|
+
Style/FrozenStringLiteralComment:
|
42
|
+
Enabled: false
|
43
|
+
<% if turnip -%>
|
44
|
+
|
45
|
+
Style/MixinGrouping:
|
46
|
+
EnforcedStyle: separated
|
47
|
+
Exclude:
|
48
|
+
- '**/*_steps.rb'
|
49
|
+
<% end -%>
|
50
|
+
<% if cucumber || turnip -%>
|
51
|
+
|
52
|
+
Style/SymbolProc:
|
53
|
+
Exclude:
|
54
|
+
<% if cucumber -%>
|
55
|
+
- 'features/step_definitions/**/*.rb'
|
56
|
+
<%- end -%>
|
57
|
+
<% if turnip -%>
|
58
|
+
- 'spec/steps/**/*.rb'
|
59
|
+
<%- end -%>
|
60
|
+
<% end -%>
|
61
|
+
<% if rspec || turnip -%>
|
62
|
+
|
63
|
+
RSpec/Capybara/FeatureMethods:
|
64
|
+
Enabled: false
|
65
|
+
|
66
|
+
RSpec/ExampleLength:
|
67
|
+
Max: 40
|
68
|
+
|
69
|
+
RSpec/MultipleExpectations:
|
70
|
+
Max: 8
|
71
|
+
<% end -%>
|
@@ -0,0 +1,34 @@
|
|
1
|
+
FROM ruby:alpine
|
2
|
+
|
3
|
+
ENV CHROME_BIN=/usr/bin/chromium-browser \
|
4
|
+
CHROME_PATH=/usr/lib/chromium/ \
|
5
|
+
SEXY_SETTINGS_DELIMITER=";" \
|
6
|
+
CHROME_ARGS="window-size=1920x1080, disable-gpu, no-sandbox, disable-dev-shm-usage, disable-software-rasterizer"
|
7
|
+
|
8
|
+
RUN apk update && apk upgrade --no-cache --available \
|
9
|
+
&& apk add --no-cache \
|
10
|
+
chromium firefox \
|
11
|
+
chromium-chromedriver \
|
12
|
+
ttf-freefont \
|
13
|
+
font-noto-emoji \
|
14
|
+
build-base bash \
|
15
|
+
curl \
|
16
|
+
git \
|
17
|
+
less dbus \
|
18
|
+
&& apk add --no-cache \
|
19
|
+
--repository=https://dl-cdn.alpinelinux.org/alpine/edge/testing font-wqy-zenhei \
|
20
|
+
&& wget https://github.com/mozilla/geckodriver/releases/download/v0.31.0/geckodriver-v0.31.0-linux64.tar.gz \
|
21
|
+
&& tar -zxf geckodriver-v0.31.0-linux64.tar.gz -C /usr/bin \
|
22
|
+
&& dbus-daemon --system
|
23
|
+
|
24
|
+
RUN adduser -D howitzer
|
25
|
+
USER howitzer
|
26
|
+
|
27
|
+
WORKDIR /home/howitzer
|
28
|
+
|
29
|
+
COPY --chown=howitzer Gemfile Gemfile.lock /home/howitzer/
|
30
|
+
RUN bundle config --global && bundle install --jobs=3 --retry=3
|
31
|
+
|
32
|
+
COPY --chown=howitzer . ./
|
33
|
+
|
34
|
+
ENTRYPOINT ["sleep", "infinity"]
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# <%= project_name %>
|
2
|
+
|
3
|
+
## Run tests in Docker
|
4
|
+
|
5
|
+
### Build an image
|
6
|
+
|
7
|
+
`docker build -t <%= project_name %> .`
|
8
|
+
|
9
|
+
### Run a container
|
10
|
+
|
11
|
+
`docker run -d --name <%= project_name %>_container <%= project_name %>
|
12
|
+
|
13
|
+
### Connect to the container
|
14
|
+
|
15
|
+
`docker exec -it <%= project_name %>_container /bin/bash`
|
16
|
+
|
17
|
+
### Run tests in the container
|
18
|
+
|
19
|
+
`SEXY_SETTINGS="driver=headless_chrome; headless_chrome_flags=$CHROME_ARGS" bundle exec rake`
|
20
|
+
|
21
|
+
or
|
22
|
+
|
23
|
+
`SEXY_SETTINGS="driver=headless_firefox" bundle exec rake`
|
24
|
+
|
25
|
+
## Run tests via docker compose
|
26
|
+
|
27
|
+
### Initialize build, and run a container in detached mode
|
28
|
+
|
29
|
+
`docker-compose -f docker-compose.yml up -d`
|
30
|
+
|
31
|
+
### Connect to the container
|
32
|
+
|
33
|
+
`docker compose exec -it <%= project_name %> /bin/bash`
|
@@ -0,0 +1 @@
|
|
1
|
+
-r turnip/rspec
|
data/howitzer.gemspec
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require File.expand_path('lib/howitzer/version', __dir__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |gem|
|
4
|
+
gem.author = 'Roman Parashchenko'
|
5
|
+
gem.email = 'howitzer@strongqa.com'
|
6
|
+
gem.description = 'Howitzer uses the best practices and design patterns allowing to generate a test project in ' \
|
7
|
+
'less than 5 minutes. It has out-of-the-box configurations for parallel cross-browser testing ' \
|
8
|
+
'in the cloud.'
|
9
|
+
gem.summary = 'Ruby based framework for acceptance testing'
|
10
|
+
gem.homepage = 'https://howitzer-framework.io/'
|
11
|
+
gem.metadata = {
|
12
|
+
'bug_tracker_uri' => 'https://github.com/strongqa/howitzer/issues',
|
13
|
+
'changelog_uri' => 'https://github.com/strongqa/howitzer/blob/master/CHANGELOG.md',
|
14
|
+
'documentation_uri' => "https://www.rubydoc.info/gems/howitzer/#{Howitzer::VERSION}",
|
15
|
+
'source_code_uri' => 'https://github.com/strongqa/howitzer',
|
16
|
+
'rubygems_mfa_required' => 'false'
|
17
|
+
}
|
18
|
+
gem.license = 'MIT'
|
19
|
+
gem.files = Dir.glob('{bin,generators,lib}/**/*', File::FNM_DOTMATCH) +
|
20
|
+
%w[
|
21
|
+
.yardopts
|
22
|
+
CHANGELOG.md
|
23
|
+
CONTRIBUTING.md
|
24
|
+
howitzer.gemspec
|
25
|
+
LICENSE
|
26
|
+
MAINTENANCE.md
|
27
|
+
Rakefile
|
28
|
+
README.md
|
29
|
+
]
|
30
|
+
gem.executables = ['howitzer']
|
31
|
+
gem.name = 'howitzer'
|
32
|
+
gem.require_path = 'lib'
|
33
|
+
gem.version = Howitzer::VERSION
|
34
|
+
gem.required_ruby_version = '>= 2.7.7'
|
35
|
+
|
36
|
+
gem.add_runtime_dependency 'activesupport', ['>= 5', '< 8']
|
37
|
+
gem.add_runtime_dependency 'capybara', '< 4.0'
|
38
|
+
gem.add_runtime_dependency 'colorize'
|
39
|
+
gem.add_runtime_dependency 'gli'
|
40
|
+
gem.add_runtime_dependency 'launchy'
|
41
|
+
gem.add_runtime_dependency 'log4r', '~>1.1.10'
|
42
|
+
gem.add_runtime_dependency 'nokogiri', '~> 1.6' if gem.platform.to_s =~ /mswin|mingw/
|
43
|
+
gem.add_runtime_dependency 'rake'
|
44
|
+
gem.add_runtime_dependency 'rspec', '~>3.2'
|
45
|
+
gem.add_runtime_dependency 'rspec-wait'
|
46
|
+
gem.add_runtime_dependency 'selenium-webdriver', '>= 3.4.1'
|
47
|
+
gem.add_runtime_dependency 'sexy_settings'
|
48
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Howitzer
|
2
|
+
module Utils
|
3
|
+
# This module mixes in private utils methods for section and element dsl
|
4
|
+
module ArgumentConvertable
|
5
|
+
private
|
6
|
+
|
7
|
+
def convert_arguments(args, options, block_args, block_options)
|
8
|
+
conv_args = args.map { |el| el.is_a?(Proc) ? proc_to_selector(el, block_args, block_options) : el }
|
9
|
+
args_options = pop_options_from_array(conv_args)
|
10
|
+
block_args_options = pop_options_from_array(block_args)
|
11
|
+
conv_options = [args_options, options, block_args_options, block_options].map do |el|
|
12
|
+
el.transform_keys(&:to_sym)
|
13
|
+
end.reduce(&:merge).except(:lambda_args)
|
14
|
+
[conv_args, conv_options]
|
15
|
+
end
|
16
|
+
|
17
|
+
def proc_to_selector(proc, block_args, block_options)
|
18
|
+
lambda_args = extract_lambda_args(block_args, block_options)
|
19
|
+
if lambda_args
|
20
|
+
if lambda_args[:keyword_args].present?
|
21
|
+
proc.call(*lambda_args[:args], **lambda_args[:keyword_args])
|
22
|
+
else
|
23
|
+
proc.call(*lambda_args[:args])
|
24
|
+
end
|
25
|
+
else
|
26
|
+
puts "WARNING! Passing lambda arguments with element options is deprecated.\n" \
|
27
|
+
"Please use 'lambda_args' method, for example: foo_element(lambda_args(title: 'Example'), wait: 10)"
|
28
|
+
proc.call(*block_args.shift(proc.arity))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def extract_lambda_args(block_args, block_options)
|
33
|
+
(block_args.first.is_a?(Hash) && block_args.first[:lambda_args]) || block_options[:lambda_args]
|
34
|
+
end
|
35
|
+
|
36
|
+
def pop_options_from_array(value)
|
37
|
+
if value.last.is_a?(Hash) && !value.last.key?(:lambda_args)
|
38
|
+
value.pop
|
39
|
+
else
|
40
|
+
{}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def lambda_args(*args, **keyword_args)
|
45
|
+
{
|
46
|
+
lambda_args: {
|
47
|
+
args: args,
|
48
|
+
keyword_args: keyword_args
|
49
|
+
}
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/howitzer/utils.rb
CHANGED
data/lib/howitzer/version.rb
CHANGED
@@ -3,67 +3,16 @@ module Howitzer
|
|
3
3
|
module Web
|
4
4
|
# This module combines element dsl methods
|
5
5
|
module ElementDsl
|
6
|
-
# This module holds element helper methods
|
7
|
-
module Helpers
|
8
|
-
private
|
9
|
-
|
10
|
-
def lambda_args(*args, **keyword_args)
|
11
|
-
{
|
12
|
-
lambda_args: {
|
13
|
-
args: args,
|
14
|
-
keyword_args: keyword_args
|
15
|
-
}
|
16
|
-
}
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
6
|
include CapybaraContextHolder
|
21
|
-
include
|
7
|
+
include Howitzer::Utils::ArgumentConvertable
|
22
8
|
|
23
9
|
def self.included(base) # :nodoc:
|
24
10
|
base.extend(ClassMethods)
|
25
11
|
end
|
26
12
|
|
27
|
-
def convert_arguments(args, options, block_args, block_options)
|
28
|
-
conv_args = args.map { |el| el.is_a?(Proc) ? proc_to_selector(el, block_args, block_options) : el }
|
29
|
-
args_options = pop_options_from_array(conv_args)
|
30
|
-
block_args_options = pop_options_from_array(block_args)
|
31
|
-
conv_options = [args_options, options, block_args_options, block_options].map do |el|
|
32
|
-
el.transform_keys(&:to_sym)
|
33
|
-
end.reduce(&:merge).except(:lambda_args)
|
34
|
-
[conv_args, conv_options]
|
35
|
-
end
|
36
|
-
|
37
|
-
def proc_to_selector(proc, block_args, block_options)
|
38
|
-
lambda_args = extract_lambda_args(block_args, block_options)
|
39
|
-
if lambda_args
|
40
|
-
if lambda_args[:keyword_args].present?
|
41
|
-
proc.call(*lambda_args[:args], **lambda_args[:keyword_args])
|
42
|
-
else
|
43
|
-
proc.call(*lambda_args[:args])
|
44
|
-
end
|
45
|
-
else
|
46
|
-
puts "WARNING! Passing lambda arguments with element options is deprecated.\n" \
|
47
|
-
"Please use 'lambda_args' method, for example: foo_element(lambda_args(title: 'Example'), wait: 10)"
|
48
|
-
proc.call(*block_args.shift(proc.arity))
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def extract_lambda_args(block_args, block_options)
|
53
|
-
(block_args.first.is_a?(Hash) && block_args.first[:lambda_args]) || block_options[:lambda_args]
|
54
|
-
end
|
55
|
-
|
56
|
-
def pop_options_from_array(value)
|
57
|
-
if value.last.is_a?(Hash) && !value.last.key?(:lambda_args)
|
58
|
-
value.pop
|
59
|
-
else
|
60
|
-
{}
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
13
|
# This module holds element dsl methods
|
65
14
|
module ClassMethods
|
66
|
-
include
|
15
|
+
include Howitzer::Utils::ArgumentConvertable
|
67
16
|
|
68
17
|
protected
|
69
18
|
|
@@ -172,7 +121,6 @@ module Howitzer
|
|
172
121
|
else
|
173
122
|
capybara_context.find(*conv_args)
|
174
123
|
end
|
175
|
-
return nil
|
176
124
|
end
|
177
125
|
private "wait_for_#{name}_element"
|
178
126
|
end
|
@@ -4,6 +4,7 @@ module Howitzer
|
|
4
4
|
# This module combines section dsl methods
|
5
5
|
module SectionDsl
|
6
6
|
include CapybaraContextHolder
|
7
|
+
include Howitzer::Utils::ArgumentConvertable
|
7
8
|
|
8
9
|
def self.included(base) # :nodoc:
|
9
10
|
base.extend(ClassMethods)
|
@@ -11,6 +12,7 @@ module Howitzer
|
|
11
12
|
|
12
13
|
# This module holds section dsl class methods
|
13
14
|
module ClassMethods
|
15
|
+
include Howitzer::Utils::ArgumentConvertable
|
14
16
|
# This class is for private usage only
|
15
17
|
class SectionScope
|
16
18
|
attr_accessor :section_class
|
@@ -61,9 +63,7 @@ module Howitzer
|
|
61
63
|
# @raise [ArgumentError] when finder arguments were not specified
|
62
64
|
|
63
65
|
def finder_options
|
64
|
-
@options
|
65
|
-
|
66
|
-
@finder_options ||= (section_class.default_finder_options || {})
|
66
|
+
@options.presence || section_class.default_finder_options || {}
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
@@ -135,45 +135,45 @@ module Howitzer
|
|
135
135
|
private
|
136
136
|
|
137
137
|
def define_section_method(klass, name, *args, **options)
|
138
|
-
define_method("#{name}_section") do
|
139
|
-
|
140
|
-
if
|
141
|
-
klass.new(self, capybara_context.find(*
|
138
|
+
define_method("#{name}_section") do |*block_args, **block_options|
|
139
|
+
conv_args, conv_options = convert_arguments(args, options, block_args, block_options)
|
140
|
+
if conv_options.present?
|
141
|
+
klass.new(self, capybara_context.find(*conv_args, **conv_options))
|
142
142
|
else
|
143
|
-
klass.new(self, capybara_context.find(*
|
143
|
+
klass.new(self, capybara_context.find(*conv_args))
|
144
144
|
end
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
148
148
|
def define_sections_method(klass, name, *args, **options)
|
149
|
-
define_method("#{name}_sections") do
|
150
|
-
|
151
|
-
if
|
152
|
-
capybara_context.all(*
|
149
|
+
define_method("#{name}_sections") do |*block_args, **block_options|
|
150
|
+
conv_args, conv_options = convert_arguments(args, options, block_args, block_options)
|
151
|
+
if conv_options.present?
|
152
|
+
capybara_context.all(*conv_args, **conv_options).map { |el| klass.new(self, el) }
|
153
153
|
else
|
154
|
-
capybara_context.all(*
|
154
|
+
capybara_context.all(*conv_args).map { |el| klass.new(self, el) }
|
155
155
|
end
|
156
156
|
end
|
157
157
|
end
|
158
158
|
|
159
159
|
def define_has_section_method(name, *args, **options)
|
160
|
-
define_method("has_#{name}_section?") do
|
161
|
-
|
162
|
-
if
|
163
|
-
capybara_context.has_selector?(*
|
160
|
+
define_method("has_#{name}_section?") do |*block_args, **block_options|
|
161
|
+
conv_args, conv_options = convert_arguments(args, options, block_args, block_options)
|
162
|
+
if conv_options.present?
|
163
|
+
capybara_context.has_selector?(*conv_args, **conv_options)
|
164
164
|
else
|
165
|
-
capybara_context.has_selector?(*
|
165
|
+
capybara_context.has_selector?(*conv_args)
|
166
166
|
end
|
167
167
|
end
|
168
168
|
end
|
169
169
|
|
170
170
|
def define_has_no_section_method(name, *args, **options)
|
171
|
-
define_method("has_no_#{name}_section?") do
|
172
|
-
|
173
|
-
if
|
174
|
-
capybara_context.has_no_selector?(*
|
171
|
+
define_method("has_no_#{name}_section?") do |*block_args, **block_options|
|
172
|
+
conv_args, conv_options = convert_arguments(args, options, block_args, block_options)
|
173
|
+
if conv_options.present?
|
174
|
+
capybara_context.has_no_selector?(*conv_args, **conv_options)
|
175
175
|
else
|
176
|
-
capybara_context.has_no_selector?(*
|
176
|
+
capybara_context.has_no_selector?(*conv_args)
|
177
177
|
end
|
178
178
|
end
|
179
179
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: howitzer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roman Parashchenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '5'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '8'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '5'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '8'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: capybara
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -170,62 +170,6 @@ dependencies:
|
|
170
170
|
- - ">="
|
171
171
|
- !ruby/object:Gem::Version
|
172
172
|
version: '0'
|
173
|
-
- !ruby/object:Gem::Dependency
|
174
|
-
name: aruba
|
175
|
-
requirement: !ruby/object:Gem::Requirement
|
176
|
-
requirements:
|
177
|
-
- - ">="
|
178
|
-
- !ruby/object:Gem::Version
|
179
|
-
version: '0'
|
180
|
-
type: :development
|
181
|
-
prerelease: false
|
182
|
-
version_requirements: !ruby/object:Gem::Requirement
|
183
|
-
requirements:
|
184
|
-
- - ">="
|
185
|
-
- !ruby/object:Gem::Version
|
186
|
-
version: '0'
|
187
|
-
- !ruby/object:Gem::Dependency
|
188
|
-
name: ffaker
|
189
|
-
requirement: !ruby/object:Gem::Requirement
|
190
|
-
requirements:
|
191
|
-
- - ">="
|
192
|
-
- !ruby/object:Gem::Version
|
193
|
-
version: '0'
|
194
|
-
type: :development
|
195
|
-
prerelease: false
|
196
|
-
version_requirements: !ruby/object:Gem::Requirement
|
197
|
-
requirements:
|
198
|
-
- - ">="
|
199
|
-
- !ruby/object:Gem::Version
|
200
|
-
version: '0'
|
201
|
-
- !ruby/object:Gem::Dependency
|
202
|
-
name: fuubar
|
203
|
-
requirement: !ruby/object:Gem::Requirement
|
204
|
-
requirements:
|
205
|
-
- - ">="
|
206
|
-
- !ruby/object:Gem::Version
|
207
|
-
version: '0'
|
208
|
-
type: :development
|
209
|
-
prerelease: false
|
210
|
-
version_requirements: !ruby/object:Gem::Requirement
|
211
|
-
requirements:
|
212
|
-
- - ">="
|
213
|
-
- !ruby/object:Gem::Version
|
214
|
-
version: '0'
|
215
|
-
- !ruby/object:Gem::Dependency
|
216
|
-
name: yard
|
217
|
-
requirement: !ruby/object:Gem::Requirement
|
218
|
-
requirements:
|
219
|
-
- - ">="
|
220
|
-
- !ruby/object:Gem::Version
|
221
|
-
version: '0'
|
222
|
-
type: :development
|
223
|
-
prerelease: false
|
224
|
-
version_requirements: !ruby/object:Gem::Requirement
|
225
|
-
requirements:
|
226
|
-
- - ">="
|
227
|
-
- !ruby/object:Gem::Version
|
228
|
-
version: '0'
|
229
173
|
description: Howitzer uses the best practices and design patterns allowing to generate
|
230
174
|
a test project in less than 5 minutes. It has out-of-the-box configurations for
|
231
175
|
parallel cross-browser testing in the cloud.
|
@@ -239,7 +183,9 @@ files:
|
|
239
183
|
- CHANGELOG.md
|
240
184
|
- CONTRIBUTING.md
|
241
185
|
- LICENSE
|
186
|
+
- MAINTENANCE.md
|
242
187
|
- README.md
|
188
|
+
- Rakefile
|
243
189
|
- bin/howitzer
|
244
190
|
- generators/base_generator.rb
|
245
191
|
- generators/config/config_generator.rb
|
@@ -272,14 +218,21 @@ files:
|
|
272
218
|
- generators/prerequisites/templates/user.rb
|
273
219
|
- generators/prerequisites/templates/users.rb
|
274
220
|
- generators/root/root_generator.rb
|
221
|
+
- generators/root/templates/.dockerignore
|
222
|
+
- generators/root/templates/.gitignore
|
223
|
+
- generators/root/templates/.rubocop.yml.erb
|
224
|
+
- generators/root/templates/Dockerfile
|
275
225
|
- generators/root/templates/Gemfile.erb
|
226
|
+
- generators/root/templates/README.md.erb
|
276
227
|
- generators/root/templates/Rakefile
|
228
|
+
- generators/root/templates/docker-compose.yml.erb
|
277
229
|
- generators/rspec/rspec_generator.rb
|
278
230
|
- generators/rspec/templates/example_spec.rb
|
279
231
|
- generators/rspec/templates/rspec.rake
|
280
232
|
- generators/rspec/templates/spec_helper.rb
|
281
233
|
- generators/tasks/tasks_generator.rb
|
282
234
|
- generators/tasks/templates/common.rake
|
235
|
+
- generators/turnip/templates/.rspec
|
283
236
|
- generators/turnip/templates/common_steps.rb
|
284
237
|
- generators/turnip/templates/example.feature
|
285
238
|
- generators/turnip/templates/spec_helper.rb
|
@@ -289,6 +242,7 @@ files:
|
|
289
242
|
- generators/web/templates/example_page.rb
|
290
243
|
- generators/web/templates/menu_section.rb
|
291
244
|
- generators/web/web_generator.rb
|
245
|
+
- howitzer.gemspec
|
292
246
|
- lib/howitzer.rb
|
293
247
|
- lib/howitzer/cache.rb
|
294
248
|
- lib/howitzer/capybara_helpers.rb
|
@@ -322,6 +276,7 @@ files:
|
|
322
276
|
- lib/howitzer/testmail_api.rb
|
323
277
|
- lib/howitzer/testmail_api/client.rb
|
324
278
|
- lib/howitzer/utils.rb
|
279
|
+
- lib/howitzer/utils/argument_convertable.rb
|
325
280
|
- lib/howitzer/utils/string_extensions.rb
|
326
281
|
- lib/howitzer/version.rb
|
327
282
|
- lib/howitzer/web.rb
|
@@ -342,7 +297,7 @@ licenses:
|
|
342
297
|
metadata:
|
343
298
|
bug_tracker_uri: https://github.com/strongqa/howitzer/issues
|
344
299
|
changelog_uri: https://github.com/strongqa/howitzer/blob/master/CHANGELOG.md
|
345
|
-
documentation_uri: https://www.rubydoc.info/gems/howitzer/2.
|
300
|
+
documentation_uri: https://www.rubydoc.info/gems/howitzer/2.6.1
|
346
301
|
source_code_uri: https://github.com/strongqa/howitzer
|
347
302
|
rubygems_mfa_required: 'false'
|
348
303
|
post_install_message:
|
@@ -353,7 +308,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
353
308
|
requirements:
|
354
309
|
- - ">="
|
355
310
|
- !ruby/object:Gem::Version
|
356
|
-
version: 2.
|
311
|
+
version: 2.7.7
|
357
312
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
358
313
|
requirements:
|
359
314
|
- - ">="
|