capsium 0.1.1 → 0.2.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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +1 -4
  3. data/.github/workflows/release.yml +1 -2
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +34 -3
  6. data/CHANGELOG.md +58 -0
  7. data/Gemfile +4 -4
  8. data/LICENSE +21 -0
  9. data/README.adoc +177 -135
  10. data/Rakefile +8 -1
  11. data/bin/console +1 -1
  12. data/capsium.gemspec +16 -23
  13. data/exe/capsium +1 -1
  14. data/lib/capsium/cli/convert.rb +18 -0
  15. data/lib/capsium/cli/package.rb +86 -0
  16. data/lib/capsium/cli/reactor.rb +25 -0
  17. data/lib/capsium/cli.rb +5 -79
  18. data/lib/capsium/converters/jekyll.rb +62 -31
  19. data/lib/capsium/converters.rb +7 -0
  20. data/lib/capsium/package/dataset.rb +76 -56
  21. data/lib/capsium/package/manifest.rb +41 -50
  22. data/lib/capsium/package/manifest_config.rb +64 -0
  23. data/lib/capsium/package/metadata.rb +11 -29
  24. data/lib/capsium/package/metadata_config.rb +105 -0
  25. data/lib/capsium/package/routes.rb +51 -111
  26. data/lib/capsium/package/routes_config.rb +150 -0
  27. data/lib/capsium/package/security.rb +123 -0
  28. data/lib/capsium/package/security_config.rb +60 -0
  29. data/lib/capsium/package/storage.rb +26 -26
  30. data/lib/capsium/package/storage_config.rb +106 -0
  31. data/lib/capsium/package/validator.rb +149 -0
  32. data/lib/capsium/package.rb +84 -70
  33. data/lib/capsium/packager.rb +60 -62
  34. data/lib/capsium/reactor/introspection.rb +88 -0
  35. data/lib/capsium/reactor.rb +108 -36
  36. data/lib/capsium/version.rb +1 -1
  37. data/lib/capsium.rb +7 -9
  38. data/sig/capsium/package/dataset.rbs +28 -0
  39. data/sig/capsium/package/manifest.rbs +34 -0
  40. data/sig/capsium/package/manifest_config.rbs +38 -0
  41. data/sig/capsium/package/metadata.rbs +26 -0
  42. data/sig/capsium/package/metadata_config.rbs +49 -0
  43. data/sig/capsium/package/routes.rbs +37 -0
  44. data/sig/capsium/package/routes_config.rbs +74 -0
  45. data/sig/capsium/package/security.rbs +65 -0
  46. data/sig/capsium/package/security_config.rbs +57 -0
  47. data/sig/capsium/package/storage.rbs +28 -0
  48. data/sig/capsium/package/storage_config.rbs +61 -0
  49. data/sig/capsium/package/validator.rbs +29 -0
  50. data/sig/capsium/package.rbs +53 -0
  51. data/sig/capsium/packager.rbs +23 -0
  52. data/sig/capsium/reactor/introspection.rbs +31 -0
  53. data/sig/capsium/reactor.rbs +30 -0
  54. data/sig/capsium.rbs +3 -1
  55. metadata +63 -146
  56. data/images/005df7415a331c466ad2d9a42efdd212b6f42fe50b5fd3b3174c86c706f58244.png +0 -0
  57. data/images/0374025b3af99b8a473282c8cbbf9fcd29573cf41e586982f328f86c0690f43d.png +0 -0
  58. data/images/0bb4da785be40ef58e219470ebccb979325928b75453dc46bac23c6ee8a7a7cb.png +0 -0
  59. data/images/6aa294dccc81af594aacbe804e7ddffdc17eacc28357338108aea5d021d831ff.png +0 -0
  60. data/images/72dd3fbf3f4b475e27a0e7fb8137c475c32c41f8d222bcf62d6a9ccf102d9532.png +0 -0
  61. data/images/8772b6961d169738d7b0fa0b669b06fc2f40632d4c62586c7634fc17b93182a3.png +0 -0
  62. data/images/a998d842405933d45723606ff3f70162ec95b4ef30db25464a366184fd08fb9b.png +0 -0
  63. data/images/aa8980547e8c003d33273ab4d80e62da7f317bd7581b293c06d67f5331f24f31.png +0 -0
  64. data/images/bb78a872b539e0e9b2d80dee58acbb688f3f2727b324a5bf8bf417a69d94a166.png +0 -0
  65. data/images/c48fc83b17725d85fbb64d971196ebfccd8c5c757fe6aa5845303f6e315879b6.png +0 -0
  66. data/images/f08ef07308d08119ac2124bb7428c8bef17ef1ca70045696604d6e83015a9b91.png +0 -0
  67. data/images/f7514206111b695647eae9adfcf498ba3e0ff83ecfe25f3fc3ed8e9f04c5c726-1.png +0 -0
  68. data/images/f7514206111b695647eae9adfcf498ba3e0ff83ecfe25f3fc3ed8e9f04c5c726.png +0 -0
  69. data/lib/capsium/protector.rb +0 -95
