sphragis 0.0.1 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c42aaaa6c03beb1f59d52fb1199d1d2e698cedc948c1090fd15ab220380d66c5
4
- data.tar.gz: af16ca3d9aa7dbad982c4cf996bbda71bf42400ddd81b5598d25150e2723aa58
3
+ metadata.gz: caec4dd49336ccfbe8798f7285269be90871d5032986e352a2242b90111a597e
4
+ data.tar.gz: 3e2a6a7a8feaa2e9243578532e41a4f57c301ce20a58136435d6f6335824f822
5
5
  SHA512:
6
- metadata.gz: 3ad587b5f0a3bfdb3ee7f24ea1ba193d09f42896042eeacfdb61222ca1f3decafb0144f41f696291707ab68c0cf05a34cc379be9929acd8db5c09f10995853e4
7
- data.tar.gz: 4578175283a882a5fc14e53b1951cc9bd8e8a141db71d262d317f529c96f706fc6d7c6f182f897533d12706d379c83337722d30bb2f4d08e9738b81109ba76e1
6
+ metadata.gz: f8e03224faf76f6b4a9bdad2753c0f600616703eddb36d36fb09c96117942e8f6a44c0f88a005412f82dd2bd38d78defa7e1e810160ac62c554f117f092b5f5f
7
+ data.tar.gz: 3bf5ab5f54e3ab0da195df9866964a0b48e8f3e648947f56d2c8a8f0faf887cdff41706bdb78fa5d57b12c96b62601a446db8366d0cbb27e0b38bfa8d630fdf0
@@ -0,0 +1,42 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ name: Ruby ${{ matrix.ruby }} / Rails ${{ matrix.rails }}
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ include:
17
+ - ruby: "3.2"
18
+ gemfile: gemfiles/rails_61.gemfile
19
+ rails: "6.1"
20
+ - ruby: "3.2"
21
+ gemfile: gemfiles/rails_72.gemfile
22
+ rails: "7.2"
23
+ - ruby: "3.2"
24
+ gemfile: gemfiles/rails_80.gemfile
25
+ rails: "8.0"
26
+ - ruby: "3.2"
27
+ gemfile: gemfiles/rails_81.gemfile
28
+ rails: "8.1"
29
+
30
+ env:
31
+ BUNDLE_GEMFILE: ${{ matrix.gemfile }}
32
+
33
+ steps:
34
+ - uses: actions/checkout@v4
35
+
36
+ - uses: ruby/setup-ruby@v1
37
+ with:
38
+ ruby-version: ${{ matrix.ruby }}
39
+ bundler-cache: true
40
+
41
+ - name: Run tests
42
+ run: bundle exec rake test
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.2.9
data/CHANGELOG.md CHANGED
@@ -7,18 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.1.0] - 2026-03-01
11
+
10
12
  ### Added
11
13
  - Initial release of Sphragis (Σφραγίς) - Digital PDF Signatures for Rails
12
14
  - Multi-provider architecture supporting:
13
15
  - Fortify WebCrypto (FREE open-source, hardware tokens)
14
16
  - Harica (FREE for Greek academic institutions, eIDAS qualified)
15
17
  - Itsme (template for free e-signature services)
18
+ - **ISO 32000-compliant PDF signing** via easy_code_sign native backend
19
+ - Real CMS/PKCS#7 signatures embedded in PDF (adbe.pkcs7.detached)
20
+ - Harica cloud path: full-document signing via rsign-api.harica.gr DSA API
21
+ - Local path (Fortify, Itsme): sign_bytes(hash) callback → NativeSigner embeds CMS
22
+ - Fully MIT-licensed dependency chain — no AGPL (HexaPDF) required
16
23
  - Rails Engine with interactive PDF signature placement
17
24
  - PDF.js-based viewer with drag-and-drop signature positioning
18
25
  - Provider factory pattern for easy extension
19
26
  - Configuration system with environment variable support
20
- - Comprehensive documentation suite
21
- - Logo design inspired by ancient Greek σφραγιδόλιθοι (sealstones)
27
+ - CI matrix: Rails 6.1, 7.2, 8.0, 8.1
22
28
  - Complete test suite (Minitest)
