bashcov 3.2.0 → 4.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7fa991330e449d30bbbb4ee7fa85903164e34ece8eeff6a656434a6bb87b4e04
4
- data.tar.gz: 8acfbe356138dd648b9d85fb3d3344b8c7e55c65a6b9e8cc9a22f4ff5e15a50b
3
+ metadata.gz: bf955fd7135b192e4da886b5f8348f73422e06fd658bfdf11935533f3522f197
4
+ data.tar.gz: d63c79fce3a315693f96a32a6a4fe7a40c94ea32c3bfd7a0019c9a94cb67c145
5
5
  SHA512:
6
- metadata.gz: d553f6724297e945a69a75f78723b2b2733843999d4dc7e485593b4d368a77fe81e647254e6bc37e9fa4e80fe2f99270a8267b90c5b6cd98b41de60863284420
7
- data.tar.gz: f3263ac5329d63c30c3b56deddd53f4f6c9a69d8cd9bf4dd350ae10fe8497dc88fe0670b41a9ee21d2bb73acafb0c50fd39edcdd768d3be3e601298266491430
6
+ metadata.gz: b7e891c4b1b9d272c0c11f44bb008deda2aff88f33bf5d0c9068d5f4a396f7efaa1bd915610b498126d07bef2e9512b2a4efd88dd76cef19d58b9d89d796b51b
7
+ data.tar.gz: 7a26df75b930a634741ef9f9e6a1d23c80be4a05dd1164623c7f1b907f3ae76450ed3694fe2d64201e59171fdde8638af9db726853849fc644acf8309bc583e0
data/.rubocop.yml CHANGED
@@ -3,7 +3,7 @@ plugins:
3
3
  - rubocop-rspec
4
4
 
5
5
  AllCops:
6
- TargetRubyVersion: 3.0
6
+ TargetRubyVersion: 3.2
7
7
  NewCops: enable
8
8
  # Ignore files ignored by Git. Improved version of the template shown here:
9
9
  # https://docs.rubocop.org/rubocop/configuration.html#pre-processing
@@ -68,8 +68,11 @@ Style/StringLiterals:
68
68
  Style/SpecialGlobalVars:
69
69
  Enabled: false
70
70
 
71
+ Style/TrailingCommaInArguments:
72
+ EnforcedStyleForMultiline: consistent_comma
73
+
71
74
  Style/TrailingCommaInArrayLiteral:
72
- EnforcedStyleForMultiline: comma
75
+ EnforcedStyleForMultiline: consistent_comma
73
76
 
74
77
  Style/TrailingCommaInHashLiteral:
75
- EnforcedStyleForMultiline: comma
78
+ EnforcedStyleForMultiline: consistent_comma
data/.simplecov CHANGED
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- SimpleCov.start do
3
+ SimpleCov.configure do
4
4
  minimum_coverage 95
5
- add_filter "/features/"
6
- add_filter "/spec/"
7
- add_filter "/tmp/"
8
- add_filter "/.git/"
5
+ skip "/features/"
6
+ skip "/spec/"
7
+ skip "/tmp/"
8
+ skip "/.git/"
9
9
  end
data/CHANGELOG.md CHANGED
@@ -1,7 +1,45 @@
1
- ## Unreleased ([changes](https://github.com/infertux/bashcov/compare/v3.2.0...master))
1
+ ## Unreleased ([changes](https://github.com/infertux/bashcov/compare/v4.0.0...master))
2
2
 
3
3
  * TBD
4
4
 