@@ -0,0 +1,30 @@
1
+ module Capsium
2
+ # Rack-free WEBrick reactor: serves the package routes plus the
3
+ # Monitoring HTTP API (ARCHITECTURE.md section 7) and reloads the
4
+ # package on filesystem changes.
5
+ class Reactor
6
+ DEFAULT_PORT: Integer
7
+ DEFAULT_CACHE_CONTROL: String
8
+
9
+ attr_reader package: Package
10
+ attr_reader package_path: String
11
+ attr_reader routes: Package::Routes
12
+ attr_reader port: Integer
13
+ attr_reader cache_control: String?
14
+ attr_reader server: untyped
15
+ attr_reader server_thread: Thread?
16
+ attr_reader introspection: Introspection
17
+
18
+ def initialize: (package: Package | String package, ?port: Integer port,
19
+ ?cache_control: String? cache_control,
20
+ ?do_not_listen: bool do_not_listen) -> void
21
+
22
+ def serve: () -> untyped
23
+
24
+ def handle_request: (untyped request, untyped response) -> untyped
25
+
26
+ def mount_routes: () -> void
27
+
28
+ def restart_server: () -> Thread
29
+ end
30
+ end
data/sig/capsium.rbs CHANGED
@@ -1,4 +1,6 @@
1
1
  module Capsium
2
+ class Error < StandardError
3
+ end
4
+
2
5
  VERSION: String
3
- # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
6
  end
metadata CHANGED
@@ -1,29 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capsium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-06-05 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: cssminify
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
12
  - !ruby/object:Gem::Dependency
28
13
  name: csv
29
14
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +24,7 @@ dependencies:
39
24
  - !ruby/object:Gem::Version
40
25
  version: '0'
41
26
  - !ruby/object:Gem::Dependency
42
- name: htmlcompressor
27
+ name: json
43
28
  requirement: !ruby/object:Gem::Requirement
44
29
  requirements:
45
30
  - - ">="
@@ -53,7 +38,7 @@ dependencies:
53
38
  - !ruby/object:Gem::Version
54
39
  version: '0'
55
40
  - !ruby/object:Gem::Dependency
56
- name: html-proofer
41
+ name: json-schema
57
42
  requirement: !ruby/object:Gem::Requirement
58
43
  requirements:
59
44
  - - ">="
@@ -67,7 +52,7 @@ dependencies:
67
52
  - !ruby/object:Gem::Version
68
53
  version: '0'
69
54
  - !ruby/object:Gem::Dependency
70
- name: json
55
+ name: listen
71
56
  requirement: !ruby/object:Gem::Requirement
72
57
  requirements:
73
58
  - - ">="
@@ -81,19 +66,25 @@ dependencies:
81
66
  - !ruby/object:Gem::Version
82
67
  version: '0'
83
68
  - !ruby/object:Gem::Dependency
84
- name: listen
69
+ name: lutaml-model
85
70
  requirement: !ruby/object:Gem::Requirement
86
71
  requirements:
87
72
  - - ">="
88
73
  - !ruby/object:Gem::Version
89
- version: '0'
74
+ version: '0.8'
75
+ - - "<"
76
+ - !ruby/object:Gem::Version
77
+ version: '1.0'
90
78
  type: :runtime
91
79
  prerelease: false
92
80
  version_requirements: !ruby/object:Gem::Requirement
93
81
  requirements:
94
82
  - - ">="
95
83
  - !ruby/object:Gem::Version
96
- version: '0'
84
+ version: '0.8'
85
+ - - "<"
86
+ - !ruby/object:Gem::Version
87
+ version: '1.0'
97
88
  - !ruby/object:Gem::Dependency
98
89
  name: marcel
99
90
  requirement: !ruby/object:Gem::Requirement
@@ -112,44 +103,22 @@ dependencies:
112
103
  name: rubyzip
113
104
  requirement: !ruby/object:Gem::Requirement
114
105
  requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: 2.3.2