23
29
  - RuboCop code quality checks
24
30
  - Bundler-audit security scanning
@@ -29,8 +35,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
29
35
  - FORTIFY_WEBCRYPTO.md for Fortify setup
30
36
  - LICENSING_SUMMARY.md for cost breakdown
31
37
  - MULTIPLE_PROVIDERS.md for multi-provider usage
32
- - LOGO.md for branding guidelines
33
- - LOGO_FILES.md for logo assets reference
34
38
 
35
39
  ## Notes
36
40
 
@@ -57,6 +61,9 @@ See README.md for details on FREE eIDAS qualified certificates.
57
61
  - `Security` - Security fixes and improvements
58
62
  - `Documentation` - Documentation changes
59
63
 
64
+ [Unreleased]: https://github.com/mpantel/sphragis/compare/v0.1.0...HEAD
65
+ [0.1.0]: https://github.com/mpantel/sphragis/releases/tag/v0.1.0
66
+
60
67
  ### Disclaimer
61
68
 
62
69
  > **⚠️ EARLY DEVELOPMENT VERSION**
data/CLAUDE.md ADDED
@@ -0,0 +1,50 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ Sphragis is a Ruby gem (Rails Engine) providing multi-provider PDF digital signatures. It targets Greek academic institutions (free via Harica) and commercial use (Fortify hardware tokens). Early development — provider integrations currently use simulated/placeholder implementations.
8
+
9
+ ## Commands
10
+
11
+ ```bash
12
+ bundle exec rake test # Run full test suite (Minitest)
13
+ bundle exec ruby -Ilib:test test/sphragis/test_pdf_signer.rb # Run single test file
14
+ bundle exec rubocop # Lint
15
+ bundle exec bundle-audit check # Security audit
16
+ bundle exec rake build # Build gem
17
+ ```
18
+
19
+ ## Architecture
20
+
21
+ **Rails Engine** (`Sphragis::Engine`) mounted at a user-chosen path (e.g., `/signatures`). Isolates namespace.
22
+
23
+ **Provider pattern** — all signing goes through `Providers::BaseProvider` (abstract):
24
+ - `FortifyProvider` — PKCS#11 hardware token signing (simulated)
25
+ - `FortifyWebcryptoProvider` — Fortify WebCrypto bridge REST API (simulated, most complete API sketch)
26
+ - `HaricaProvider` — Harica cloud CA REST API (simulated)
27
+ - `ItsmeProvider` — template/example provider (simulated)
28
+
29
+ Providers are lazily `require_relative`'d by `ProviderFactory.create(:name)`. The factory reads global config to build provider instances.
30
+
31
+ **Key flow**: `PdfSigner.new(path, opts)` → `ProviderFactory.create` → `provider.connect` → `provider.sign(data)` → writes `_signed.pdf` + `_signature.json` sidecar.
32
+
33
+ **Configuration**: `Sphragis.configure { |c| ... }` block populating `Sphragis::Configuration`. Defaults from ENV vars. Reset with `Sphragis.reset_configuration!` (used in test setup).
34
+
35
+ **Controller**: `DocumentsController` handles preview/view/sign/validate_placement. Preview renders PDF.js UI for drag-and-drop signature placement.
36
+
37
+ ## Conventions
38
+
39
+ - `frozen_string_literal: true` on all Ruby files
40
+ - RuboCop with `rubocop-rails` and `rubocop-minitest` plugins
41
+ - Double-quoted strings (`Style/StringLiterals: double_quotes`)
42
+ - Max line length 120, method length 25, class length 150, AbcSize 20
43
+ - Tests use Minitest + Mocha for mocking; test helper resets config and creates temp PDFs via Prawn
44
+ - Ruby >= 3.2, Rails >= 6.1 < 8.0
45
+
46
+ ## Test Setup
47
+
48
+ Tests auto-reset `Sphragis.configuration` in `setup`. `create_test_pdf` generates a 2-page PDF in `test/fixtures/`. Teardown cleans `*_signed.pdf` and `*_signature.json` artifacts.
49
+
50
+ Most provider tests configure Fortify credentials since it's the default provider. To test other providers, configure the appropriate credentials and pass `provider: :harica` (etc.) in options.
data/README.md CHANGED
@@ -272,6 +272,9 @@ bundle exec rubocop
272
272
 