5
+ ## v4.0.0, 2026-08-25 ([changes](https://github.com/infertux/bashcov/compare/v3.3.0...v4.0.0))
6
+
7
+ * [BUGFIX] Fix build for Nix
8
+ * [MISC] Update Nix lockfile
9
+ * [MISC] Ignore .ruby-version file
10
+ * [FEATURE] Update coverage result to match SimpleCov new API
11
+ * [BUGFIX] Fix build for Bash 4.4
12
+ * [BUGFIX] Run Cucumber examples in random order
13
+ * [MISC] Test against all Ruby versions
14
+ * [MISC] Add screenshot to README
15
+ * [MISC] Run Cucumber against Bash 5.3
16
+ * [BUGFIX] Fix call to `find` command with zsh safeguard
17
+ * [BUGFIX] Fix deprecation warnings
18
+ * [MISC] Upgrade Ruby image for GitLab CI
19
+ * [FEATURE] - Upgrade simplecov dependency
20
+ * [BUGFIX] Fix support for Bash 5.3
21
+ * [MISC] Enforce consistent commas with Rubocop
22
+ * [BUGFIX] Make sure StringScanner is always loaded
23
+ * [BUGFIX] Use reliable Bash mirror
24
+ * [BUGFIX] Fix GitHub Action
25
+ * [BUGFIX] Fix Rubocop violation
26
+ * [BUGFIX] Fix deprecation warning for actions/checkout
27
+
28
+ ## v3.3.0, 2026-02-18 ([changes](https://github.com/infertux/bashcov/compare/v3.2.0...v3.3.0))
29
+
30
+ * [MISC] Add workflow to build Gem
31
+ * [BUGFIX] Fix heredoc with space not reported as covered (fixes #102)
32
+ * [BUGFIX] Do not write to stdout in specs
33
+ * [MISC] Update dependencies for Nix
34
+ * [BUXFIX] Add missing test dependencies for Ruby 4.0
35
+ * [MISC] Bump minimal Ruby version to 3.2
36
+ * [MISC] Test with Debian 12
37
+ * [MISC] Test against all Bash versions
38
+ * [MISC] Run GitHub CI monthly
39
+ * [BUGFIX] Fix Rubocop violations
40
+ * [FEATURE] Support multiline subshells
41
+ * [FEATURE] Support function names containing the at sign
42
+
5
43
  ## v3.2.0, 2025-07-28 ([changes](https://github.com/infertux/bashcov/compare/v3.1.3...v3.2.0))
6
44
 
7
45
  * [BUGFIX] Support function names containing dots (#97)
data/Gemfile.nix.lock CHANGED
@@ -1,118 +1,137 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bashcov (3.2.0)
5
- simplecov (~> 0.21)
4
+ bashcov (4.0.0)
5
+ simplecov (~> 1.1)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- aruba (2.3.1)
11
- bundler (>= 1.17, < 3.0)
10
+ aruba (2.4.1)
11
+ bundler (>= 1.17)
12
12
  contracts (>= 0.16.0, < 0.18.0)
13
- cucumber (>= 8.0, < 11.0)
14
- rspec-expectations (~> 3.4)
13
+ cucumber (>= 8.0, < 12.0)
14
+ irb (~> 1.16)
15
+ rspec-expectations (>= 3.4, < 5.0)
15
16
  thor (~> 1.0)
16
17
  ast (2.4.3)
17
18
  base64 (0.3.0)
18
- bigdecimal (3.2.2)
19
+ benchmark (0.5.0)
20
+ bigdecimal (4.1.2)
19
21
  builder (3.3.0)
20
- bundler-audit (0.9.2)
21
- bundler (>= 1.2.0, < 3)
22
+ bundler-audit (0.9.3)
23
+ bundler (>= 1.2.0)
22
24
  thor (~> 1.0)
23
- contracts (0.17.2)
24
- cucumber (10.0.0)
25
+ contracts (0.17.3)
26
+ cucumber (11.1.1)
25
27
  base64 (~> 0.2)
26
28
  builder (~> 3.2)
27
- cucumber-ci-environment (> 9, < 11)
28
- cucumber-core (> 15, < 17)
29
- cucumber-cucumber-expressions (> 17, < 19)
30
- cucumber-html-formatter (> 20.3, < 22)
29
+ cucumber-ci-environment (> 9, < 12)
30
+ cucumber-core (>= 16.2.0, < 17)
31
+ cucumber-cucumber-expressions (> 17, < 20)
32
+ cucumber-html-formatter (> 21, < 24)
31
33
  diff-lcs (~> 1.5)
32
34
  logger (~> 1.6)
33
35
  mini_mime (~> 1.1)
34
36
  multi_test (~> 1.1)
35
- sys-uname (~> 1.3)
36
- cucumber-ci-environment (10.0.1)
37
- cucumber-core (15.1.0)
38
- cucumber-gherkin (> 27, < 31)
39
- cucumber-messages (> 26, < 29)
40
- cucumber-tag-expressions (> 5, < 7)
41
- cucumber-cucumber-expressions (18.0.1)
37
+ sys-uname (~> 1.5)
38
+ cucumber-ci-environment (11.0.0)
39
+ cucumber-core (16.2.0)
40
+ cucumber-gherkin (> 36, < 40)
41
+ cucumber-messages (> 31, < 33)
42
+ cucumber-tag-expressions (> 6, < 9)
43
+ cucumber-cucumber-expressions (19.0.1)
42
44
  bigdecimal
43
- cucumber-gherkin (30.0.4)
44
- cucumber-messages (> 25, < 28)
45
- cucumber-html-formatter (21.13.0)
46
- cucumber-messages (> 19, < 28)
47
- cucumber-messages (27.2.0)
48
- cucumber-tag-expressions (6.1.2)
45
+ cucumber-gherkin (39.1.0)
46
+ cucumber-messages (>= 31, < 33)
47
+ cucumber-html-formatter (23.1.0)
48
+ cucumber-messages (> 23, < 33)
49
+ cucumber-messages (32.3.1)
50
+ cucumber-tag-expressions (8.1.0)
49
51
  diff-lcs (1.6.2)
50
- docile (1.4.1)
52
+ erb (6.0.7)
51
53
  ffi (1.16.3)
52
- json (2.13.1)
53
- language_server-protocol (3.17.0.5)
54
+ io-console (0.9.2)
55
+ irb (1.18.0)
56
+ pp (>= 0.6.0)
57
+ prism (>= 1.3.0)
58
+ rdoc (>= 4.0.0)
59
+ reline (>= 0.4.2)
60
+ json (2.21.2)
61
+ language_server-protocol (3.17.0.6)
54
62
  lint_roller (1.1.0)
55
63
  logger (1.7.0)
64
+ memoist3 (1.0.0)
56
65
  mini_mime (1.1.5)
57
66
  multi_test (1.1.0)
58
- parallel (1.27.0)
59
- parser (3.3.9.0)
67
+ parallel (2.1.0)
68
+ parser (3.3.12.0)
60
69
  ast (~> 2.4.1)
61
70
  racc
62
- prism (1.4.0)
71
+ pp (0.6.4)
72
+ prettyprint
73
+ prettyprint (0.2.0)
74
+ prism (1.9.0)
63
75
  racc (1.8.1)
64
76
  rainbow (3.1.1)
65
- rake (13.3.0)
66
- regexp_parser (2.10.0)
67
- rspec (3.13.1)
77
+ rake (13.4.2)
78
+ rbs (4.2.0)
79
+ logger
80
+ prism (>= 1.6.0)
81
+ tsort
82
+ rdoc (8.0.0)
83
+ erb
84
+ prism (>= 1.6.0)
85
+ rbs (>= 4.0.0)
86
+ tsort
87
+ regexp_parser (2.12.0)
88
+ reline (0.7.0)
89
+ io-console (~> 0.5)
90
+ rspec (3.13.2)
68
91
  rspec-core (~> 3.13.0)
69
92
  rspec-expectations (~> 3.13.0)
70
93
  rspec-mocks (~> 3.13.0)
71
- rspec-core (3.13.5)
94
+ rspec-core (3.13.6)
72
95
  rspec-support (~> 3.13.0)
73
96
  rspec-expectations (3.13.5)
74
97
  diff-lcs (>= 1.2.0, < 2.0)
75
98
  rspec-support (~> 3.13.0)
76
- rspec-mocks (3.13.5)
99
+ rspec-mocks (3.13.8)
77
100
  diff-lcs (>= 1.2.0, < 2.0)
78
101
  rspec-support (~> 3.13.0)
79
- rspec-support (3.13.4)
80
- rubocop (1.79.0)
81
- json (~> 2.3)
102
+ rspec-support (3.13.7)
103
+ rubocop (1.90.0)
104
+ json (>= 2.3)
82
105
  language_server-protocol (~> 3.17.0.2)
83
106
  lint_roller (~> 1.1.0)
84
- parallel (~> 1.10)
107
+ parallel (>= 1.10)
85
108
  parser (>= 3.3.0.2)
86
109
  rainbow (>= 2.2.2, < 4.0)
87
110
  regexp_parser (>= 2.9.3, < 3.0)
88
- rubocop-ast (>= 1.46.0, < 2.0)
111
+ rubocop-ast (>= 1.49.0, < 2.0)
89
112
  ruby-progressbar (~> 1.7)
90
- tsort (>= 0.2.0)
91
113
  unicode-display_width (>= 2.4.0, < 4.0)
92
- rubocop-ast (1.46.0)
114
+ rubocop-ast (1.50.0)
93
115
  parser (>= 3.3.7.2)
94
- prism (~> 1.4)
116
+ prism (~> 1.7)
95
117
  rubocop-rake (0.7.1)
96
118
  lint_roller (~> 1.1)
97
119
  rubocop (>= 1.72.1)
98
- rubocop-rspec (3.6.0)
120
+ rubocop-rspec (3.10.2)
99
121
  lint_roller (~> 1.1)
100
- rubocop (~> 1.72, >= 1.72.1)
122
+ regexp_parser (>= 2.0)
123
+ rubocop (~> 1.86, >= 1.86.2)
101
124
  ruby-progressbar (1.13.0)
102
- simplecov (0.22.0)
103
- docile (~> 1.1)
104
- simplecov-html (~> 0.11)
105
- simplecov_json_formatter (~> 0.1)
106
- simplecov-html (0.13.2)
107
- simplecov_json_formatter (0.1.4)
108
- sys-uname (1.3.1)
125
+ simplecov (1.1.1)
126
+ sys-uname (1.5.1)
109
127
  ffi (~> 1.1)
110
- thor (1.4.0)
128
+ memoist3 (~> 1.0.0)
129
+ thor (1.5.0)
111
130
  tsort (0.2.0)
112
- unicode-display_width (3.1.4)
113
- unicode-emoji (~> 4.0, >= 4.0.4)
114
- unicode-emoji (4.0.4)
115
- yard (0.9.37)
131
+ unicode-display_width (3.2.0)
132
+ unicode-emoji (~> 4.1)
133
+ unicode-emoji (4.2.0)
134
+ yard (0.9.45)
116
135
 
117
136
  PLATFORMS
118
137
  aarch64-linux-gnu
@@ -130,10 +149,13 @@ PLATFORMS
130
149
  DEPENDENCIES
131
150
  aruba
132
151
  bashcov!
152
+ benchmark
133
153
  bundler-audit
134
154
  cucumber
135
155
  ffi (~> 1.16.0)
156
+ irb
136
157
  rake
158
+ rdoc
137
159
  rspec
138
160
  rubocop
139
161
  rubocop-rake
data/Guardfile CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # More info at https://github.com/guard/guard#readme
4
4
 
5
- guard "rspec", cli: "--tag ~slow" do
5
+ guard "rspec" do
6
6
  watch(%r{^spec/.+_spec\.rb$})
7
7
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
8
8
  watch(%r{^lib/(.+)/(.+)\.rb$}) { |m| "spec/#{m[1]}/#{m[2]}_spec.rb" }
data/README.md CHANGED
@@ -21,10 +21,6 @@ so your report includes coverage across your test suites and thereby gives you a
21
21
  It uses the [SimpleCov](https://github.com/colszowka/simplecov) coverage library to generate HTML reports.
22
22
  SimpleCov gets installed automatically when you install Bashcov.
23
23
 
24
- Here are example coverages generated by Bashcov:
25
- [test app demo](https://infertux.github.io/bashcov/test_app/ "Coverage for the bundled test application") &
26
- [RVM demo](https://infertux.github.io/bashcov/rvm/ "Coverage for RVM").
27
-
28
24
  ## Installation
29
25
 
30
26
  `gem install bashcov`
@@ -46,6 +42,8 @@ For more information, including other installation methods, see [`INSTALL.md`](.
46
42
 
47
43
  It will create a directory named `./coverage/`, you may open `./coverage/index.html` to browse the coverage report.
48
44
 
45
+ ![Screenshot](screenshot.png)
46
+
49
47
  ### SimpleCov integration
50
48
 
51
49
  You can leverage the underlying library [SimpleCov](https://github.com/colszowka/simplecov)
data/Rakefile CHANGED
@@ -7,15 +7,15 @@ Bundler::Audit::Task.new
7
7
 
8
8
  require "cucumber/rake/task"
9
9
  Cucumber::Rake::Task.new do |t|
10
- t.cucumber_opts = %w[--publish-quiet]
10
+ t.cucumber_opts = %w[--publish-quiet --backtrace --verbose --order=random]
11
11
  end
12
12
 
13
13
  require "rspec/core/rake_task"
14
- RSpec::Core::RakeTask.new(:spec) do |t|
14
+ RSpec::Core::RakeTask.new(:rspec) do |t|
15
15
  t.ruby_opts = "-w"
16
16
  end
17
17
 
18
18
  require "rubocop/rake_task"
19
19
  RuboCop::RakeTask.new
20
20
 
21
- task default: %i[bundle:audit cucumber spec rubocop]
21
+ task default: %i[bundle:audit cucumber rspec rubocop]
data/TESTING.md CHANGED
@@ -1,4 +1,3 @@
1
1
  `bundle exec rake` will run a quick test suite with the current Bash and Ruby version.
2
2
 
3
- `./test.sh` will run all [GitLab CI pipelines](https://gitlab.com/infertux/bashcov/-/pipelines) locally.
4
- You'll need [Docker](https://www.docker.com/) and [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-runner) installed on your machine.
3
+ The full test suite runs on [GitHub](https://github.com/infertux/bashcov/actions).
data/bin/bashcov CHANGED
@@ -22,7 +22,7 @@ SimpleCov.command_name Bashcov.command_name
22
22
  SimpleCov.root Bashcov.root_directory
23
23
 
24
24
  result = SimpleCov::Result.new(coverage)
25
- if SimpleCov.use_merging
25
+ if SimpleCov.merging
26
26
  SimpleCov::ResultMerger.store_result(result)
27
27
  result = SimpleCov::ResultMerger.merged_result
28
28
  end
data/flake.nix CHANGED
@@ -172,7 +172,7 @@
172
172
  propagatedBuildInputs = [gems'];
173
173
 
174
174
  checkPhase = ''
175
- ${config.packages.gems.wrappedRuby}/bin/rake cucumber spec
175
+ ${config.packages.gems.wrappedRuby}/bin/rake cucumber rspec
176
176
  '';
177
177
 
178
178
  # Replace shebangs like "#!/usr/bin/env bash" with Nix store
@@ -206,7 +206,7 @@
206
206
  pname = "bashcov";
207
207
  gemdir = self;
208
208
  lockfile = ./Gemfile.nix.lock;
209
- version = "3.0.2";
209
+ version = "4.0.0";
210
210
  postBuild = ''
211
211
  for gem in $out/${ruby.gemPath}/bundler/gems/*; do
212
212
  ln -sfrT "$gem" $out/${ruby.gemPath}/gems/"''${gem##*/}"
data/gemset.nix CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  aruba = {
3
- dependencies = ["contracts" "cucumber" "rspec-expectations" "thor"];
3
+ dependencies = ["contracts" "cucumber" "irb" "rspec-expectations" "thor"];
4
4
  groups = ["development"];
5
5
  platforms = [];
6
6
  source = {
7
7
  remotes = ["https://rubygems.org"];
8
- sha256 = "1gdz1yqgs9dm14x1lg4spzc5mrg51s0jybj4g2wp46wlb2k70k5h";
8
+ sha256 = "03dg1hg58733rv2jl220pckal3vqqiqkjmfgnd9wknbb2d4ik0n6";
9
9
  type = "gem";
10
10
  };
11
- version = "2.3.1";
11
+ version = "2.4.1";
12
12
  };
13
13
  ast = {
14
14
  groups = ["default" "development"];
@@ -38,17 +38,27 @@
38
38
  path = ./.;
39
39
  type = "path";
40
40
  };
41
- version = "3.2.0";
41
+ version = "4.0.0";
42
+ };
43
+ benchmark = {
44
+ groups = ["development"];
45
+ platforms = [];
46
+ source = {
47
+ remotes = ["https://rubygems.org"];
48
+ sha256 = "0v1337j39w1z7x9zs4q7ag0nfv4vs4xlsjx2la0wpv8s6hig2pa6";
49
+ type = "gem";
50
+ };
51
+ version = "0.5.0";
42
52
  };
43
53
  bigdecimal = {
44
54
  groups = ["default" "development"];
45
55
  platforms = [];
46
56
  source = {
47
57
  remotes = ["https://rubygems.org"];
48
- sha256 = "1p2szbr4jdvmwaaj2kxlbv1rp0m6ycbgfyp0kjkkkswmniv5y21r";
58
+ sha256 = "1g9zi8c4i7g8zz0c3hxrw6mblrjvgn7akys60clb9si7c1k1gljk";
49
59
  type = "gem";
50
60
  };
51
- version = "3.2.2";
61
+ version = "4.1.2";
52
62
  };
53
63
  builder = {
54
64
  groups = ["default" "development"];
@@ -66,20 +76,20 @@
66
76
  platforms = [];
67
77
  source = {
68
78
  remotes = ["https://rubygems.org"];
69
- sha256 = "0j0h5cgnzk0ms17ssjkzfzwz65ggrs3lsp53a1j46p4616m1s1bk";
79
+ sha256 = "1sdlr4rj7x5nbrl8zkd3dqdg4fc50bnpx37rl0l0szg4f5n7dj41";
70
80
  type = "gem";
71
81
  };
72
- version = "0.9.2";
82
+ version = "0.9.3";
73
83
  };
74
84
  contracts = {
75
85
  groups = ["default" "development"];
76
86
  platforms = [];
77
87
  source = {
78
88
  remotes = ["https://rubygems.org"];
79
- sha256 = "1sclvlwnlxfaj1595xd0rn3x3w0ljic3vqgnx6476lr7x8xbpbiv";
89
+ sha256 = "1mqlhfsf53r5r5assnwzqq1ajbhwxcxniddpxjdhjiza2dj64bp7";
80
90
  type = "gem";
81
91
  };
82
- version = "0.17.2";
92
+ version = "0.17.3";
83
93
  };
84
94
  cucumber = {
85
95
  dependencies = ["base64" "builder" "cucumber-ci-environment" "cucumber-core" "cucumber-cucumber-expressions" "cucumber-html-formatter" "diff-lcs" "logger" "mini_mime" "multi_test" "sys-uname"];
@@ -87,20 +97,20 @@
87
97
  platforms = [];
88
98
  source = {
89
99
  remotes = ["https://rubygems.org"];
90
- sha256 = "1g9gk07vn3dmwfzg84hqn1kj1qz2q6sxd2pbyq9p93mxwxc0397c";
100
+ sha256 = "1i2favw0kk9pdikcwpqz0pl1p95g44r0rd8kiiwsyl2bl7s49pfy";
91
101
  type = "gem";
92
102
  };
93
- version = "10.0.0";
103
+ version = "11.1.1";
94
104
  };
95
105
  cucumber-ci-environment = {
96
106
  groups = ["default" "development"];
97
107
  platforms = [];
98
108
  source = {
99
109
  remotes = ["https://rubygems.org"];
100
- sha256 = "0cc6w7dqlmnp59ymi7pyspm3w4m7fn37x6b18pziv62wr373yvmv";
110
+ sha256 = "1qnif57qqcvaz361jkbg43pnzn80jac0ys7gklymn08b3ng9mxqd";
101
111
  type = "gem";
102
112
  };
103
- version = "10.0.1";
113
+ version = "11.0.0";
104
114
  };
105
115
  cucumber-core = {
106
116
  dependencies = ["cucumber-gherkin" "cucumber-messages" "cucumber-tag-expressions"];
@@ -108,10 +118,10 @@
108
118
  platforms = [];
109
119
  source = {
110
120
  remotes = ["https://rubygems.org"];
111
- sha256 = "1drl84y0nzwms4sgx2z1l5wgsmfmi299c4kycic3lrjzbm15cp1d";
121
+ sha256 = "02wprwvf2f3ffzvbrzv8clxvm11p6s7gcjd3wpwfwbzlbjlmhasr";
112
122
  type = "gem";
113
123
  };
114
- version = "15.1.0";
124
+ version = "16.2.0";
115
125
  };
116
126
  cucumber-cucumber-expressions = {
117
127
  dependencies = ["bigdecimal"];
@@ -119,10 +129,10 @@
119
129
  platforms = [];
120
130
  source = {
121
131
  remotes = ["https://rubygems.org"];
122
- sha256 = "1rg3dcg2mapay1xbs8cybds05swmj8q9li8ynvrkzwvacfzs1643";
132
+ sha256 = "133cwgclgrphlws6l23sssgmjj41ckhldbwpny7q238r8n8c13k4";
123
133
  type = "gem";
124
134
  };
125
- version = "18.0.1";
135
+ version = "19.0.1";
126
136
  };
127
137
  cucumber-gherkin = {
128
138
  dependencies = ["cucumber-messages"];
@@ -130,10 +140,10 @@
130
140
  platforms = [];
131
141
  source = {
132
142
  remotes = ["https://rubygems.org"];
133
- sha256 = "044ccaj3c3zv07g823dk4i1v2hbjkfwpp67k90bs8hlyy4pkyyzy";
143
+ sha256 = "1vbrnf0j3pq162ccrm349mgm4x90lz0k69h11bc671axjl62mldf";
134
144
  type = "gem";
135
145
  };
136
- version = "30.0.4";
146
+ version = "39.1.0";
137
147
  };
138
148
  cucumber-html-formatter = {
139
149
  dependencies = ["cucumber-messages"];
@@ -141,30 +151,30 @@
141
151
  platforms = [];
142
152
  source = {
143
153
  remotes = ["https://rubygems.org"];
144
- sha256 = "0kgfhzjylhzm6xqj5b3b12888wwnrcvwig0j84ldchl6vavj0bl8";
154
+ sha256 = "1pwcvpfawpkdqw9fgdvk8i8n2k6glmmbdbh4jr5kjxn8jakv92bp";
145
155
  type = "gem";
146
156
  };
147
- version = "21.13.0";
157
+ version = "23.1.0";
148
158
  };
149
159
  cucumber-messages = {
150
160
  groups = ["default" "development"];
151
161
  platforms = [];
152
162
  source = {
153
163
  remotes = ["https://rubygems.org"];
154
- sha256 = "1zwzjwr270j11fpg5m1abvdvyiydjsd0p6dd2443vnr08r2s3qj6";
164
+ sha256 = "073phbyiblkp8sh4r2ss8gxa48gjlsj94nq00rnbkbzp3i68xj6x";
155
165
  type = "gem";
156
166
  };
157
- version = "27.2.0";
167
+ version = "32.3.1";
158
168
  };
159
169
  cucumber-tag-expressions = {
160
170
  groups = ["default" "development"];
161
171
  platforms = [];
162
172
  source = {
163
173
  remotes = ["https://rubygems.org"];
164
- sha256 = "0vcifp1fiha6yqi36m26n1vr8sz3dpnn5966hcz4a3dq43lf947p";
174
+ sha256 = "089fynlhyzcjng7x8ffda1gafdi1yfv2k4y9m7r5p3jgcnvc9n4v";
165
175
  type = "gem";
166
176
  };
167
- version = "6.1.2";
177
+ version = "8.1.0";
168
178
  };
169
179
  diff-lcs = {
170
180
  groups = ["default" "development"];
@@ -176,15 +186,15 @@
176
186
  };
177
187
  version = "1.6.2";
178
188
  };
179
- docile = {
180
- groups = ["default"];
189
+ erb = {
190
+ groups = ["default" "development"];
181
191
  platforms = [];
182
192
  source = {
183
193
  remotes = ["https://rubygems.org"];
184
- sha256 = "07pj4z3h8wk4fgdn6s62vw1lwvhj0ac0x10vfbdkr9xzk7krn5cn";
194
+ sha256 = "14pfj6zn0p1hxj6s6s0r7d424wap8zl9zxf89nj79y8fbg16vjn5";
185
195
  type = "gem";
186
196
  };
187
- version = "1.4.1";
197
+ version = "6.0.7";
188
198
  };
189
199
  ffi = {
190
200
  groups = ["development"];
@@ -196,25 +206,46 @@
196
206
  };
197
207
  version = "1.16.3";
198
208
  };
209
+ io-console = {
210
+ groups = ["default" "development"];
211
+ platforms = [];
212
+ source = {
213
+ remotes = ["https://rubygems.org"];
214
+ sha256 = "026v93kja19bfslnwi9xfq2dj4r89kkwdprim4whjg6h3n4lz9zg";
215
+ type = "gem";
216
+ };
217
+ version = "0.9.2";
218
+ };
219
+ irb = {
220
+ dependencies = ["pp" "prism" "rdoc" "reline"];
221
+ groups = ["development"];
222
+ platforms = [];
223
+ source = {
224
+ remotes = ["https://rubygems.org"];
225
+ sha256 = "1qs8a9vprg7s8krgq4s0pygr91hclqqyz98ik15p0m1sf2h5956y";
226
+ type = "gem";
227
+ };
228
+ version = "1.18.0";
229
+ };
199
230
  json = {
200
231
  groups = ["default" "development"];
201
232
  platforms = [];
202
233
  source = {
203
234
  remotes = ["https://rubygems.org"];
204
- sha256 = "1z0gmgndcqrcp5hgmgfrf8qiq9c6g4ccfs98qrgsr2d78jxz8z4f";
235
+ sha256 = "0shwgjqbj856mb6m9kgkpy08nhym2gdvc2yaprlimfmky9y3n78z";
205
236
  type = "gem";
206
237
  };
207
- version = "2.13.1";
238
+ version = "2.21.2";
208
239
  };
209
240
  language_server-protocol = {
210
241
  groups = ["default" "development"];
211
242
  platforms = [];
212
243
  source = {
213
244
  remotes = ["https://rubygems.org"];
214
- sha256 = "1k0311vah76kg5m6zr7wmkwyk5p2f9d9hyckjpn3xgr83ajkj7px";
245
+ sha256 = "1w5p8c2145lmqzr25bxh4ikzjm6k8y1k5lriqqdpw9pq730w1wjy";
215
246
  type = "gem";
216
247
  };
217
- version = "3.17.0.5";
248
+ version = "3.17.0.6";
218
249
  };
219
250
  lint_roller = {
220
251
  groups = ["default" "development"];
@@ -236,6 +267,16 @@
236
267
  };
237
268
  version = "1.7.0";
238
269
  };
270
+ memoist3 = {
271
+ groups = ["default" "development"];
272
+ platforms = [];
273
+ source = {
274
+ remotes = ["https://rubygems.org"];
275
+ sha256 = "0vyma0mpjibqigzl6j9lij7zh3kvqlyi88qc0mia6l7i5i044vk8";
276
+ type = "gem";
277
+ };
278
+ version = "1.0.0";
279
+ };
239
280
  mini_mime = {
240
281
  groups = ["default" "development"];
241
282
  platforms = [];
@@ -261,10 +302,10 @@
261
302
  platforms = [];
262
303
  source = {
263
304
  remotes = ["https://rubygems.org"];
264
- sha256 = "0c719bfgcszqvk9z47w2p8j2wkz5y35k48ywwas5yxbbh3hm3haa";
305
+ sha256 = "0mlkn1vhh9lr7vljibpgspwsswk7mzm8nw6bbr616c9fbj35hlmk";
265
306
  type = "gem";
266
307
  };
267
- version = "1.27.0";
308
+ version = "2.1.0";
268
309
  };
269
310
  parser = {
270
311
  dependencies = ["ast" "racc"];
@@ -272,20 +313,41 @@
272
313
  platforms = [];
273
314
  source = {
274
315
  remotes = ["https://rubygems.org"];
275
- sha256 = "1wl7frfk68q6gsf6q6j32jl5m3yc0b9x8ycxz3hy79miaj9r5mll";
316
+ sha256 = "0a4q5h2hcihk79dbr20scgkm56l79qp7fsvfvkxlv8nmapvxg9i1";
276
317
  type = "gem";
277
318
  };
278
- version = "3.3.9.0";
319
+ version = "3.3.12.0";
320
+ };
321
+ pp = {
322
+ dependencies = ["prettyprint"];
323
+ groups = ["default" "development"];
324
+ platforms = [];
325
+ source = {
326
+ remotes = ["https://rubygems.org"];
327
+ sha256 = "0w5mha75hs8gdj75g8vl0sxpyp8rzvwq8a4jcmi4ah8cf370zjyz";
328
+ type = "gem";
329
+ };
330
+ version = "0.6.4";
331
+ };
332
+ prettyprint = {
333
+ groups = ["default" "development"];
334
+ platforms = [];
335
+ source = {
336
+ remotes = ["https://rubygems.org"];
337
+ sha256 = "14zicq3plqi217w6xahv7b8f7aj5kpxv1j1w98344ix9h5ay3j9b";
338
+ type = "gem";
339
+ };
340
+ version = "0.2.0";
279
341
  };
280
342
  prism = {
281
343
  groups = ["default" "development"];
282
344
  platforms = [];
283
345
  source = {
284
346
  remotes = ["https://rubygems.org"];
285
- sha256 = "0gkhpdjib9zi9i27vd9djrxiwjia03cijmd6q8yj2q1ix403w3nw";
347
+ sha256 = "11ggfikcs1lv17nhmhqyyp6z8nq5pkfcj6a904047hljkxm0qlvv";
286
348
  type = "gem";
287
349
  };
288
- version = "1.4.0";
350
+ version = "1.9.0";
289
351
  };
290
352
  racc = {
291
353
  groups = ["default" "development"];
@@ -312,20 +374,53 @@
312
374
  platforms = [];
313
375
  source = {
314
376
  remotes = ["https://rubygems.org"];
315
- sha256 = "14s4jdcs1a4saam9qmzbsa2bsh85rj9zfxny5z315x3gg0nhkxcn";
377
+ sha256 = "009p524zl0p0kfa65nii8wdmaigkmawv9pbvlcffky7islmmp0nb";
378
+ type = "gem";
379
+ };
380
+ version = "13.4.2";
381
+ };
382
+ rbs = {
383
+ dependencies = ["logger" "prism" "tsort"];
384
+ groups = ["default" "development"];
385
+ platforms = [];
386
+ source = {
387
+ remotes = ["https://rubygems.org"];
388
+ sha256 = "0x067q8cdam4kv5dc09iq2nzca8qm2kdl0dr22gc0ny0vj3bixsi";
389
+ type = "gem";
390
+ };
391
+ version = "4.2.0";
392
+ };
393
+ rdoc = {
394
+ dependencies = ["erb" "prism" "rbs" "tsort"];
395
+ groups = ["development"];
396
+ platforms = [];
397
+ source = {
398
+ remotes = ["https://rubygems.org"];
399
+ sha256 = "0sf4909q2mr9z0rpygv94z12b0yamg07gz8cba2mi5k3m448rgq3";
316
400
  type = "gem";
317
401
  };
318
- version = "13.3.0";
402
+ version = "8.0.0";
319
403
  };
320
404
  regexp_parser = {
321
405
  groups = ["default" "development"];
322
406
  platforms = [];
323
407
  source = {
324
408
  remotes = ["https://rubygems.org"];
325
- sha256 = "0qccah61pjvzyyg6mrp27w27dlv6vxlbznzipxjcswl7x3fhsvyb";
409
+ sha256 = "1fwfw26a32rps78920nn29shqg2zmqv72i89j1fap41isshida9m";
326
410
  type = "gem";
327
411
  };
328
- version = "2.10.0";
412
+ version = "2.12.0";
413
+ };
414
+ reline = {
415
+ dependencies = ["io-console"];
416
+ groups = ["default" "development"];
417
+ platforms = [];
418
+ source = {
419
+ remotes = ["https://rubygems.org"];
420
+ sha256 = "0gaq2lc463ap1srz7y5kh2p4dxazs7vjrpiby58d9yfvan72s0av";
421
+ type = "gem";
422
+ };
423
+ version = "0.7.0";
329
424
  };
330
425
  rspec = {
331
426
  dependencies = ["rspec-core" "rspec-expectations" "rspec-mocks"];
@@ -333,10 +428,10 @@
333
428
  platforms = [];
334
429
  source = {
335
430
  remotes = ["https://rubygems.org"];
336
- sha256 = "0h11wynaki22a40rfq3ahcs4r36jdpz9acbb3m5dkf0mm67sbydr";
431
+ sha256 = "11q5hagj6vr694innqj4r45jrm8qcwvkxjnphqgyd66piah88qi0";
337
432
  type = "gem";
338
433
  };
339
- version = "3.13.1";
434
+ version = "3.13.2";
340
435
  };
341
436
  rspec-core = {
342
437
  dependencies = ["rspec-support"];
@@ -344,10 +439,10 @@
344
439
  platforms = [];
345
440
  source = {
346
441
  remotes = ["https://rubygems.org"];
347
- sha256 = "18sgga9zjrd5579m9rpb78l7yn9a0bjzwz51z5kiq4y6jwl6hgxb";
442
+ sha256 = "0bcbh9yv6cs6pv299zs4bvalr8yxa51kcdd1pjl60yv625j3r0m8";
348
443
  type = "gem";
349
444
  };
350
- version = "3.13.5";
445
+ version = "3.13.6";
351
446
  };
352
447
  rspec-expectations = {
353
448
  dependencies = ["diff-lcs" "rspec-support"];
@@ -366,31 +461,31 @@
366
461
  platforms = [];
367
462
  source = {
368
463
  remotes = ["https://rubygems.org"];
369
- sha256 = "10gajm8iscl7gb8q926hyna83bw3fx2zb4sqdzjrznjs51pqlcz4";
464
+ sha256 = "0iqxmw0knjiz5nf6pgr8ihs6cjzh89f0ppj3fqiz8cvms79x6sh8";
370
465
  type = "gem";
371
466
  };
372
- version = "3.13.5";
467
+ version = "3.13.8";
373
468
  };
374
469
  rspec-support = {
375
470
  groups = ["default" "development"];
376
471
  platforms = [];
377
472
  source = {
378
473
  remotes = ["https://rubygems.org"];
379
- sha256 = "1xx3f4mgr84jz07fifd3r68hm6giqy91hqyzawmi0s59yqa1hjqq";
474
+ sha256 = "0z64h5rznm2zv21vjdjshz4v0h7bxvg02yc6g7yzxakj11byah06";
380
475
  type = "gem";
381
476
  };
382
- version = "3.13.4";
477
+ version = "3.13.7";
383
478
  };
384
479
  rubocop = {
385
- dependencies = ["json" "language_server-protocol" "lint_roller" "parallel" "parser" "rainbow" "regexp_parser" "rubocop-ast" "ruby-progressbar" "tsort" "unicode-display_width"];
480
+ dependencies = ["json" "language_server-protocol" "lint_roller" "parallel" "parser" "rainbow" "regexp_parser" "rubocop-ast" "ruby-progressbar" "unicode-display_width"];
386
481
  groups = ["development"];
387
482
  platforms = [];
388
483
  source = {
389
484
  remotes = ["https://rubygems.org"];
390
- sha256 = "1gjvmxpvm6cv4mgviyfq3724dk5vlnir1lc3bllyvz7r2qxyh2f7";
485
+ sha256 = "0hl2pxa6nydnh3jmgrjkdgmsj19r5yblgialym74w5f5nmjw1d4y";
391
486
  type = "gem";
392
487
  };
393
- version = "1.79.0";
488
+ version = "1.90.0";
394
489
  };
395
490
  rubocop-ast = {
396
491
  dependencies = ["parser" "prism"];
@@ -398,10 +493,10 @@
398
493
  platforms = [];
399
494
  source = {
400
495
  remotes = ["https://rubygems.org"];
401
- sha256 = "0ar3y8w36am483ynyzg0x8iwhn8h34y8f4agny4lyqcqbfnzd9qd";
496
+ sha256 = "1nw84xk6vc2ls8sxqvyhxs2agh4l0jrws85d4bi3x0501lq8ijmr";
402
497
  type = "gem";
403
498
  };
404
- version = "1.46.0";
499
+ version = "1.50.0";
405
500
  };
406
501
  rubocop-rake = {
407
502
  dependencies = ["lint_roller" "rubocop"];
@@ -415,15 +510,15 @@
415
510
  version = "0.7.1";
416
511
  };
417
512
  rubocop-rspec = {
418
- dependencies = ["lint_roller" "rubocop"];
513
+ dependencies = ["lint_roller" "regexp_parser" "rubocop"];
419
514
  groups = ["development"];
420
515
  platforms = [];
421
516
  source = {
422
517
  remotes = ["https://rubygems.org"];
423
- sha256 = "0ya4815sp8g13w7a86sm0605fx7xyldck77f9pjjfrvpf5c21r60";
518
+ sha256 = "1qk5bx4vg7n17i9475h6dqkhay9m3s6vanq9y35hxl9cb762wghb";
424
519
  type = "gem";
425
520
  };
426
- version = "3.6.0";
521
+ version = "3.10.2";
427
522
  };
428
523
  ruby-progressbar = {
429
524
  groups = ["default" "development"];
@@ -436,56 +531,35 @@
436
531
  version = "1.13.0";
437
532
  };
438
533
  simplecov = {
439
- dependencies = ["docile" "simplecov-html" "simplecov_json_formatter"];
440
534
  groups = ["default"];
441
535
  platforms = [];
442
536
  source = {
443
537
  remotes = ["https://rubygems.org"];
444
- sha256 = "198kcbrjxhhzca19yrdcd6jjj9sb51aaic3b0sc3pwjghg3j49py";
538
+ sha256 = "0y0ya82s3zi2wmkadnmb3l9r13mbsvd1g63n9mlp8bhb7zqmx0i5";
445
539
  type = "gem";
446
540
  };
447
- version = "0.22.0";
448
- };
449
- simplecov-html = {
450
- groups = ["default"];
451
- platforms = [];
452
- source = {
453
- remotes = ["https://rubygems.org"];
454
- sha256 = "0ikjfwydgs08nm3xzc4cn4b6z6rmcrj2imp84xcnimy2wxa8w2xx";
455
- type = "gem";
456
- };
457
- version = "0.13.2";
458
- };
459
- simplecov_json_formatter = {
460
- groups = ["default"];
461
- platforms = [];
462
- source = {
463
- remotes = ["https://rubygems.org"];
464
- sha256 = "0a5l0733hj7sk51j81ykfmlk2vd5vaijlq9d5fn165yyx3xii52j";
465
- type = "gem";
466
- };
467
- version = "0.1.4";
541
+ version = "1.1.1";
468
542
  };
469
543
  sys-uname = {
470
- dependencies = ["ffi"];
544
+ dependencies = ["ffi" "memoist3"];
471
545
  groups = ["default" "development"];
472
546
  platforms = [];
473
547
  source = {
474
548
  remotes = ["https://rubygems.org"];
475
- sha256 = "177l8rrqnb4rxf657mw28sgvgc8a2m7nlqcbdbra5m4xga0ypcxp";
549
+ sha256 = "0yvd71lzd2k46940k9l3l3yyjyxc4j1w6nmyrcjkqfdhj5j7wkbq";
476
550
  type = "gem";
477
551
  };
478
- version = "1.3.1";
552
+ version = "1.5.1";
479
553
  };
480
554
  thor = {
481
555
  groups = ["default" "development"];
482
556
  platforms = [];
483
557
  source = {
484
558
  remotes = ["https://rubygems.org"];
485
- sha256 = "0gcarlmpfbmqnjvwfz44gdjhcmm634di7plcx2zdgwdhrhifhqw7";
559
+ sha256 = "0wsy88vg2mazl039392hqrcwvs5nb9kq8jhhrrclir2px1gybag3";
486
560
  type = "gem";
487
561
  };
488
- version = "1.4.0";
562
+ version = "1.5.0";
489
563
  };
490
564
  tsort = {
491
565
  groups = ["default" "development"];
@@ -503,29 +577,29 @@
503
577
  platforms = [];
504
578
  source = {
505
579
  remotes = ["https://rubygems.org"];
506
- sha256 = "1has87asspm6m9wgqas8ghhhwyf2i1yqrqgrkv47xw7jq3qjmbwc";
580
+ sha256 = "0hiwhnqpq271xqari6mg996fgjps42sffm9cpk6ljn8sd2srdp8c";
507
581
  type = "gem";
508
582
  };
509
- version = "3.1.4";
583
+ version = "3.2.0";
510
584
  };
511
585
  unicode-emoji = {
512
586
  groups = ["default" "development"];
513
587
  platforms = [];
514
588
  source = {
515
589
  remotes = ["https://rubygems.org"];
516
- sha256 = "0ajk6rngypm3chvl6r0vwv36q1931fjqaqhjjya81rakygvlwb1c";
590
+ sha256 = "03zqn207zypycbz5m9mn7ym763wgpk7hcqbkpx02wrbm1wank7ji";
517
591
  type = "gem";
518
592
  };
519
- version = "4.0.4";
593
+ version = "4.2.0";
520
594
  };
521
595
  yard = {
522
596
  groups = ["development"];
523
597
  platforms = [];
524
598
  source = {
525
599
  remotes = ["https://rubygems.org"];
526
- sha256 = "14k9lb9a60r9z2zcqg08by9iljrrgjxdkbd91gw17rkqkqwi1sd6";
600
+ sha256 = "0lfwngmsz3xq9k9la9890cqpm4vk3rda4171yzms7f3w7x4i3qjj";
527
601
  type = "gem";
528
602
  };
529
- version = "0.9.37";
603
+ version = "0.9.45";
530
604
  };
531
605
  }
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "set"
3
+ require "strscan" # for StringScanner
4
4
 
5
5
  module Bashcov
6
6
  # Detect shell scripts
data/lib/bashcov/lexer.rb CHANGED
@@ -13,7 +13,7 @@ module Bashcov
13
13
  IGNORE_END_WITH = %w[(].freeze
14
14
 
15
15
  # Lines containing only one of these keywords are irrelevant for coverage
16
- IGNORE_IS = %w[esac if then else elif fi while do done { } ;;].freeze
16
+ IGNORE_IS = %w[esac if then else elif fi while do done { } ;; ( )].freeze
17
17
 
18
18
  # @param [String] filename File to analyze
19
19
  # @param [Hash] coverage Coverage with executed lines marked
@@ -35,34 +35,36 @@ module Bashcov
35
35
  mark_multiline(
36
36
  lines, lineno,
37
37
  /\A[^\n]*\b=\([^()]*\)/,
38
- forward: false
38
+ forward: false,
39
39
  )
40
40
 
41
41
  # heredoc
42
42
  mark_multiline(
43
43
  lines, lineno,
44
- /\A[^\n]+<<-?'?(\w+)'?.*$.*\1/m
44
+ /\A[^\n]+<<-?\s*'?(\w+)'?.*$.*\1/m,
45
45
  )
46
46
 
47
47
  # multiline string concatenated with backslashes
48
48
  mark_multiline(
49
49
  lines, lineno,
50
- /\A[^\n]+\\$(\s*['"][^'"]*['"]\s*\\$){1,}\s*['"][^'"]*['"]\s*$/
50
+ /\A[^\n]+\\$(\s*['"][^'"]*['"]\s*\\$){1,}\s*['"][^'"]*['"]\s*$/,
51
51
  )
52
52
 
53
53
  # simple line continuations with backslashes
54
54
  mark_multiline(
55
55
  lines, lineno,
56
- /\A([^\n&|;]*[^\\&|;](\\\\)*\\\n)+[^\n&|;]*[^\n\\&|;](\\\\)*$/
56
+ /\A([^\n&|;]*[^\\&|;](\\\\)*\\\n)+[^\n&|;]*[^\n\\&|;](\\\\)*$/,
57
57
  )
58
58
 
59
59
  # multiline string concatenated with newlines
60
- %w[' "].each do |char|
61
- mark_multiline(
62
- lines, lineno,
63
- /\A[^\n]+[\s=]+#{char}[^#{char}]*#{char}/m,
64
- forward: false
65
- )
60
+ [false, true].each do |direction|
61
+ %w[' "].each do |char|
62
+ mark_multiline(
63
+ lines, lineno,
64
+ /\A[^\n]+[\s=]+#{char}[^#{char}]*#{char}/m,
65
+ forward: direction,
66
+ )
67
+ end
66
68
  end
67
69
 
68
70
  mark_line(line, lineno)
@@ -72,6 +74,9 @@ module Bashcov
72
74
  private
73
75
 
74
76
  def mark_multiline(lines, lineno, regexp, forward: true)
77
+ # skip if we are already inside marked multiline string
78
+ return unless @coverage[lineno + 1].nil?
79
+
75
80
  seek_forward = lines[lineno..].join
76
81
  return unless (multiline_match = seek_forward.match(regexp))
77
82
 
@@ -104,7 +109,7 @@ module Bashcov
104
109
  line.start_with?(*IGNORE_START_WITH) ||
105
110
  line.end_with?(*IGNORE_END_WITH)
106
111
 
107
- return false if line =~ /\A[a-zA-Z_][a-zA-Z0-9_\-:\.]*\(\)/ # function declared without the `function` keyword
112
+ return false if line =~ /\A[a-zA-Z_@][a-zA-Z0-9_@\-:.]*\(\)/ # function declared without the `function` keyword
108
113
  return false if line =~ /\A[^)]+\)\Z/ # case statement selector, e.g. `--help)`
109
114
 
110
115
  true
@@ -178,7 +178,7 @@ module Bashcov
178
178
  end
179
179
 
180
180
  def convert_coverage
181
- @coverage.transform_keys(&:to_s)
181
+ @coverage.transform_keys(&:to_s).transform_values { |lines| { "lines" => lines } }
182
182
  end
183
183
  end
184
184
  end
@@ -3,5 +3,5 @@
3
3
  # :nodoc:
4
4
  module Bashcov
5
5
  # Current Bashcov version
6
- VERSION = "3.2.0"
6
+ VERSION = "4.0.0"
7
7
  end
@@ -85,7 +85,7 @@ module Bashcov
85
85
 
86
86
  field_count = FIELDS.length
87
87
  fields = @field_stream.each(
88
- self.class.delimiter, field_count, PS4_START_REGEXP
88
+ self.class.delimiter, field_count, PS4_START_REGEXP,
89
89
  )
90
90
 
91
91
  # +take(field_count)+ would be more natural here, but doesn't seem to
@@ -124,7 +124,7 @@ module Bashcov
124
124
  return
125
125
  else
126
126
  raise XtraceError.new(
127
- "expected integer for LINENO, got #{lineno.inspect}", @files
127
+ "expected integer for LINENO, got #{lineno.inspect}", @files,
128
128
  )
129
129
  end
130
130
 
data/lib/bashcov.rb CHANGED
@@ -10,7 +10,7 @@ require "bashcov/version"
10
10
  module Bashcov
11
11
  # A +Struct+ to store Bashcov configuration
12
12
  Options = Struct.new(
13
- *%i[skip_uncovered mute bash_path root_directory command command_name]
13
+ *%i[skip_uncovered mute bash_path root_directory command command_name],
14
14
  )
15
15
 
16
16
  class << self
@@ -72,7 +72,9 @@ module Bashcov
72
72
  # this is used early for the `BASH_VERSION` definition, so first use will likely error
73
73
  begin
74
74
  return @options.bash_path if @options.bash_path
75
- rescue NoMethodError; end # rubocop:disable Lint/SuppressedException
75
+ rescue NoMethodError
76
+ nil
77
+ end
76
78
 
77
79
  # support the same `BASHCOV_BASH_PATH` environment variable used in the spec tests
78
80
  return ENV.fetch("BASHCOV_BASH_PATH", nil) unless ENV.fetch("BASHCOV_BASH_PATH", "").empty?
@@ -100,7 +102,7 @@ module Bashcov
100
102
  # Define option accessors
101
103
  Options.new.members.each do |option|
102
104
  [option, "#{option}="].each do |method|
103
- next if instance_methods(false).include?(method)
105
+ next if method_defined?(method, false)
104
106
 
105
107
  define_method method do |*args|
106
108
  options.public_send(*[method, *args])
data/screenshot.png ADDED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bashcov
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cédric Félizard
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: '0.21'
18
+ version: '1.1'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: '0.21'
25
+ version: '1.1'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: aruba
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -37,6 +37,20 @@ dependencies:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: benchmark
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
40
54
  - !ruby/object:Gem::Dependency
41
55
  name: bundler-audit
42
56
  requirement: !ruby/object:Gem::Requirement
@@ -79,6 +93,20 @@ dependencies:
79
93
  - - "~>"
80
94
  - !ruby/object:Gem::Version
81
95
  version: 1.16.0
96
+ - !ruby/object:Gem::Dependency
97
+ name: irb
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
82
110
  - !ruby/object:Gem::Dependency
83
111
  name: rake
84
112
  requirement: !ruby/object:Gem::Requirement
@@ -93,6 +121,20 @@ dependencies:
93
121
  - - ">="
94
122
  - !ruby/object:Gem::Version
95
123
  version: '0'
124
+ - !ruby/object:Gem::Dependency
125
+ name: rdoc
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
96
138
  - !ruby/object:Gem::Dependency
97
139
  name: rspec
98
140
  requirement: !ruby/object:Gem::Requirement
@@ -202,8 +244,8 @@ files:
202
244
  - lib/bashcov/runner.rb
203
245
  - lib/bashcov/version.rb
204
246
  - lib/bashcov/xtrace.rb
247
+ - screenshot.png
205
248
  - shell.nix
206
- - test.sh
207
249
  homepage: https://github.com/infertux/bashcov
208
250
  licenses:
209
251
  - MIT
@@ -219,14 +261,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
219
261
  requirements:
220
262
  - - ">="
221
263
  - !ruby/object:Gem::Version
222
- version: 3.0.0
264
+ version: 3.2.0
223
265
  required_rubygems_version: !ruby/object:Gem::Requirement
224
266
  requirements:
225
267
  - - ">="
226
268
  - !ruby/object:Gem::Version
227
269
  version: '0'
228
270
  requirements: []
229
- rubygems_version: 3.6.7
271
+ rubygems_version: 4.0.10
230
272
  specification_version: 4
231
273
  summary: Code coverage tool for Bash
232
274
  test_files: []
data/test.sh DELETED
@@ -1,10 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- set -euo pipefail
4
-
5
- jobs=$(grep -o '^[a-z].*:$' .gitlab-ci.yml | tr -d ':' | grep -Ev '^(before_script)$')
6
-
7
- for job in $jobs; do
8
- echo "Running ${job}..."
9
- gitlab-runner exec docker "$job"
10
- done