118
- type: :runtime
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
106
+ - - ">="
123
107
  - !ruby/object:Gem::Version
124
108
  version: 2.3.2
125
- - !ruby/object:Gem::Dependency
126
- name: scss_lint
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ">="
109
+ - - "<"
130
110
  - !ruby/object:Gem::Version
131
- version: '0'
111
+ version: '4.0'
132
112
  type: :runtime
133
113
  prerelease: false
134
114
  version_requirements: !ruby/object:Gem::Requirement
135
115
  requirements:
136
116
  - - ">="
137
117
  - !ruby/object:Gem::Version
138
- version: '0'
139
- - !ruby/object:Gem::Dependency
140
- name: shale
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :runtime
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - ">="
118
+ version: 2.3.2
119
+ - - "<"
151
120
  - !ruby/object:Gem::Version
152
- version: '0'
121
+ version: '4.0'
153
122
  - !ruby/object:Gem::Dependency
154
123
  name: sqlite3
155
124
  requirement: !ruby/object:Gem::Requirement
@@ -178,20 +147,6 @@ dependencies:
178
147
  - - ">="
179
148
  - !ruby/object:Gem::Version
180
149
  version: '0'
181
- - !ruby/object:Gem::Dependency
182
- name: uglifier
183
- requirement: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - ">="
186
- - !ruby/object:Gem::Version
187
- version: '0'
188
- type: :runtime
189
- prerelease: false
190
- version_requirements: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - ">="
193
- - !ruby/object:Gem::Version
194
- version: '0'
195
150
  - !ruby/object:Gem::Dependency
196
151
  name: webrick
197
152
  requirement: !ruby/object:Gem::Requirement
@@ -220,65 +175,12 @@ dependencies:
220
175
  - - ">="
221
176
  - !ruby/object:Gem::Version
222
177
  version: '0'
223
- - !ruby/object:Gem::Dependency
224
- name: pry
225
- requirement: !ruby/object:Gem::Requirement
226
- requirements:
227
- - - "~>"
228
- - !ruby/object:Gem::Version
229
- version: 0.12.2
230
- type: :development
231
- prerelease: false
232
- version_requirements: !ruby/object:Gem::Requirement
233
- requirements:
234
- - - "~>"
235
- - !ruby/object:Gem::Version
236
- version: 0.12.2
237
- - !ruby/object:Gem::Dependency
238
- name: rake
239
- requirement: !ruby/object:Gem::Requirement
240
- requirements:
241
- - - "~>"
242
- - !ruby/object:Gem::Version
243
- version: '13.0'
244
- type: :development
245
- prerelease: false
246
- version_requirements: !ruby/object:Gem::Requirement
247
- requirements:
248
- - - "~>"
249
- - !ruby/object:Gem::Version
250
- version: '13.0'
251
- - !ruby/object:Gem::Dependency
252
- name: rspec
253
- requirement: !ruby/object:Gem::Requirement
254
- requirements:
255
- - - "~>"
256
- - !ruby/object:Gem::Version
257
- version: '3.11'
258
- type: :development
259
- prerelease: false
260
- version_requirements: !ruby/object:Gem::Requirement
261
- requirements:
262
- - - "~>"
263
- - !ruby/object:Gem::Version
264
- version: '3.11'
265
- - !ruby/object:Gem::Dependency
266
- name: rubocop
267
- requirement: !ruby/object:Gem::Requirement
268
- requirements:
269
- - - "~>"
270
- - !ruby/object:Gem::Version
271
- version: '1.58'
272
- type: :development
273
- prerelease: false
274
- version_requirements: !ruby/object:Gem::Requirement
275
- requirements:
276
- - - "~>"
277
- - !ruby/object:Gem::Version
278
- version: '1.58'
279
- description: Capsium
178
+ description: 'Capsium facilitates the creation, management and deployment of content
179
+ packages with ease. This gem provides a structured way to handle content, data,
180
+ and metadata for various applications: it packages them into .cap files and serves
181
+ them over HTTP.'
280
182
  email:
281
- - open.source@ribose.com'
183
+ - open.source@ribose.com
282
184
  executables:
283
185
  - capsium
284
186
  extensions: []
@@ -289,50 +191,66 @@ files:
289
191
  - ".gitignore"
290
192
  - ".rspec"
291
193
  - ".rubocop.yml"
194
+ - CHANGELOG.md
292
195
  - CODE_OF_CONDUCT.md
293
196
  - Gemfile
197
+ - LICENSE
294
198
  - README.adoc
295
199
  - Rakefile
296
200
  - bin/console
