guardian-ci 2026.10.28.182143
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 +7 -0
- data/.fluence-ci.yml +5 -0
- data/.yardopts +11 -0
- data/.yardstick.yml +34 -0
- data/Appraisals +28 -0
- data/CHANGELOG.md +159 -0
- data/CONTRIBUTING.md +174 -0
- data/LICENSE.txt +21 -0
- data/README.md +259 -0
- data/Rakefile +53 -0
- data/cliff.toml +50 -0
- data/exe/guardian-ci +6 -0
- data/gemfiles/rails_7.0.gemfile +13 -0
- data/gemfiles/rails_7.1.gemfile +13 -0
- data/gemfiles/rails_7.2.gemfile +13 -0
- data/gemfiles/rails_8.0.gemfile +13 -0
- data/gemfiles/rails_8.1.gemfile +13 -0
- data/lib/generators/guardian_ci/install_generator.rb +38 -0
- data/lib/generators/guardian_ci/templates/guardian-ci +20 -0
- data/lib/generators/guardian_ci/templates/guardian_ci.rake +29 -0
- data/lib/guardian/ci/cli.rb +130 -0
- data/lib/guardian/ci/railtie.rb +17 -0
- data/lib/guardian/ci/runner.rb +71 -0
- data/lib/guardian/ci/steps.rb +197 -0
- data/lib/guardian/ci/version.rb +7 -0
- data/lib/guardian/ci/yardstick_runner.rb +46 -0
- data/lib/guardian/ci.rb +17 -0
- data/lib/guardian-ci.rb +8 -0
- data/yard-templates/default/method_details/html/source.erb +4 -0
- metadata +286 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 5ad09001bf7bb6524936b56a6382523f90ea430d4022aab240bda6d01e147575
|
|
4
|
+
data.tar.gz: 4556cbc10f2e9e7916d3ba3fd4314c2752535c915fbd23d539e76e37f29a970a
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 99d71d4aabb2dfdec661a4192d751d4705ca2a7aa8b753114db73a3fe703ed1ccd74c1d94a7131fe09b9701ecf410b7dbc0c93b8b7cb556232a5827b7d9e513e
|
|
7
|
+
data.tar.gz: 46df525921a8075935822e0e3a317237260c6ef4d80c8864d3d4b20c3a269cb7838c4615c5eb5f3e219dbe29040904a7b8726b13fd09f229b93e926b70c4fc1a
|
data/.fluence-ci.yml
ADDED
data/.yardopts
ADDED
data/.yardstick.yml
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
# yardstick quality checks for the gem's public API.
|
|
3
|
+
# @api tags document the stability contract: public methods are part
|
|
4
|
+
# of SemVer, private ones may change without notice.
|
|
5
|
+
threshold: 95
|
|
6
|
+
require_exact_threshold: false
|
|
7
|
+
verbose: true
|
|
8
|
+
path:
|
|
9
|
+
- 'lib/**/*.rb'
|
|
10
|
+
rules:
|
|
11
|
+
ApiTag::Presence:
|
|
12
|
+
enabled: true
|
|
13
|
+
exclude: []
|
|
14
|
+
ApiTag::Inclusion:
|
|
15
|
+
enabled: true
|
|
16
|
+
exclude: []
|
|
17
|
+
ApiTag::ProtectedMethod:
|
|
18
|
+
enabled: false
|
|
19
|
+
ApiTag::PrivateMethod:
|
|
20
|
+
enabled: false
|
|
21
|
+
ExampleTag:
|
|
22
|
+
enabled: false
|
|
23
|
+
ReturnTag:
|
|
24
|
+
enabled: true
|
|
25
|
+
exclude: []
|
|
26
|
+
Summary::Presence:
|
|
27
|
+
enabled: true
|
|
28
|
+
exclude: []
|
|
29
|
+
Summary::Length:
|
|
30
|
+
enabled: false
|
|
31
|
+
Summary::Delimiter:
|
|
32
|
+
enabled: false
|
|
33
|
+
Summary::SingleLine:
|
|
34
|
+
enabled: false
|
data/Appraisals
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Generate per-Rails-version Gemfiles for CI. Regenerate with:
|
|
4
|
+
# bundle exec appraisal install
|
|
5
|
+
#
|
|
6
|
+
# The set of Rails versions tested here must stay in sync with the
|
|
7
|
+
# matrix in .github/workflows/main.yml. Older Rails minors stay in
|
|
8
|
+
# scope as long as Rails::Generators::Base remains source-stable.
|
|
9
|
+
|
|
10
|
+
appraise 'rails-7.0' do
|
|
11
|
+
gem 'rails', '~> 7.0.0'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
appraise 'rails-7.1' do
|
|
15
|
+
gem 'rails', '~> 7.1.0'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
appraise 'rails-7.2' do
|
|
19
|
+
gem 'rails', '~> 7.2.0'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
appraise 'rails-8.0' do
|
|
23
|
+
gem 'rails', '~> 8.0.0'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
appraise 'rails-8.1' do
|
|
27
|
+
gem 'rails', '~> 8.1.0'
|
|
28
|
+
end
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
## [2026.10.28.182143] - 2026-10-28
|
|
5
|
+
|
|
6
|
+
### Build
|
|
7
|
+
|
|
8
|
+
- build(gemspec): drop allowed_push_host
|
|
9
|
+
|
|
10
|
+
### CI
|
|
11
|
+
|
|
12
|
+
- ci: add the Claude PR review workflow
|
|
13
|
+
- ci: release dated versions
|
|
14
|
+
- ci: bump workflows to ci-workflows@v7
|
|
15
|
+
- ci: publish releases to rubygems.org
|
|
16
|
+
|
|
17
|
+
### Other
|
|
18
|
+
|
|
19
|
+
- chore(gemspec): move the Thor comment above the thor dependency
|
|
20
|
+
|
|
21
|
+
### Refactored
|
|
22
|
+
|
|
23
|
+
- refactor: drop Fluence branding from the tool's own wording
|
|
24
|
+
- refactor!: write report-mode artefacts under tmp/guardian-report
|
|
25
|
+
- refactor(cli)!: rename fluence-ci executable and generator to guardian-ci
|
|
26
|
+
- refactor!: rename gem to guardian-ci under Guardian::Ci
|
|
27
|
+
|
|
28
|
+
## [0.6.1] - 2026-10-05
|
|
29
|
+
|
|
30
|
+
### Build
|
|
31
|
+
|
|
32
|
+
- build: raise brakeman, reek, rubocop and rubocop-rspec floors
|
|
33
|
+
- build!: require Ruby >= 3.3
|
|
34
|
+
|
|
35
|
+
### CI
|
|
36
|
+
|
|
37
|
+
- ci: bump actions/checkout to v7
|
|
38
|
+
- ci: deploy the YARD docs to GitHub Pages
|
|
39
|
+
- ci: forward the release bot key on codequality-pr
|
|
40
|
+
- ci: keep codequality-pr without the release bot key
|
|
41
|
+
- ci: forward the release bot key on codequality-pr
|
|
42
|
+
- ci: migrate to ci-workflows@v6 config file
|
|
43
|
+
- ci(workflows): bump ci-workflows pins from @v2 to @v5 + drop github.actor
|
|
44
|
+
- ci: bump ci-workflows to @v5 (multi-gem-capable reusables)
|
|
45
|
+
|
|
46
|
+
### Documentation
|
|
47
|
+
|
|
48
|
+
- docs: align the YARD config with the gems family
|
|
49
|
+
- docs: refresh CONTRIBUTING.md after ci-workflows@v5 migration
|
|
50
|
+
- docs(readme): split SimpleCov snippet into rails/gem variants
|
|
51
|
+
- docs(readme): document .yardopts, .yardstick.yml and cliff.toml
|
|
52
|
+
- docs(readme): document SimpleCov spec_helper snippet
|
|
53
|
+
|
|
54
|
+
### Other
|
|
55
|
+
|
|
56
|
+
- chore: migrate to ci-workflows v4 (FLUENCE_*_BOT_* naming)
|
|
57
|
+
|
|
58
|
+
## [0.6.0] - 2026-04-29
|
|
59
|
+
|
|
60
|
+
### Added
|
|
61
|
+
|
|
62
|
+
- feat(docs): add --build mode for HTML site generation
|
|
63
|
+
|
|
64
|
+
### Refactored
|
|
65
|
+
|
|
66
|
+
- refactor(cli): extract dynamic command registration into class methods
|
|
67
|
+
|
|
68
|
+
### Style
|
|
69
|
+
|
|
70
|
+
- style(cli): use if/else block instead of multi-line ternary
|
|
71
|
+
|
|
72
|
+
## [0.5.1] - 2026-04-28
|
|
73
|
+
|
|
74
|
+
### Added
|
|
75
|
+
|
|
76
|
+
- feat(cli): forward all Steps kwargs as Thor options, not just --report
|
|
77
|
+
|
|
78
|
+
### Documentation
|
|
79
|
+
|
|
80
|
+
- docs(readme): document v0.5 CLI surface (--report, per-group commands)
|
|
81
|
+
|
|
82
|
+
## [0.5.0] - 2026-04-28
|
|
83
|
+
|
|
84
|
+
### Added
|
|
85
|
+
|
|
86
|
+
- feat(steps): align codequality + docs report mode with ci-workflows v3
|
|
87
|
+
|
|
88
|
+
### CI
|
|
89
|
+
|
|
90
|
+
- ci(main): gate matrix steps with if:, not job-level
|
|
91
|
+
|
|
92
|
+
### Refactored
|
|
93
|
+
|
|
94
|
+
- refactor(yardstick_runner): drop unused parity helpers
|
|
95
|
+
|
|
96
|
+
### Tests
|
|
97
|
+
|
|
98
|
+
- test(yardstick_runner): cover happy path, threshold failure, missing yml
|
|
99
|
+
|
|
100
|
+
## [0.4.0] - 2026-04-28
|
|
101
|
+
|
|
102
|
+
### Added
|
|
103
|
+
|
|
104
|
+
- feat(steps,cli): expose per-group commands with --report flag
|
|
105
|
+
- feat(generator): bin/fluence-ci supports per-group sub-commands
|
|
106
|
+
- feat(generator): drop config/ci.rb inject in favor of bin/fluence-ci
|
|
107
|
+
|
|
108
|
+
### CI
|
|
109
|
+
|
|
110
|
+
- ci: skip rubocop and main matrix on release PRs
|
|
111
|
+
|
|
112
|
+
## [0.3.0] - 2026-04-28
|
|
113
|
+
|
|
114
|
+
### Added
|
|
115
|
+
|
|
116
|
+
- feat: ship install generator, fluence-ci CLI, and Steps/Runner catalog (Phase 2)
|
|
117
|
+
|
|
118
|
+
### CI
|
|
119
|
+
|
|
120
|
+
- ci: activate consumer-style quality gates and 100% YARD coverage
|
|
121
|
+
|
|
122
|
+
### Tests
|
|
123
|
+
|
|
124
|
+
- test: add multi-Rails matrix and integration specs for CLI + generator
|
|
125
|
+
- test: configure SimpleCov + Undercover formatter in spec_helper
|
|
126
|
+
|
|
127
|
+
## [0.2.0] - 2026-04-28
|
|
128
|
+
|
|
129
|
+
### Build
|
|
130
|
+
|
|
131
|
+
- build: add benchmark runtime dep for undercover on Ruby 3.5+
|
|
132
|
+
|
|
133
|
+
### CI
|
|
134
|
+
|
|
135
|
+
- ci: grant `packages: read` on @v2 wrappers (fix startup_failure)
|
|
136
|
+
- ci: add workflow_dispatch to publish.yml for manual republish
|
|
137
|
+
- ci: forward RELEASE_APP_PRIVATE_KEY to release.yml
|
|
138
|
+
|
|
139
|
+
### Documentation
|
|
140
|
+
|
|
141
|
+
- docs: refresh README pins + add CONTRIBUTING.md
|
|
142
|
+
|
|
143
|
+
## [0.1.1] - 2026-04-28
|
|
144
|
+
|
|
145
|
+
### Other
|
|
146
|
+
|
|
147
|
+
- chore: add cliff.toml for changelog generation
|
|
148
|
+
- chore: pin remaining tool versions
|
|
149
|
+
|
|
150
|
+
### Style
|
|
151
|
+
|
|
152
|
+
- style: convert string literals from double to single quotes
|
|
153
|
+
|
|
154
|
+
## [0.1.0] - 2026-04-28
|
|
155
|
+
|
|
156
|
+
### Other
|
|
157
|
+
|
|
158
|
+
- chore: initial commit
|
|
159
|
+
|
data/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for contributing! Here's how to get started:
|
|
4
|
+
|
|
5
|
+
1. Open an issue to discuss the proposed change
|
|
6
|
+
2. Create a branch from `main`
|
|
7
|
+
3. Implement the change
|
|
8
|
+
4. Make sure tests and linting pass
|
|
9
|
+
5. Open a pull request targeting `main`
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
git clone git@github.com:fluence-eu/guardian-ci.git
|
|
17
|
+
cd guardian-ci
|
|
18
|
+
bin/setup
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Requires Ruby 3.3+.
|
|
22
|
+
|
|
23
|
+
## Development
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
bundle exec rspec # tests
|
|
27
|
+
bundle exec rubocop # linting
|
|
28
|
+
bundle exec rubocop -a # auto-fix linting
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
This gem is mostly a gemspec — its job is to declare a curated set of dev-tool dependencies and ship them to consumers via a single Gemfile entry. There is no application code to write under `lib/` (yet — see Phase 2 in `README.md`). The bulk of contributions therefore land in `guardian-ci.gemspec`.
|
|
32
|
+
|
|
33
|
+
### Bumping or adding a tool
|
|
34
|
+
|
|
35
|
+
1. Edit `guardian-ci.gemspec` (`spec.add_dependency` lines).
|
|
36
|
+
2. Run `bundle install` to verify the new constraint resolves.
|
|
37
|
+
3. Run `gem build guardian-ci.gemspec` to confirm the gem still builds.
|
|
38
|
+
4. Update the « What's included » table in `README.md` if pin or tool list changed.
|
|
39
|
+
5. Open the PR.
|
|
40
|
+
|
|
41
|
+
After merge, cut a release via the standard flow (see below). Consumers pick up the new pin with `bundle update guardian-ci`.
|
|
42
|
+
|
|
43
|
+
### Interactive console
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
bin/console
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Commit Convention
|
|
52
|
+
|
|
53
|
+
This project follows [Conventional Commits](https://www.conventionalcommits.org/).
|
|
54
|
+
|
|
55
|
+
### Format
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
<type>(<scope>): <description>
|
|
59
|
+
|
|
60
|
+
[body]
|
|
61
|
+
|
|
62
|
+
[footer(s)]
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Types
|
|
66
|
+
|
|
67
|
+
| Type | Description |
|
|
68
|
+
|---|---|
|
|
69
|
+
| `feat` | New feature |
|
|
70
|
+
| `fix` | Bug fix |
|
|
71
|
+
| `docs` | Documentation only changes |
|
|
72
|
+
| `style` | Formatting changes (whitespace, commas, etc.) — no logic |
|
|
73
|
+
| `refactor` | Code change that neither fixes a bug nor adds a feature |
|
|
74
|
+
| `perf` | Performance improvement |
|
|
75
|
+
| `test` | Adding or updating tests |
|
|
76
|
+
| `build` | Changes to build system or dependencies |
|
|
77
|
+
| `ci` | CI/CD configuration changes |
|
|
78
|
+
| `chore` | Other changes that don't modify source or tests |
|
|
79
|
+
| `revert` | Revert a previous commit |
|
|
80
|
+
|
|
81
|
+
### Scope
|
|
82
|
+
|
|
83
|
+
Optional — indicates the area affected:
|
|
84
|
+
|
|
85
|
+
- `chore(gemspec): pin reek to ~> 6.6`
|
|
86
|
+
- `docs(readme): add migration example for Rails apps`
|
|
87
|
+
- `ci: bump release.yml to ci-workflows@v5`
|
|
88
|
+
|
|
89
|
+
### Description
|
|
90
|
+
|
|
91
|
+
- Imperative mood ("add", not "adds" or "added")
|
|
92
|
+
- No capital letter at the start
|
|
93
|
+
- No period at the end
|
|
94
|
+
- Maximum 72 characters
|
|
95
|
+
|
|
96
|
+
### Body (optional)
|
|
97
|
+
|
|
98
|
+
- Explains *why* — the diff already shows *what*
|
|
99
|
+
- Wrapped at 72 columns
|
|
100
|
+
- Separated from the description by a blank line
|
|
101
|
+
|
|
102
|
+
### Footers (optional)
|
|
103
|
+
|
|
104
|
+
- `Refs #123` to reference an issue
|
|
105
|
+
- `BREAKING CHANGE: <description>` if the change is incompatible
|
|
106
|
+
- And/or a `BREAKING CHANGE:` footer in the body
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Pull Request Convention
|
|
111
|
+
|
|
112
|
+
### PR Title
|
|
113
|
+
|
|
114
|
+
- Same format as commits: `<type>(<scope>): <description>`
|
|
115
|
+
- Under 72 characters
|
|
116
|
+
|
|
117
|
+
### Rules
|
|
118
|
+
|
|
119
|
+
- One topic per PR — don't mix unrelated changes
|
|
120
|
+
- Run `bundle exec rspec` and `bundle exec rubocop` locally before pushing
|
|
121
|
+
- Never commit secrets or credentials
|
|
122
|
+
- Don't commit `Gemfile.lock` or `*.gem` build artifacts (both gitignored)
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Architecture
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
guardian-ci.gemspec # The whole point of this gem — 13 add_dependency lines
|
|
130
|
+
lib/guardian/ci.rb # Module stub
|
|
131
|
+
lib/guardian/ci/version.rb # Dated version (written by release workflow)
|
|
132
|
+
cliff.toml # git-cliff config for CHANGELOG generation
|
|
133
|
+
.github/workflows/ # See « CI » below
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
There is intentionally no production code under `lib/`. Phase 2 will add a Thor + Railtie generator (CLI + scaffolds) — until then, this gem ships only its gemspec dependencies.
|
|
137
|
+
|
|
138
|
+
## Code Conventions
|
|
139
|
+
|
|
140
|
+
- `frozen_string_literal: true` on every Ruby file
|
|
141
|
+
- Strings: single quotes (unless interpolation is needed)
|
|
142
|
+
- RuboCop: no rule disabling without justification
|
|
143
|
+
- Version in `lib/guardian/ci/version.rb` — do not modify unless for an explicit release
|
|
144
|
+
|
|
145
|
+
## CI
|
|
146
|
+
|
|
147
|
+
GitHub Actions workflows under `.github/workflows/`, all wired through `fluence-eu/ci-workflows@v7` reusables:
|
|
148
|
+
|
|
149
|
+
- **rubocop-pr.yml** — runs RuboCop on every PR, posts a sticky comment with offense delta vs `main`
|
|
150
|
+
- **rubocop-measure.yml** — establishes the `main` baseline (artifact `rubocop-report`)
|
|
151
|
+
- **prepare-release.yml** — manual dispatch opens a release PR versioned with the UTC dispatch time (`YYYY.MM.DD.HHMMSS`)
|
|
152
|
+
- **release.yml** — on merge of a release PR, creates the tag + GitHub Release
|
|
153
|
+
- **publish.yml** — on Release published, pushes the gem to GitHub Packages (also dispatchable manually with a `tag` input for republishing past versions)
|
|
154
|
+
- **publish-rubygems.yml** — on Release published, pushes the same gem to rubygems.org through trusted publishing (same manual `tag` dispatch)
|
|
155
|
+
|
|
156
|
+
The release App secret `FLUENCE_RELEASE_BOT_PRIVATE_KEY` is forwarded to `release.yml` so the GitHub Release is created with an App-issued token — required for the `publish.yml` chain to fire (see fluence-eu/ci-workflows#12 for the rationale).
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## AI-Assisted Contributions
|
|
161
|
+
|
|
162
|
+
When using AI tools (Claude, Copilot, etc.) to generate commits or PRs:
|
|
163
|
+
|
|
164
|
+
- **Classify first** — determine if the change is critical, major, minor, or trivial
|
|
165
|
+
- **Focus on the "why"** — the diff already shows the "what"
|
|
166
|
+
- **Skip boilerplate** — don't add empty sections or placeholder text
|
|
167
|
+
|
|
168
|
+
The person opening the PR takes full responsibility for the code. Before submitting:
|
|
169
|
+
|
|
170
|
+
- [ ] I have read and understood every line of code in this PR
|
|
171
|
+
- [ ] I can explain why each change was made
|
|
172
|
+
- [ ] I have tested the changes locally
|
|
173
|
+
|
|
174
|
+
Do **not** add AI co-author lines (`Co-Authored-By`), "Generated with" footers, or any AI attribution in commits or PR descriptions.
|
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jonathan PHILIPPE
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|