berl 1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b985f2fdec9a27e3b71783c2dfd9eb0601dc8937127719c5efc0e86bf40cb764
4
+ data.tar.gz: f2200d3200870cf1ab3098ad884d63ed88fe88c9705e55913137a8a54830911b
5
+ SHA512:
6
+ metadata.gz: a88c86d2b61cea104976e86a2546b9980067839a4b36ab594b0259815065bc0e8122a0e50450d8d8d231aeba1848ce53717bc29833fc221d38b975102cc72aef
7
+ data.tar.gz: 0a8430a7c91350c99ca9d750dfc0301671199c14c668cc7fb65a4d72649f3473ea58cf84440373399680a4c2d5ec3fdd96617da5f2d33e79a73fcf892a373697
data/exe/berl ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'berl'
4
+
5
+ Berl.application.run
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Berl
4
+ class Application
5
+ def run
6
+ start = Time.now
7
+
8
+ number_of_workers = ENV['PARALLELE_WORKERS'].to_s.to_i
9
+
10
+ database_wizard = DatabaseWizard.new
11
+ database_wizard.initialize_num_of_databases(number_of_workers)
12
+ suites = SuitesResolver.resolve_suites
13
+
14
+ behat_runner = BehatRunner.new(number_of_workers, suites, database_wizard.databases)
15
+ behat_runner.start
16
+
17
+ behat_runner.print_errors
18
+
19
+ puts "Finished in #{Time.now - start} seconds"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Berl
4
+ # Service to run Behat tests
5
+ class BehatRunner
6
+ attr_reader :num_of_succeed, :num_of_failed
7
+
8
+ def initialize(num_of_workers, suites, databases)
9
+ @num_of_succeed = 0
10
+ @num_of_failed = 0
11
+ @num_of_workers = num_of_workers
12
+ @suites = suites
13
+ @databases = databases
14
+ @output = {}
15
+ end
16
+
17
+ def start
18
+ Parallel.each(
19
+ @suites,
20
+ in_processes: @num_of_workers,
21
+ finish: method(:handle_finish)
22
+ ) do |suite|
23
+ database = @databases[Parallel.worker_number]
24
+ cache = "cache_#{Parallel.worker_number}"
25
+
26
+ behat_cmd = build_behat_cmd(database, cache, suite)
27
+ Open3.popen3(behat_cmd) do |_, stdout, _, wait_thr|
28
+ result = {}
29
+ result['output'] = []
30
+
31
+ result['output'].push(*stdout.readlines) if wait_thr.value != 0
32
+
33
+ result['suite_name'] = suite
34
+ result['status'] = wait_thr.value == 0 ? 'success' : 'fail'
35
+
36
+ result
37
+ end
38
+ end
39
+ end
40
+
41
+ def build_behat_cmd(database, cache, suite)
42
+ cmd = []
43
+ cmd.push("DATABASE_URL=#{database}")
44
+ cmd.push("PARALLELE_CACHE_DIR=#{cache}")
45
+ cmd.push("php vendor/bin/behat --suite='#{suite}'")
46
+ cmd.push("--tags='~@javascript&&~@todo&&~@cli'")
47
+ cmd.push('--colors --strict --no-interaction -vvv -f progress')
48
+
49
+ cmd.join(' ')
50
+ end
51
+
52
+ private :build_behat_cmd
53
+
54
+ def handle_finish(_, _, result)
55
+ if result['status'] == 'success'
56
+ @num_of_succeed += 1
57
+ puts "āœ… #{result['suite_name']} (#{num_of_executed}/#{@suites.count})"
58
+
59
+ return
60
+ end
61
+
62
+ @num_of_failed += 1
63
+ @output[result['suite_name']] = result['output']
64
+ puts "āŒ #{result['suite_name']} (#{num_of_executed}/#{@suites.count})"
65
+ end
66
+
67
+ def num_of_executed
68
+ @num_of_succeed + @num_of_failed
69
+ end
70
+
71
+ private :num_of_executed
72
+
73
+ def print_errors
74
+ puts "\n\n 🚨 Errors for failed suites:"
75
+ @output.each do |suite_name, output|
76
+ puts "\nāŒ #{suite_name}"
77
+ puts output
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,9 @@
1
+ require 'berl/application'
2
+
3
+ module Berl
4
+ class << self
5
+ def application
6
+ @application ||= Berl::Application.new
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'parallel'
4
+ require 'open3'
5
+
6
+ # Service to setup databases
7
+ class DatabaseWizard
8
+ attr_reader :databases
9
+
10
+ def initialize
11
+ @databases = []
12
+ @num_of_set_up_databases = 0
13
+ end
14
+
15
+ def initialize_num_of_databases(num_of_databases)
16
+ Parallel.each(1..num_of_databases, in_processes: 4, finish: method(:handle_finish)) do |i|
17
+ database_connection_string = "mysql://root:root_password@db/sylius_#{i}?charset=utf8mb4"
18
+
19
+ setup_db_cmd = build_setup_db_cmd(database_connection_string)
20
+ Open3.popen3(setup_db_cmd) do |_, _, _, _|
21
+ database_connection_string
22
+ end
23
+ end
24
+ end
25
+
26
+ def build_setup_db_cmd(database)
27
+ cmd = []
28
+ cmd.push("DATABASE_URL=#{database} php bin/console doctrine:database:create --if-not-exists -e test")
29
+ cmd.push("DATABASE_URL=#{database} php bin/console doctrine:schema:update -f -e test")
30
+ cmd.push("DATABASE_URL=#{database} php bin/console sylius:fixture:load -n -e test")
31
+
32
+ cmd.join(' ')
33
+ end
34
+
35
+ private :build_setup_db_cmd
36
+
37
+ def handle_finish(_, _, result)
38
+ @num_of_set_up_databases += 1
39
+ puts "šŸ”§ Database #{@num_of_set_up_databases} set up"
40
+ @databases.push(result)
41
+ end
42
+
43
+ private :handle_finish
44
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Service to resolve suites
4
+ class SuitesResolver
5
+ def self.resolve_suites
6
+ suites_path = ENV['PARALLELE_SCENARIOS_PATH']
7
+
8
+ files = Dir.glob("#{Dir.pwd}/#{suites_path}/**/*.{yml,yaml}")
9
+ suites = []
10
+
11
+ files.each do |path|
12
+ content = IO.read(path)
13
+ match = content.match(/\s+((api|ui|domain)[^:]+)/)
14
+ suite = match.to_s.strip
15
+
16
+ suites.push(suite) if suite.length.positive?
17
+ end
18
+
19
+ suites
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Berl
4
+ VERSION = '1.0.1'
5
+
6
+ module Version # :nodoc: all
7
+ MAJOR, MINOR, BUILD, *OTHER = Berl::VERSION.split '.'
8
+ end
9
+ end
data/lib/berl.rb ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Berl; end
4
+
5
+ require 'singleton'
6
+
7
+ require 'berl/application'
8
+ require 'berl/behat_runner'
9
+ require 'berl/berl_module'
10
+ require 'berl/database_wizard'
11
+ require 'berl/suites_resolver'
12
+ require 'berl/version'
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: berl
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jakub Tobiasz
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-01-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: parallel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.21'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.21'
27
+ description:
28
+ email:
29
+ - jakub@alphpaca.io
30
+ executables:
31
+ - berl
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - exe/berl
36
+ - lib/berl.rb
37
+ - lib/berl/application.rb
38
+ - lib/berl/behat_runner.rb
39
+ - lib/berl/berl_module.rb
40
+ - lib/berl/database_wizard.rb
41
+ - lib/berl/suites_resolver.rb
42
+ - lib/berl/version.rb
43
+ homepage:
44
+ licenses: []
45
+ metadata: {}
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 3.2.0
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubygems_version: 3.4.1
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: Parallel Behat runner
65
+ test_files: []