297
201
  - bin/setup
298
202
  - capsium.gemspec
299
203
  - exe/capsium
300
- - images/005df7415a331c466ad2d9a42efdd212b6f42fe50b5fd3b3174c86c706f58244.png
301
- - images/0374025b3af99b8a473282c8cbbf9fcd29573cf41e586982f328f86c0690f43d.png
302
- - images/0bb4da785be40ef58e219470ebccb979325928b75453dc46bac23c6ee8a7a7cb.png
303
- - images/6aa294dccc81af594aacbe804e7ddffdc17eacc28357338108aea5d021d831ff.png
304
- - images/72dd3fbf3f4b475e27a0e7fb8137c475c32c41f8d222bcf62d6a9ccf102d9532.png
305
- - images/8772b6961d169738d7b0fa0b669b06fc2f40632d4c62586c7634fc17b93182a3.png
306
- - images/a998d842405933d45723606ff3f70162ec95b4ef30db25464a366184fd08fb9b.png
307
- - images/aa8980547e8c003d33273ab4d80e62da7f317bd7581b293c06d67f5331f24f31.png
308
- - images/bb78a872b539e0e9b2d80dee58acbb688f3f2727b324a5bf8bf417a69d94a166.png
309
- - images/c48fc83b17725d85fbb64d971196ebfccd8c5c757fe6aa5845303f6e315879b6.png
310
- - images/f08ef07308d08119ac2124bb7428c8bef17ef1ca70045696604d6e83015a9b91.png
311
- - images/f7514206111b695647eae9adfcf498ba3e0ff83ecfe25f3fc3ed8e9f04c5c726-1.png
312
- - images/f7514206111b695647eae9adfcf498ba3e0ff83ecfe25f3fc3ed8e9f04c5c726.png
313
204
  - lib/capsium.rb
314
205
  - lib/capsium/cli.rb
206
+ - lib/capsium/cli/convert.rb
207
+ - lib/capsium/cli/package.rb
208
+ - lib/capsium/cli/reactor.rb
209
+ - lib/capsium/converters.rb
315
210
  - lib/capsium/converters/jekyll.rb
316
211
  - lib/capsium/package.rb
317
212
  - lib/capsium/package/dataset.rb
318
213
  - lib/capsium/package/manifest.rb
214
+ - lib/capsium/package/manifest_config.rb
319
215
  - lib/capsium/package/metadata.rb
216
+ - lib/capsium/package/metadata_config.rb
320
217
  - lib/capsium/package/routes.rb
218
+ - lib/capsium/package/routes_config.rb
219
+ - lib/capsium/package/security.rb
220
+ - lib/capsium/package/security_config.rb
321
221
  - lib/capsium/package/storage.rb
222
+ - lib/capsium/package/storage_config.rb
223
+ - lib/capsium/package/validator.rb
322
224
  - lib/capsium/packager.rb
323
- - lib/capsium/protector.rb
324
225
  - lib/capsium/reactor.rb
226
+ - lib/capsium/reactor/introspection.rb
325
227
  - lib/capsium/thor_ext.rb
326
228
  - lib/capsium/version.rb
327
229
  - sig/capsium.rbs
328
- homepage: https://github.com/metanorma/capsium
230
+ - sig/capsium/package.rbs
231
+ - sig/capsium/package/dataset.rbs
232
+ - sig/capsium/package/manifest.rbs
233
+ - sig/capsium/package/manifest_config.rbs
234
+ - sig/capsium/package/metadata.rbs
235
+ - sig/capsium/package/metadata_config.rbs
236
+ - sig/capsium/package/routes.rbs
237
+ - sig/capsium/package/routes_config.rbs
238
+ - sig/capsium/package/security.rbs
239
+ - sig/capsium/package/security_config.rbs
240
+ - sig/capsium/package/storage.rbs
241
+ - sig/capsium/package/storage_config.rbs
242
+ - sig/capsium/package/validator.rbs
243
+ - sig/capsium/packager.rbs
244
+ - sig/capsium/reactor.rbs
245
+ - sig/capsium/reactor/introspection.rbs
246
+ homepage: https://github.com/capsiums/capsium
329
247
  licenses:
330
248
  - MIT
331
249
  metadata:
332
- homepage_uri: https://github.com/metanorma/capsium
333
- source_code_uri: https://github.com/metanorma/capsium
334
- changelog_uri: https://github.com/metanorma/capsium/releases
335
- post_install_message:
250
+ homepage_uri: https://github.com/capsiums/capsium
251
+ source_code_uri: https://github.com/capsiums/capsium
252
+ changelog_uri: https://github.com/capsiums/capsium/releases
253
+ rubygems_mfa_required: 'true'
336
254
  rdoc_options: []