273
273
  # Security audit
274
274
  bundle exec bundle-audit check
275
+
276
+ # Static security analysis
277
+ bundle exec rake brakeman
275
278
  ```
276
279
 
277
280
  ## Documentation
@@ -280,6 +283,7 @@ bundle exec bundle-audit check
280
283
  - [FORTIFY_WEBCRYPTO.md](doc/FORTIFY_WEBCRYPTO.md) - Fortify setup guide
281
284
  - [LICENSING_SUMMARY.md](doc/LICENSING_SUMMARY.md) - Complete cost breakdown
282
285
  - [MULTIPLE_PROVIDERS.md](doc/MULTIPLE_PROVIDERS.md) - Multi-provider usage
286
+ - [DSS_FUTURE.md](doc/DSS_FUTURE.md) - EU Digital Signature Service (future provider)
283
287
  - [LOGO.md](doc/LOGO.md) - Logo design and branding
284
288
 
285
289
  ## Logo & Branding
@@ -310,7 +314,7 @@ See [LOGO.md](doc/LOGO.md) for design details.
310
314
 
311
315
  **Planned:**
312
316
  - 🔄 Production testing and hardening
313
- - 🔄 Additional provider support
317
+ - 🔄 Additional provider support (DSS for institutional batch signing)
314
318
  - 🔄 Batch signing operations
315
319
  - 🔄 Signature verification
316
320
  - 🔄 Audit logging
@@ -356,7 +360,7 @@ MIT License - See [LICENSE](LICENSE) for details.
356
360
 
357
361
  **Sphragis is an independent open-source project.** We are NOT affiliated with, endorsed by, or sponsored by any of the third-party providers, services, or products mentioned in this documentation, including but not limited to:
358
362
 
359
- - Peculiar Ventures (Fortify) • Harica • Yubico (YubiKey) • Nitrokey • ItsMe • OpenSC Project • Any certificate authorities or hardware manufacturers
363
+ - Peculiar Ventures (Fortify) • Harica • Yubico (YubiKey) • Nitrokey • ItsMe • OpenSC Project • EU Digital Signature Service (DSS) • European Commission • Any certificate authorities or hardware manufacturers
360
364
 
361
365
  All trademarks and product names are property of their respective owners. This gem provides integration code only. Users are responsible for complying with third-party terms of service and any associated costs.
362
366
 
data/Rakefile CHANGED
@@ -5,4 +5,22 @@ require "minitest/test_task"
5
5
 
6
6
  Minitest::TestTask.create
7
7
 
8
+ # Brakeman security scanner
9
+ begin
10
+ require "brakeman"
11
+
12
+ desc "Run Brakeman security scanner"
13
+ task :brakeman do
14
+ require "brakeman"
15
+ result = Brakeman.run(
16
+ app_path: ".",
17
+ print_report: true,
18
+ config_file: "config/brakeman.yml"
19
+ )
20
+ exit Brakeman::Warnings_Found_Exit_Code if result.filtered_warnings.any?
21
+ end
22
+ rescue LoadError
23
+ # Brakeman not available
24
+ end
25
+
8
26
  task default: :test
@@ -0,0 +1,43 @@
1
+ # Brakeman configuration for Sphragis
2
+ # https://brakemanscanner.org/docs/options/
3
+
4
+ # Application path (default: ".")
5
+ app_path: "."
6
+
7
+ # Rails engine mode
8
+ rails_engines: true
9
+
10
+ # Output format (can be: text, html, json, markdown, csv, tabs, etc.)
11
+ output_format: text
12
+
13
+ # Minimum confidence level (1-3, where 1 is low confidence, 3 is high)
14
+ min_confidence: 2
15
+
16
+ # Exit with error code if warnings are found
17
+ exit_on_warn: false
18
+
19
+ # Ignore specific warnings by fingerprint
20
+ # Run `brakeman -I` to add warnings to ignore
21
+ # ignore_file: config/brakeman.ignore
22
+
23
+ # Check specific paths
24
+ # path: .
25
+
26
+ # Skip certain checks
27
+ # skip_checks:
28
+ # - SQL
29
+ # - LinkTo
30
+
31
+ # Only run certain checks
32
+ # run_checks:
33
+ # - SQL
34
+ # - CrossSiteScripting
35
+
36
+ # Treat all warnings as errors for CI (optional)
37
+ # ensure_latest: true
38
+
39
+ # Show context around warnings
40
+ # limit: 100
41
+
42
+ # Rails version (auto-detected from Gemfile.lock)
43
+ # rails_version: 7.0
data/demo/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'sinatra'
4
+ gem 'sinatra-contrib'
5
+ gem 'puma'
6
+ gem 'sphragis', path: '..'
data/demo/Gemfile.lock ADDED
@@ -0,0 +1,271 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ sphragis (0.0.1)
5
+ pdf-reader (~> 2.0)
6
+ prawn (~> 2.4)
7
+ rails (>= 6.1, < 8.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ Ascii85 (2.0.1)
13
+ actioncable (7.1.5.2)
14
+ actionpack (= 7.1.5.2)
15
+ activesupport (= 7.1.5.2)
16
+ nio4r (~> 2.0)
17
+ websocket-driver (>= 0.6.1)
18
+ zeitwerk (~> 2.6)
19
+ actionmailbox (7.1.5.2)
20
+ actionpack (= 7.1.5.2)
21
+ activejob (= 7.1.5.2)
22
+ activerecord (= 7.1.5.2)
23
+ activestorage (= 7.1.5.2)
24
+ activesupport (= 7.1.5.2)
25
+ mail (>= 2.7.1)
26
+ net-imap
27
+ net-pop
28
+ net-smtp
29
+ actionmailer (7.1.5.2)
30
+ actionpack (= 7.1.5.2)
31
+ actionview (= 7.1.5.2)
32
+ activejob (= 7.1.5.2)
33
+ activesupport (= 7.1.5.2)
34
+ mail (~> 2.5, >= 2.5.4)
35
+ net-imap
36
+ net-pop
37
+ net-smtp
38
+ rails-dom-testing (~> 2.2)
39
+ actionpack (7.1.5.2)
40
+ actionview (= 7.1.5.2)
41
+ activesupport (= 7.1.5.2)
42
+ nokogiri (>= 1.8.5)
43
+ racc
44
+ rack (>= 2.2.4)
45
+ rack-session (>= 1.0.1)
46
+ rack-test (>= 0.6.3)
47
+ rails-dom-testing (~> 2.2)
48
+ rails-html-sanitizer (~> 1.6)
49
+ actiontext (7.1.5.2)
50
+ actionpack (= 7.1.5.2)
51
+ activerecord (= 7.1.5.2)
52
+ activestorage (= 7.1.5.2)
53
+ activesupport (= 7.1.5.2)
54
+ globalid (>= 0.6.0)
55
+ nokogiri (>= 1.8.5)
56
+ actionview (7.1.5.2)
57
+ activesupport (= 7.1.5.2)
58
+ builder (~> 3.1)
59
+ erubi (~> 1.11)
60
+ rails-dom-testing (~> 2.2)
61
+ rails-html-sanitizer (~> 1.6)
62
+ activejob (7.1.5.2)
63
+ activesupport (= 7.1.5.2)
64
+ globalid (>= 0.3.6)
65
+ activemodel (7.1.5.2)
66
+ activesupport (= 7.1.5.2)
67
+ activerecord (7.1.5.2)
68
+ activemodel (= 7.1.5.2)
69
+ activesupport (= 7.1.5.2)
70
+ timeout (>= 0.4.0)
71
+ activestorage (7.1.5.2)
72
+ actionpack (= 7.1.5.2)
73
+ activejob (= 7.1.5.2)
74
+ activerecord (= 7.1.5.2)
75
+ activesupport (= 7.1.5.2)
76
+ marcel (~> 1.0)
77
+ activesupport (7.1.5.2)
78
+ base64
79
+ benchmark (>= 0.3)
80
+ bigdecimal
81
+ concurrent-ruby (~> 1.0, >= 1.0.2)
82
+ connection_pool (>= 2.2.5)
83
+ drb
84
+ i18n (>= 1.6, < 2)
85
+ logger (>= 1.4.2)
86
+ minitest (>= 5.1)
87
+ mutex_m
88
+ securerandom (>= 0.3)
89
+ tzinfo (~> 2.0)
90
+ afm (1.0.0)
91
+ base64 (0.3.0)
92
+ benchmark (0.5.0)
93
+ bigdecimal (3.3.1)
94
+ builder (3.3.0)
95
+ concurrent-ruby (1.3.5)
96
+ connection_pool (2.5.4)
97
+ crass (1.0.6)
98
+ date (3.4.1)
99
+ drb (2.2.3)
100
+ erb (5.1.1)
101
+ erubi (1.13.1)
102
+ globalid (1.3.0)
103
+ activesupport (>= 6.1)
104
+ hashery (2.1.2)
105
+ i18n (1.14.7)
106
+ concurrent-ruby (~> 1.0)
107
+ io-console (0.8.1)
108
+ irb (1.15.2)
109
+ pp (>= 0.6.0)
110
+ rdoc (>= 4.0.0)
111
+ reline (>= 0.4.2)
112
+ logger (1.7.0)
113
+ loofah (2.24.1)
114
+ crass (~> 1.0.2)
115
+ nokogiri (>= 1.12.0)
116
+ mail (2.8.1)
117
+ mini_mime (>= 0.1.1)
118
+ net-imap
119
+ net-pop
120
+ net-smtp
121
+ marcel (1.1.0)
122
+ matrix (0.4.3)
123
+ mini_mime (1.1.5)
124
+ minitest (5.26.0)
125
+ multi_json (1.17.0)
126
+ mustermann (3.0.4)
127
+ ruby2_keywords (~> 0.0.1)
128
+ mutex_m (0.3.0)
129
+ net-imap (0.5.12)
130
+ date
131
+ net-protocol
132
+ net-pop (0.1.2)
133
+ net-protocol
134
+ net-protocol (0.2.2)
135
+ timeout
136
+ net-smtp (0.5.1)
137
+ net-protocol
138
+ nio4r (2.7.4)
139
+ nokogiri (1.18.10-aarch64-linux-gnu)
140
+ racc (~> 1.4)
141
+ nokogiri (1.18.10-aarch64-linux-musl)
142
+ racc (~> 1.4)
143
+ nokogiri (1.18.10-arm-linux-gnu)
144
+ racc (~> 1.4)
145
+ nokogiri (1.18.10-arm-linux-musl)
146
+ racc (~> 1.4)
147
+ nokogiri (1.18.10-arm64-darwin)
148
+ racc (~> 1.4)
149
+ nokogiri (1.18.10-x86_64-darwin)
150
+ racc (~> 1.4)
151
+ nokogiri (1.18.10-x86_64-linux-gnu)
152
+ racc (~> 1.4)
153
+ nokogiri (1.18.10-x86_64-linux-musl)
154
+ racc (~> 1.4)
155
+ pdf-core (0.10.0)
156
+ pdf-reader (2.15.0)
157
+ Ascii85 (>= 1.0, < 3.0, != 2.0.0)
158
+ afm (>= 0.2.1, < 2)
159
+ hashery (~> 2.0)
160
+ ruby-rc4
161
+ ttfunk
162
+ pp (0.6.3)
163
+ prettyprint
164
+ prawn (2.5.0)
165
+ matrix (~> 0.4)
166
+ pdf-core (~> 0.10.0)
167
+ ttfunk (~> 1.8)
168
+ prettyprint (0.2.0)
169
+ psych (5.2.6)
170
+ date
171
+ stringio
172
+ puma (7.1.0)
173
+ nio4r (~> 2.0)
174
+ racc (1.8.1)
175
+ rack (3.2.3)
176
+ rack-protection (4.2.1)
177
+ base64 (>= 0.1.0)
178
+ logger (>= 1.6.0)
179
+ rack (>= 3.0.0, < 4)
180
+ rack-session (2.1.1)
181
+ base64 (>= 0.1.0)
182
+ rack (>= 3.0.0)
183
+ rack-test (2.2.0)
184
+ rack (>= 1.3)
185
+ rackup (2.2.1)
186
+ rack (>= 3)
187
+ rails (7.1.5.2)
188
+ actioncable (= 7.1.5.2)
189
+ actionmailbox (= 7.1.5.2)
190
+ actionmailer (= 7.1.5.2)
191
+ actionpack (= 7.1.5.2)
192
+ actiontext (= 7.1.5.2)
193
+ actionview (= 7.1.5.2)
194
+ activejob (= 7.1.5.2)
195
+ activemodel (= 7.1.5.2)
196
+ activerecord (= 7.1.5.2)
197
+ activestorage (= 7.1.5.2)
198
+ activesupport (= 7.1.5.2)
199
+ bundler (>= 1.15.0)
200
+ railties (= 7.1.5.2)
201
+ rails-dom-testing (2.3.0)
202
+ activesupport (>= 5.0.0)
203
+ minitest
204
+ nokogiri (>= 1.6)
205
+ rails-html-sanitizer (1.6.2)
206
+ loofah (~> 2.21)
207
+ nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
208
+ railties (7.1.5.2)
209
+ actionpack (= 7.1.5.2)
210
+ activesupport (= 7.1.5.2)
211
+ irb
212
+ rackup (>= 1.0.0)
213
+ rake (>= 12.2)
214
+ thor (~> 1.0, >= 1.2.2)
215
+ zeitwerk (~> 2.6)
216
+ rake (13.3.0)
217
+ rdoc (6.15.0)
218
+ erb
219
+ psych (>= 4.0.0)
220
+ tsort
221
+ reline (0.6.2)
222
+ io-console (~> 0.5)
223
+ ruby-rc4 (0.1.5)
224
+ ruby2_keywords (0.0.5)
225
+ securerandom (0.4.1)
226
+ sinatra (4.2.1)
227
+ logger (>= 1.6.0)
228
+ mustermann (~> 3.0)
229
+ rack (>= 3.0.0, < 4)
230
+ rack-protection (= 4.2.1)
231
+ rack-session (>= 2.0.0, < 3)
232
+ tilt (~> 2.0)
233
+ sinatra-contrib (4.2.1)
234
+ multi_json (>= 0.0.2)
235
+ mustermann (~> 3.0)
236
+ rack-protection (= 4.2.1)
237
+ sinatra (= 4.2.1)
238
+ tilt (~> 2.0)
239
+ stringio (3.1.7)
240
+ thor (1.4.0)
241
+ tilt (2.6.1)
242
+ timeout (0.4.3)
243
+ tsort (0.2.0)
244
+ ttfunk (1.8.0)
245
+ bigdecimal (~> 3.1)
246
+ tzinfo (2.0.6)
247
+ concurrent-ruby (~> 1.0)
248
+ websocket-driver (0.8.0)
249
+ base64
250
+ websocket-extensions (>= 0.1.0)
251
+ websocket-extensions (0.1.5)
252
+ zeitwerk (2.7.3)
253
+
254
+ PLATFORMS
255
+ aarch64-linux-gnu
256
+ aarch64-linux-musl
257
+ arm-linux-gnu
258
+ arm-linux-musl
259
+ arm64-darwin
260
+ x86_64-darwin
261
+ x86_64-linux-gnu
262
+ x86_64-linux-musl
263
+
264
+ DEPENDENCIES
265
+ puma
266
+ sinatra
267
+ sinatra-contrib
268
+ sphragis!
269
+
270
+ BUNDLED WITH
271
+ 2.7.2