regresso 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +3 -0
  3. data/CHANGELOG.md +3 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +258 -0
  6. data/Rakefile +12 -0
  7. data/assets/logo-header.svg +28 -0
  8. data/lib/generators/regresso/install_generator.rb +29 -0
  9. data/lib/generators/regresso/templates/regresso.rb +18 -0
  10. data/lib/regresso/adapters/.gitkeep +0 -0
  11. data/lib/regresso/adapters/base.rb +30 -0
  12. data/lib/regresso/adapters/csv.rb +43 -0
  13. data/lib/regresso/adapters/database.rb +53 -0
  14. data/lib/regresso/adapters/database_snapshot.rb +49 -0
  15. data/lib/regresso/adapters/graphql.rb +75 -0
  16. data/lib/regresso/adapters/graphql_batch.rb +42 -0
  17. data/lib/regresso/adapters/http.rb +70 -0
  18. data/lib/regresso/adapters/json_file.rb +30 -0
  19. data/lib/regresso/adapters/proc.rb +30 -0
  20. data/lib/regresso/ci/github_annotation_formatter.rb +46 -0
  21. data/lib/regresso/ci/github_pr_commenter.rb +55 -0
  22. data/lib/regresso/ci/junit_xml_formatter.rb +42 -0
  23. data/lib/regresso/ci/reporter.rb +49 -0
  24. data/lib/regresso/ci.rb +6 -0
  25. data/lib/regresso/comparator.rb +45 -0
  26. data/lib/regresso/configuration.rb +92 -0
  27. data/lib/regresso/differ.rb +129 -0
  28. data/lib/regresso/difference.rb +45 -0
  29. data/lib/regresso/history/entry.rb +70 -0
  30. data/lib/regresso/history/file_backend.rb +51 -0
  31. data/lib/regresso/history/statistics.rb +65 -0
  32. data/lib/regresso/history/store.rb +122 -0
  33. data/lib/regresso/history/trend_reporter.rb +68 -0
  34. data/lib/regresso/history.rb +7 -0
  35. data/lib/regresso/json_path.rb +55 -0
  36. data/lib/regresso/minitest.rb +107 -0
  37. data/lib/regresso/notifiers/base.rb +33 -0
  38. data/lib/regresso/notifiers/microsoft_teams.rb +60 -0
  39. data/lib/regresso/notifiers/slack.rb +72 -0
  40. data/lib/regresso/notifiers.rb +5 -0
  41. data/lib/regresso/parallel/comparison_result.rb +51 -0
  42. data/lib/regresso/parallel/parallel_result.rb +68 -0
  43. data/lib/regresso/parallel/result_aggregator.rb +25 -0
  44. data/lib/regresso/parallel/runner.rb +71 -0
  45. data/lib/regresso/parallel.rb +6 -0
  46. data/lib/regresso/reporter.rb +68 -0
  47. data/lib/regresso/result.rb +70 -0
  48. data/lib/regresso/rspec/.gitkeep +0 -0
  49. data/lib/regresso/rspec/shared_examples.rb +42 -0
  50. data/lib/regresso/rspec.rb +142 -0
  51. data/lib/regresso/snapshot_manager.rb +57 -0
  52. data/lib/regresso/tasks/ci.rake +51 -0
  53. data/lib/regresso/tasks/history.rake +36 -0
  54. data/lib/regresso/templates/.gitkeep +0 -0
  55. data/lib/regresso/templates/report.html.erb +44 -0
  56. data/lib/regresso/version.rb +6 -0
  57. data/lib/regresso/web_ui/diff_formatter.rb +46 -0
  58. data/lib/regresso/web_ui/public/css/app.css +239 -0
  59. data/lib/regresso/web_ui/public/js/app.js +117 -0
  60. data/lib/regresso/web_ui/result_store.rb +60 -0
  61. data/lib/regresso/web_ui/server.rb +70 -0
  62. data/lib/regresso/web_ui/views/index.erb +58 -0
  63. data/lib/regresso/web_ui/views/layout.erb +13 -0
  64. data/lib/regresso/web_ui.rb +5 -0
  65. data/lib/regresso.rb +46 -0
  66. data/sig/regresso.rbs +4 -0
  67. data/site/Gemfile +7 -0
  68. data/site/assets/logo-header.png +0 -0
  69. data/site/assets/site.css +458 -0
  70. data/site/content/index.md +6 -0
  71. data/site/craze.yml +24 -0
  72. data/site/dist/assets/logo-header.svg +28 -0
  73. data/site/dist/assets/site.css +458 -0
  74. data/site/dist/index.html +232 -0
  75. data/site/dist/search.json +9 -0
  76. data/site/dist/sitemap.xml +7 -0
  77. data/site/templates/index.erb +232 -0
  78. data/site/templates/layout.erb +17 -0
  79. metadata +190 -0