337
255
  require_paths:
338
256
  - lib
@@ -340,15 +258,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
340
258
  requirements:
341
259
  - - ">="
342
260
  - !ruby/object:Gem::Version
343
- version: 2.7.0
261
+ version: 3.2.0
344
262
  required_rubygems_version: !ruby/object:Gem::Requirement
345
263
  requirements:
346
264
  - - ">="
347
265
  - !ruby/object:Gem::Version
348
266
  version: '0'
349
267
  requirements: []
350
- rubygems_version: 3.4.10
351
- signing_key:
268
+ rubygems_version: 4.0.16
352
269
  specification_version: 4
353
- summary: Capsium
270
+ summary: Packager and reactor for Capsium packages (.cap)
354
271
  test_files: []
@@ -1,95 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # lib/capsium/protector.rb
4
- require "openssl"
5
- require "base64"
6
- require "json"
7
-
8
- module Capsium
9
- class Protector
10
- def initialize(package, encryption_metadata = nil, digital_signature_metadata = nil)
11
- @package = package
12
- @encryption_metadata = encryption_metadata
13
- @digital_signature_metadata = digital_signature_metadata
14
- end
15
-
16
- def apply_encryption_and_sign
17
- encrypted_file = apply_encryption if @encryption_metadata
18
- sign_package(encrypted_file) if @digital_signature_metadata
19
- end
20
-
21
- def verify_signature
22
- signature_data = JSON.parse(File.read(signature_file_path))
23
- public_key = OpenSSL::PKey::RSA.new(File.read(public_key_path))
24
- digest = OpenSSL::Digest.new(signature_data["algorithm"])
25
- data = combined_data
26
- signature = Base64.decode64(signature_data["signature"])
27
-
28
- public_key.verify(digest, signature, data)
29
- end
30
-
31
- private
32
-
33
- def apply_encryption
34
- encryption = @encryption_metadata
35
- data = File.read(File.join(@package.path, Package::ENCRYPTED_PACKAGING_FILE))
36
- cipher = OpenSSL::Cipher.new(encryption[:algorithm])
37
- cipher.encrypt
38
- key = cipher.random_key
39
- iv = cipher.random_iv
40
-
41
- encrypted_data = cipher.update(data) + cipher.final
42
- encrypted_file = File.join(@package.path, "#{@package.name}.enc")
43
-
44
- File.open(encrypted_file, "wb") do |f|
45
- f.write(iv)
46
- f.write(encrypted_data)
47
- end
48
-
49
- save_encryption_key(key, encryption[:keyManagement])
50
- encrypted_file
51
- end
52
-
53
- def save_encryption_key(key, key_management)
54
- case key_management
55
- when "secure"
56
- # Implement secure key storage mechanism
57
- File.write(File.join(@package.path, "encryption_key.secure"), Base64.encode64(key))
58
- else
59
- raise "Unknown key management strategy: #{key_management}"
60
- end
61
- end
62
-
63
- def sign_package(encrypted_file)
64
- key = OpenSSL::PKey::RSA.new(@digital_signature_metadata[:keyLength])
65
- data = combined_data(encrypted_file)
66
- digest = OpenSSL::Digest.new(@digital_signature_metadata[:algorithm])
67
- signature_data = key.sign(digest, data)
68
-
69
- signature_json = {
70
- algorithm: @digital_signature_metadata[:algorithm],
71
- certificateType: @digital_signature_metadata[:certificateType],
72
- signature: Base64.encode64(signature_data)
73
- }
74
-
75
- File.write(signature_file_path, JSON.pretty_generate(signature_json))
76
- File.write(public_key_path, key.public_key.to_pem)
77
- end
78
-
79
- def combined_data(encrypted_file = nil)
80
- metadata_content = File.read(File.join(@package.path, Package::METADATA_FILE))
81
- signature_content = File.read(signature_file_path).sub(/"signature": ".*"/, '"signature": ""')
82
- package_enc_content = File.read(encrypted_file || File.join(@package.path, "#{@package.name}.enc"))
83
-
84
- metadata_content + signature_content + package_enc_content
85
- end
86
-
87
- def signature_file_path
88
- File.join(@package.path, @digital_signature_metadata[:signatureFile])
89
- end
90
-
91
- def public_key_path
92
- File.join(@package.path, "public_key.pem")
93
- end
94
- end
95
- end