@@ -0,0 +1,232 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Regresso - Regression testing for Ruby</title>
7
+ <meta name="description" content="Regression testing for Ruby APIs, files, and data snapshots.">
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Work+Sans:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet">
11
+ <link rel="stylesheet" href="<%= asset_path("site.css") %>">
12
+ </head>
13
+ <body>
14
+ <div class="ambient-orbit"></div>
15
+
16
+ <section class="hero">
17
+ <header class="nav">
18
+ <div class="logo">
19
+ <img src="<%= asset_path("logo-header.png") %>" alt="Regresso logo">
20
+ <span>Regresso</span>
21
+ </div>
22
+ <nav>
23
+ <a href="#features">Features</a>
24
+ <a href="#adapters">Adapters</a>
25
+ <a href="#how">How It Works</a>
26
+ <a href="#web-ui">Web UI</a>
27
+ <a href="#quick-start" class="button ghost">Quick Start</a>
28
+ </nav>
29
+ </header>
30
+
31
+ <div class="hero-grid">
32
+ <div class="hero-copy">
33
+ <p class="eyebrow">Regression testing for Ruby data</p>
34
+ <h1>Catch production drift across APIs, files, and databases.</h1>
35
+ <p class="lead">Regresso compares structured outputs with precision tolerances, ignore rules, and snapshot workflows. Ship confidently, even when data changes are subtle.</p>
36
+ <div class="cta">
37
+ <a class="button primary" href="#quick-start">Get started</a>
38
+ <a class="button ghost" href="https://github.com/ydah/regresso">GitHub</a>
39
+ </div>
40
+ <div class="signal">
41
+ <span>Ruby 3.2+</span>
42
+ <span>APIs · CSV · DB · GraphQL</span>
43
+ <span>CI-ready reports</span>
44
+ </div>
45
+ </div>
46
+
47
+ <div class="hero-card">
48
+ <div class="card-header">
49
+ <span>Latest comparison</span>
50
+ <span class="status ok">Passed</span>
51
+ </div>
52
+ <div class="card-body">
53
+ <pre><code>expect(new_api)
54
+ .to have_no_regression_from(old_api)
55
+ .with_tolerance(0.01)
56
+ .ignoring("$.timestamp")</code></pre>
57
+ </div>
58
+ <div class="card-footer">
59
+ <div>
60
+ <p class="label">Meaningful diffs</p>
61
+ <p class="value">0</p>
62
+ </div>
63
+ <div>
64
+ <p class="label">Runtime</p>
65
+ <p class="value">1.2s</p>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ </div>
70
+ </section>
71
+
72
+ <section id="features" class="section">
73
+ <div class="section-title">
74
+ <h2>Designed for regression certainty</h2>
75
+ <p>Pinpoint where outputs drift and decide what matters to your product.</p>
76
+ </div>
77
+ <div class="feature-grid">
78
+ <article class="feature">
79
+ <h3>Precision diffs</h3>
80
+ <p>JSONPath-level ignores and numeric tolerances keep the signal clean.</p>
81
+ </article>
82
+ <article class="feature">
83
+ <h3>Source adapters</h3>
84
+ <p>Compare HTTP, CSV, JSON files, GraphQL, database queries, and snapshots.</p>
85
+ </article>
86
+ <article class="feature">
87
+ <h3>Snapshots</h3>
88
+ <p>Freeze stable output and review changes when business logic evolves.</p>
89
+ </article>
90
+ <article class="feature">
91
+ <h3>Parallel runs</h3>
92
+ <p>Run many comparisons concurrently and aggregate CI-ready reports.</p>
93
+ </article>
94
+ <article class="feature">
95
+ <h3>Test frameworks</h3>
96
+ <p>RSpec matchers and Minitest assertions come out of the box.</p>
97
+ </article>
98
+ <article class="feature">
99
+ <h3>Web UI</h3>
100
+ <p>Inspect stored results, filter diffs, and share reports with your team.</p>
101
+ </article>
102
+ </div>
103
+ </section>
104
+
105
+ </body>
106
+ </html>
107
+
108
+ <section id="quick-start" class="section split">
109
+ <div>
110
+ <h2>Quick start</h2>
111
+ <p>Install the gem, compare two sources, and inspect the summary.</p>
112
+ <div class="callouts">
113
+ <div>
114
+ <h4>Install</h4>
115
+ <pre><code>bundle add regresso</code></pre>
116
+ </div>
117
+ <div>
118
+ <h4>Compare</h4>
119
+ <pre><code>result = Regresso::Comparator.new(
120
+ source_a: old_api,
121
+ source_b: new_api
122
+ ).compare
123
+ puts result.summary</code></pre>
124
+ </div>
125
+ </div>
126
+ </div>
127
+ <aside class="note">
128
+ <h4>Snapshot flow</h4>
129
+ <p>Lock in stable outputs and keep regressions intentional.</p>
130
+ <pre><code>expect(payload)
131
+ .to match_snapshot("report_total")</code></pre>
132
+ <p class="small">Set <code>UPDATE_SNAPSHOTS=1</code> to refresh stored snapshots.</p>
133
+ </aside>
134
+ </section>
135
+
136
+ <section id="adapters" class="section">
137
+ <div class="section-title">
138
+ <h2>Adapters you can chain together</h2>
139
+ <p>Everything is just a source that responds to <code>fetch</code>.</p>
140
+ </div>
141
+ <div class="adapter-grid">
142
+ <div class="adapter">HTTP APIs</div>
143
+ <div class="adapter">CSV exports</div>
144
+ <div class="adapter">JSON files</div>
145
+ <div class="adapter">GraphQL queries</div>
146
+ <div class="adapter">GraphQL batches</div>
147
+ <div class="adapter">Database queries</div>
148
+ <div class="adapter">Database snapshots</div>
149
+ <div class="adapter">Custom Proc adapters</div>
150
+ </div>
151
+ </section>
152
+
153
+ <section id="how" class="section">
154
+ <div class="section-title">
155
+ <h2>How it works</h2>
156
+ <p>Regresso compares structured data with a clear audit trail.</p>
157
+ </div>
158
+ <ol class="steps">
159
+ <li>Normalize inputs from two sources.</li>
160
+ <li>Compute diffs with type coercion and tolerance rules.</li>
161
+ <li>Filter out ignored paths and noise.</li>
162
+ <li>Generate reports for CI or the Web UI.</li>
163
+ </ol>
164
+ </section>
165
+
166
+ <section id="web-ui" class="section split">
167
+ <div>
168
+ <h2>Web UI for shared visibility</h2>
169
+ <p>Store results on disk, filter diffs, and keep a browseable trail of comparisons.</p>
170
+ <pre><code>require "regresso/web_ui"
171
+
172
+ store = Regresso::WebUI::ResultStore.new(
173
+ storage_path: "tmp/regresso_results"
174
+ )
175
+ Regresso::WebUI::Server.set :result_store, store
176
+ Regresso::WebUI::Server.run!</code></pre>
177
+ </div>
178
+ <div class="ui-preview">
179
+ <div class="ui-header">
180
+ <span>Run #128</span>
181
+ <span class="pill">Diffs</span>
182
+ </div>
183
+ <div class="ui-body">
184
+ <div class="ui-row">
185
+ <span>$.prices[2]</span>
186
+ <span>19.99</span>
187
+ <span>20.10</span>
188
+ <span class="pill warn">changed</span>
189
+ </div>
190
+ <div class="ui-row">
191
+ <span>$.users[4]</span>
192
+ <span>nil</span>
193
+ <span>"Nia"</span>
194
+ <span class="pill ok">added</span>
195
+ </div>
196
+ </div>
197
+ </div>
198
+ </section>
199
+
200
+ <section class="section split">
201
+ <div>
202
+ <h2>CI-friendly outputs</h2>
203
+ <p>Generate JUnit XML or GitHub annotations from parallel runs.</p>
204
+ <pre><code>runner = Regresso::Parallel::Runner.new(
205
+ comparisons: comparisons,
206
+ workers: 4
207
+ )
208
+ result = runner.run
209
+
210
+ reporter = Regresso::CI::Reporter.new(result)
211
+ File.write("tmp/regresso.xml", reporter.to_junit_xml)</code></pre>
212
+ </div>
213
+ <div class="note">
214
+ <h4>History tracking</h4>
215
+ <p>Persist results and build weekly trend reports.</p>
216
+ <pre><code>store = Regresso::History::Store.new
217
+ store.record(result)
218
+ report = Regresso::History::TrendReporter.new(store)
219
+ puts report.generate(period: :week)</code></pre>
220
+ </div>
221
+ </section>
222
+
223
+ <section class="section footer">
224
+ <div>
225
+ <h2>Ready to stop regressions before they ship?</h2>
226
+ <p>Wire Regresso into your test suite and keep data drift visible.</p>
227
+ </div>
228
+ <div class="cta">
229
+ <a class="button primary" href="#quick-start">Start now</a>
230
+ <a class="button ghost" href="https://rubygems.org/gems/regresso">RubyGems</a>
231
+ </div>
232
+ </section>
@@ -0,0 +1,17 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Regresso - Regression testing for Ruby</title>
7
+ <meta name="description" content="Regression testing for Ruby APIs, files, and data snapshots.">
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Work+Sans:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet">
11
+ <link rel="stylesheet" href="<%= asset_path("site.css") %>">
12
+ </head>
13
+ <body>
14
+ <div class="ambient-orbit"></div>
15
+ <%= page["content"] %>
16
+ </body>
17
+ </html>
metadata ADDED
@@ -0,0 +1,190 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: regresso
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Yudai Takada
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: faraday
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '2.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '2.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: faraday-follow_redirects
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.3'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.3'
40
+ - !ruby/object:Gem::Dependency
41
+ name: csv
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.2'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.2'
54
+ - !ruby/object:Gem::Dependency
55
+ name: builder
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.2'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.2'
68
+ - !ruby/object:Gem::Dependency
69
+ name: sinatra
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 4.2.0
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 4.2.0
82
+ description: Detect regressions by comparing API responses, CSV exports, and more
83
+ between environments
84
+ email:
85
+ - t.yudai92@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".yardopts"
91
+ - CHANGELOG.md
92
+ - LICENSE.txt
93
+ - README.md
94
+ - Rakefile
95
+ - assets/logo-header.svg
96
+ - lib/generators/regresso/install_generator.rb
97
+ - lib/generators/regresso/templates/regresso.rb
98
+ - lib/regresso.rb
99
+ - lib/regresso/adapters/.gitkeep
100
+ - lib/regresso/adapters/base.rb
101
+ - lib/regresso/adapters/csv.rb
102
+ - lib/regresso/adapters/database.rb
103
+ - lib/regresso/adapters/database_snapshot.rb
104
+ - lib/regresso/adapters/graphql.rb
105
+ - lib/regresso/adapters/graphql_batch.rb
106
+ - lib/regresso/adapters/http.rb
107
+ - lib/regresso/adapters/json_file.rb
108
+ - lib/regresso/adapters/proc.rb
109
+ - lib/regresso/ci.rb
110
+ - lib/regresso/ci/github_annotation_formatter.rb
111
+ - lib/regresso/ci/github_pr_commenter.rb
112
+ - lib/regresso/ci/junit_xml_formatter.rb
113
+ - lib/regresso/ci/reporter.rb
114
+ - lib/regresso/comparator.rb
115
+ - lib/regresso/configuration.rb
116
+ - lib/regresso/differ.rb
117
+ - lib/regresso/difference.rb
118
+ - lib/regresso/history.rb
119
+ - lib/regresso/history/entry.rb
120
+ - lib/regresso/history/file_backend.rb
121
+ - lib/regresso/history/statistics.rb
122
+ - lib/regresso/history/store.rb
123
+ - lib/regresso/history/trend_reporter.rb
124
+ - lib/regresso/json_path.rb
125
+ - lib/regresso/minitest.rb
126
+ - lib/regresso/notifiers.rb
127
+ - lib/regresso/notifiers/base.rb
128
+ - lib/regresso/notifiers/microsoft_teams.rb
129
+ - lib/regresso/notifiers/slack.rb
130
+ - lib/regresso/parallel.rb
131
+ - lib/regresso/parallel/comparison_result.rb
132
+ - lib/regresso/parallel/parallel_result.rb
133
+ - lib/regresso/parallel/result_aggregator.rb
134
+ - lib/regresso/parallel/runner.rb
135
+ - lib/regresso/reporter.rb
136
+ - lib/regresso/result.rb
137
+ - lib/regresso/rspec.rb
138
+ - lib/regresso/rspec/.gitkeep
139
+ - lib/regresso/rspec/shared_examples.rb
140
+ - lib/regresso/snapshot_manager.rb
141
+ - lib/regresso/tasks/ci.rake
142
+ - lib/regresso/tasks/history.rake
143
+ - lib/regresso/templates/.gitkeep
144
+ - lib/regresso/templates/report.html.erb
145
+ - lib/regresso/version.rb
146
+ - lib/regresso/web_ui.rb
147
+ - lib/regresso/web_ui/diff_formatter.rb
148
+ - lib/regresso/web_ui/public/css/app.css
149
+ - lib/regresso/web_ui/public/js/app.js
150
+ - lib/regresso/web_ui/result_store.rb
151
+ - lib/regresso/web_ui/server.rb
152
+ - lib/regresso/web_ui/views/index.erb
153
+ - lib/regresso/web_ui/views/layout.erb
154
+ - sig/regresso.rbs
155
+ - site/Gemfile
156
+ - site/assets/logo-header.png
157
+ - site/assets/site.css
158
+ - site/content/index.md
159
+ - site/craze.yml
160
+ - site/dist/assets/logo-header.svg
161
+ - site/dist/assets/site.css
162
+ - site/dist/index.html
163
+ - site/dist/search.json
164
+ - site/dist/sitemap.xml
165
+ - site/templates/index.erb
166
+ - site/templates/layout.erb
167
+ homepage: https://github.com/yourname/regresso
168
+ licenses:
169
+ - MIT
170
+ metadata:
171
+ homepage_uri: https://github.com/yourname/regresso
172
+ source_code_uri: https://github.com/yourname/regresso
173
+ rdoc_options: []
174
+ require_paths:
175
+ - lib
176
+ required_ruby_version: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: 3.2.0
181
+ required_rubygems_version: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ requirements: []
187
+ rubygems_version: 4.0.4
188
+ specification_version: 4
189
+ summary: Regression testing framework for Ruby
190
+ test_files: []