capsium 0.1.1 → 0.1.2
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 +4 -4
- data/.github/workflows/rake.yml +1 -4
- data/.github/workflows/release.yml +1 -2
- data/.rubocop.yml +10 -6
- data/Gemfile +0 -6
- data/capsium.gemspec +9 -8
- data/lib/capsium/cli.rb +29 -10
- data/lib/capsium/converters/jekyll.rb +63 -30
- data/lib/capsium/package/dataset.rb +35 -48
- data/lib/capsium/package/dataset_config.rb +28 -0
- data/lib/capsium/package/manifest.rb +21 -41
- data/lib/capsium/package/manifest_config.rb +19 -0
- data/lib/capsium/package/metadata.rb +13 -27
- data/lib/capsium/package/metadata_config.rb +17 -0
- data/lib/capsium/package/routes.rb +39 -97
- data/lib/capsium/package/routes_config.rb +74 -0
- data/lib/capsium/package/storage.rb +47 -22
- data/lib/capsium/package/storage_config.rb +9 -0
- data/lib/capsium/package.rb +18 -6
- data/lib/capsium/packager.rb +25 -63
- data/lib/capsium/protector.rb +15 -7
- data/lib/capsium/reactor.rb +52 -28
- data/lib/capsium/version.rb +1 -1
- metadata +73 -25
- data/images/005df7415a331c466ad2d9a42efdd212b6f42fe50b5fd3b3174c86c706f58244.png +0 -0
- data/images/0374025b3af99b8a473282c8cbbf9fcd29573cf41e586982f328f86c0690f43d.png +0 -0
- data/images/0bb4da785be40ef58e219470ebccb979325928b75453dc46bac23c6ee8a7a7cb.png +0 -0
- data/images/6aa294dccc81af594aacbe804e7ddffdc17eacc28357338108aea5d021d831ff.png +0 -0
- data/images/72dd3fbf3f4b475e27a0e7fb8137c475c32c41f8d222bcf62d6a9ccf102d9532.png +0 -0
- data/images/8772b6961d169738d7b0fa0b669b06fc2f40632d4c62586c7634fc17b93182a3.png +0 -0
- data/images/a998d842405933d45723606ff3f70162ec95b4ef30db25464a366184fd08fb9b.png +0 -0
- data/images/aa8980547e8c003d33273ab4d80e62da7f317bd7581b293c06d67f5331f24f31.png +0 -0
- data/images/bb78a872b539e0e9b2d80dee58acbb688f3f2727b324a5bf8bf417a69d94a166.png +0 -0
- data/images/c48fc83b17725d85fbb64d971196ebfccd8c5c757fe6aa5845303f6e315879b6.png +0 -0
- data/images/f08ef07308d08119ac2124bb7428c8bef17ef1ca70045696604d6e83015a9b91.png +0 -0
- data/images/f7514206111b695647eae9adfcf498ba3e0ff83ecfe25f3fc3ed8e9f04c5c726-1.png +0 -0
- data/images/f7514206111b695647eae9adfcf498ba3e0ff83ecfe25f3fc3ed8e9f04c5c726.png +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e2b954beb33b36d3300f8ff418f643a9afbbf688fad4e8333b195ccb76b38b41
|
4
|
+
data.tar.gz: b2ef9e049b70ce3eb111ef0c136befaaf7a2f6a4d233ed9fb41a9d27d9c39e2c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3c75b5ab47ef3b7fe5a8f20571a300c15b960951c032d9c8d01e3eff295a237c294288613449ed090c73e38df718986f412573deeafd0f33acd7a43ead76c41
|
7
|
+
data.tar.gz: 8bdb432b2b7efb4987d211608e8cb13828e2bf49d49cf921c3d9a7f7cc74f5a775ed6454e5bfd3e91a539a36fa0beb28395ff7910682d9d791f8c44db3eebe26
|
data/.github/workflows/rake.yml
CHANGED
@@ -8,11 +8,8 @@ on:
|
|
8
8
|
tags: [ v* ]
|
9
9
|
pull_request:
|
10
10
|
|
11
|
-
permissions:
|
12
|
-
contents: write
|
13
|
-
|
14
11
|
jobs:
|
15
12
|
rake:
|
16
|
-
uses: metanorma/ci/.github/workflows/
|
13
|
+
uses: metanorma/ci/.github/workflows/generic-rake.yml@main
|
17
14
|
secrets:
|
18
15
|
pat_token: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
|
@@ -7,8 +7,7 @@ on:
|
|
7
7
|
inputs:
|
8
8
|
next_version:
|
9
9
|
description: |
|
10
|
-
Next release version. Possible values: x.y.z, major, minor, patch
|
11
|
-
Also, you can pass 'skip' to skip 'git tag' and do 'gem push' for the current version
|
10
|
+
Next release version. Possible values: x.y.z, major, minor, patch or pre|rc|etc
|
12
11
|
required: true
|
13
12
|
default: 'skip'
|
14
13
|
repository_dispatch:
|
data/.rubocop.yml
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
inherit_from:
|
2
|
+
- https://raw.githubusercontent.com/riboseinc/oss-guides/master/ci/rubocop.yml
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
# local repo-specific modifications
|
5
|
+
# ...
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
AllCops:
|
8
|
+
TargetRubyVersion: 2.6
|
9
|
+
NewCops: enable
|
10
|
+
Exclude:
|
11
|
+
- 'lib/sts/mapper.rb'
|
12
|
+
- 'vendor/**/*'
|
data/Gemfile
CHANGED
data/capsium.gemspec
CHANGED
@@ -6,20 +6,17 @@ Gem::Specification.new do |spec|
|
|
6
6
|
spec.name = "capsium"
|
7
7
|
spec.version = Capsium::VERSION
|
8
8
|
spec.authors = ["Ribose Inc."]
|
9
|
-
spec.email = ["open.source@ribose.com
|
9
|
+
spec.email = ["open.source@ribose.com"]
|
10
10
|
|
11
11
|
spec.summary = "Capsium"
|
12
12
|
spec.description = "Capsium"
|
13
|
-
spec.homepage = "https://github.com/
|
13
|
+
spec.homepage = "https://github.com/capsiums/capsium"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.metadata["homepage_uri"] = spec.homepage
|
17
17
|
spec.metadata["source_code_uri"] = spec.homepage
|
18
|
-
spec.metadata["changelog_uri"] = "https://github.com/
|
18
|
+
spec.metadata["changelog_uri"] = "https://github.com/capsiums/capsium/releases"
|
19
19
|
|
20
|
-
# Specify which files should be added to the gem when it is released.
|
21
|
-
# The `git ls-files -z` loads the files in the RubyGem
|
22
|
-
# that have been added into git.
|
23
20
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
24
21
|
`git ls-files -z`
|
25
22
|
.split("\x0")
|
@@ -35,10 +32,12 @@ Gem::Specification.new do |spec|
|
|
35
32
|
spec.add_dependency "csv"
|
36
33
|
spec.add_dependency "htmlcompressor"
|
37
34
|
spec.add_dependency "html-proofer"
|
35
|
+
spec.add_dependency "jekyll"
|
38
36
|
spec.add_dependency "json"
|
37
|
+
spec.add_dependency "json-schema"
|
39
38
|
spec.add_dependency "listen"
|
40
39
|
spec.add_dependency "marcel"
|
41
|
-
spec.add_dependency "rubyzip", "~>2.3.2"
|
40
|
+
spec.add_dependency "rubyzip", "~> 2.3.2"
|
42
41
|
spec.add_dependency "scss_lint"
|
43
42
|
spec.add_dependency "shale"
|
44
43
|
spec.add_dependency "sqlite3"
|
@@ -47,8 +46,10 @@ Gem::Specification.new do |spec|
|
|
47
46
|
spec.add_dependency "webrick"
|
48
47
|
spec.add_dependency "yaml"
|
49
48
|
|
50
|
-
spec.add_development_dependency "pry"
|
49
|
+
spec.add_development_dependency "pry"
|
50
|
+
spec.add_development_dependency "rack-test"
|
51
51
|
spec.add_development_dependency "rake", "~> 13.0"
|
52
52
|
spec.add_development_dependency "rspec", "~> 3.11"
|
53
53
|
spec.add_development_dependency "rubocop", "~> 1.58"
|
54
|
+
spec.add_development_dependency "rubocop-performance"
|
54
55
|
end
|
data/lib/capsium/cli.rb
CHANGED
@@ -15,6 +15,7 @@ module Capsium
|
|
15
15
|
extend ThorExt::Start
|
16
16
|
|
17
17
|
desc "info PACKAGE_PATH", "Display information about the package"
|
18
|
+
|
18
19
|
def info(path_to_package)
|
19
20
|
package = Capsium::Package.new(path_to_package)
|
20
21
|
puts "Package Path: #{package.path}"
|
@@ -22,25 +23,30 @@ module Capsium
|
|
22
23
|
puts "Manifest: #{package.manifest.as_json}"
|
23
24
|
end
|
24
25
|
|
25
|
-
desc "manifest PATH_TO_PACKAGE",
|
26
|
+
desc "manifest PATH_TO_PACKAGE",
|
27
|
+
"Show the manifest content of the package"
|
28
|
+
|
26
29
|
def manifest(path_to_package)
|
27
30
|
package = Capsium::Package.new(path_to_package)
|
28
31
|
puts JSON.pretty_generate(package.manifest.as_json)
|
29
32
|
end
|
30
33
|
|
31
34
|
desc "storage PATH_TO_PACKAGE", "Show the storage datasets of the package"
|
35
|
+
|
32
36
|
def storage(path_to_package)
|
33
37
|
package = Capsium::Package.new(path_to_package)
|
34
38
|
puts JSON.pretty_generate(package.storage.as_json)
|
35
39
|
end
|
36
40
|
|
37
41
|
desc "routes PATH_TO_PACKAGE", "Show the routes of the package"
|
42
|
+
|
38
43
|
def routes(path_to_package)
|
39
44
|
package = Capsium::Package.new(path_to_package)
|
40
45
|
puts JSON.pretty_generate(package.routes.as_json)
|
41
46
|
end
|
42
47
|
|
43
48
|
desc "metadata PATH_TO_PACKAGE", "Show the metadata of the package"
|
49
|
+
|
44
50
|
def metadata(path_to_package)
|
45
51
|
package = Capsium::Package.new(path_to_package)
|
46
52
|
puts JSON.pretty_generate(package.metadata.as_json)
|
@@ -48,6 +54,7 @@ module Capsium
|
|
48
54
|
|
49
55
|
desc "pack PATH_TO_PACKAGE_FOLDER", "Package the files into the package"
|
50
56
|
option :force, type: :boolean, default: false, aliases: "-f"
|
57
|
+
|
51
58
|
def pack(path_to_package)
|
52
59
|
package = Capsium::Package.new(path_to_package)
|
53
60
|
packager = Capsium::Packager.new
|
@@ -61,25 +68,37 @@ module Capsium
|
|
61
68
|
|
62
69
|
class Reactor < Thor
|
63
70
|
extend ThorExt::Start
|
64
|
-
|
71
|
+
|
72
|
+
desc "serve PACKAGE_PATH",
|
73
|
+
"Start the Capsium reactor to serve the package"
|
74
|
+
option :port, type: :numeric, default: Capsium::Reactor::DEFAULT_PORT
|
75
|
+
option :do_not_listen, type: :boolean, default: false
|
76
|
+
|
65
77
|
def serve(path_to_package)
|
66
|
-
|
67
|
-
|
78
|
+
reactor = Capsium::Reactor.new(
|
79
|
+
package: path_to_package,
|
80
|
+
port: options[:port],
|
81
|
+
do_not_listen: options[:do_not_listen],
|
82
|
+
)
|
68
83
|
reactor.serve
|
69
84
|
rescue StandardError => e
|
70
85
|
puts e
|
71
86
|
puts e.inspect
|
72
87
|
puts e.backtrace
|
73
88
|
ensure
|
74
|
-
package.cleanup
|
89
|
+
reactor.package.cleanup
|
75
90
|
end
|
76
91
|
end
|
77
92
|
|
78
93
|
class Convert < Thor
|
79
94
|
extend ThorExt::Start
|
80
|
-
|
81
|
-
|
82
|
-
|
95
|
+
|
96
|
+
desc "jekyll PACKAGE_FILE OUTPUT_DIRECTORY",
|
97
|
+
"Convert a Capsium package to a Jekyll site"
|
98
|
+
|
99
|
+
def jekyll(package_file, output_directory)
|
100
|
+
converter = Capsium::Converters::Jekyll.new(package_file,
|
101
|
+
output_directory)
|
83
102
|
converter.convert
|
84
103
|
end
|
85
104
|
end
|
@@ -90,7 +109,7 @@ module Capsium
|
|
90
109
|
desc "reactor SUBCOMMAND ...ARGS", "Manage the reactor"
|
91
110
|
subcommand "reactor", Capsium::Cli::Reactor
|
92
111
|
|
93
|
-
desc "
|
94
|
-
subcommand "
|
112
|
+
desc "convert SUBCOMMAND ...ARGS", "Convert from another format"
|
113
|
+
subcommand "convert", Capsium::Cli::Convert
|
95
114
|
end
|
96
115
|
end
|
@@ -1,58 +1,91 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# lib/capsium/converters/
|
3
|
+
# lib/capsium/converters/jekyll.rb
|
4
4
|
require "fileutils"
|
5
5
|
require "json"
|
6
|
-
require "capsium/
|
6
|
+
require "capsium/package"
|
7
7
|
|
8
8
|
module Capsium
|
9
9
|
module Converters
|
10
10
|
class Jekyll
|
11
|
-
def initialize(
|
12
|
-
@
|
11
|
+
def initialize(package_file, output_directory)
|
12
|
+
@package_file = package_file
|
13
13
|
@output_directory = output_directory
|
14
14
|
end
|
15
15
|
|
16
16
|
def convert
|
17
|
-
|
18
|
-
package_directory = prepare_package_directory
|
19
|
-
packager = Capsium::Packager.new(package_directory)
|
20
|
-
packager.pack
|
21
|
-
cleanup_package_directory(package_directory)
|
22
|
-
end
|
17
|
+
package = Capsium::Package.new(@package_file)
|
23
18
|
|
24
|
-
|
19
|
+
prepare_output_directory
|
25
20
|
|
26
|
-
|
27
|
-
|
21
|
+
write_config_yml(package)
|
22
|
+
copy_content_files(package)
|
23
|
+
generate_index_html(package)
|
28
24
|
|
29
|
-
|
25
|
+
puts "Capsium package converted to Jekyll site at #{@output_directory}"
|
30
26
|
end
|
31
27
|
|
32
|
-
|
33
|
-
package_directory = File.join(@output_directory, "capsium_package")
|
34
|
-
FileUtils.mkdir_p(package_directory)
|
28
|
+
private
|
35
29
|
|
36
|
-
|
30
|
+
def prepare_output_directory
|
31
|
+
FileUtils.mkdir_p(@output_directory)
|
32
|
+
end
|
37
33
|
|
38
|
-
|
34
|
+
def write_config_yml(package)
|
35
|
+
config = {
|
36
|
+
"title" => package.metadata.name || "Capsium Jekyll Site",
|
37
|
+
"description" => package.metadata.description || "Generated from Capsium package",
|
38
|
+
"baseurl" => "",
|
39
|
+
"url" => "",
|
40
|
+
"markdown" => "kramdown",
|
41
|
+
"theme" => "minima",
|
42
|
+
}
|
43
|
+
write_file("_config.yml", config.to_yaml)
|
44
|
+
end
|
39
45
|
|
40
|
-
|
46
|
+
def write_file(relative_path, content)
|
47
|
+
output_path = File.join(@output_directory, relative_path)
|
48
|
+
FileUtils.mkdir_p(File.dirname(output_path))
|
49
|
+
File.write(output_path, content)
|
41
50
|
end
|
42
51
|
|
43
|
-
def
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
52
|
+
def copy_content_files(package)
|
53
|
+
package.content_files.each do |file_path|
|
54
|
+
relative_path = Pathname.new(file_path).relative_path_from(Pathname.new(package.instance_variable_get(:@path)))
|
55
|
+
output_path = File.join(@output_directory, relative_path)
|
56
|
+
FileUtils.mkdir_p(File.dirname(output_path))
|
57
|
+
FileUtils.cp(file_path, output_path)
|
58
|
+
end
|
59
|
+
end
|
50
60
|
|
51
|
-
|
61
|
+
def generate_index_html(package)
|
62
|
+
root_route = package.routes.config.routes.find do |route|
|
63
|
+
route.path == "/"
|
64
|
+
end
|
65
|
+
if root_route
|
66
|
+
index_path = File.join(package.instance_variable_get(:@path),
|
67
|
+
root_route.target.file)
|
68
|
+
index_content = File.read(index_path)
|
69
|
+
write_file("index.html", index_content)
|
70
|
+
else
|
71
|
+
write_file("index.html", default_index_html(package))
|
72
|
+
end
|
52
73
|
end
|
53
74
|
|
54
|
-
def
|
55
|
-
|
75
|
+
def default_index_html(package)
|
76
|
+
<<~HTML
|
77
|
+
<!DOCTYPE html>
|
78
|
+
<html>
|
79
|
+
<head>
|
80
|
+
<meta charset="utf-8">
|
81
|
+
<title>#{package.metadata.name || 'Capsium Jekyll Site'}</title>
|
82
|
+
</head>
|
83
|
+
<body>
|
84
|
+
<h1>Welcome to #{package.metadata.name || 'Capsium Jekyll Site'}</h1>
|
85
|
+
<p>This site was generated from a Capsium package.</p>
|
86
|
+
</body>
|
87
|
+
</html>
|
88
|
+
HTML
|
56
89
|
end
|
57
90
|
end
|
58
91
|
end
|
@@ -1,78 +1,65 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# lib/capsium/package/dataset.rb
|
4
3
|
require "json"
|
5
4
|
require "yaml"
|
6
5
|
require "csv"
|
7
6
|
require "sqlite3"
|
7
|
+
require "shale"
|
8
|
+
require "json-schema"
|
9
|
+
require_relative "dataset_config"
|
8
10
|
|
9
11
|
module Capsium
|
10
12
|
class Package
|
11
|
-
class Dataset
|
12
|
-
|
13
|
-
# "datasets": [
|
14
|
-
# {
|
15
|
-
# "name": "animals",
|
16
|
-
# "source": "data/animals.yaml",
|
17
|
-
# "format": "yaml",
|
18
|
-
# "schema": "data/animals_schema.yaml"
|
19
|
-
# }
|
20
|
-
# ]
|
21
|
-
# }
|
22
|
-
attr_reader :name, :path, :type, :data
|
13
|
+
class Dataset
|
14
|
+
attr_reader :config, :data, :data_path
|
23
15
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
16
|
+
extend Forwardable
|
17
|
+
|
18
|
+
def_delegators :@config, :to_json
|
19
|
+
|
20
|
+
def initialize(config:, data_path: nil)
|
21
|
+
@config = config
|
22
|
+
@data_path = data_path || config.source
|
29
23
|
@data = load_data
|
30
24
|
end
|
31
25
|
|
32
|
-
def
|
33
|
-
case
|
34
|
-
when
|
35
|
-
when "
|
36
|
-
when "
|
37
|
-
when "
|
38
|
-
when "
|
26
|
+
def load_data
|
27
|
+
case @config.format
|
28
|
+
when "yaml" then YAML.load_file(@data_path)
|
29
|
+
when "json" then JSON.parse(File.read(@data_path))
|
30
|
+
when "csv" then CSV.read(@data_path, headers: true)
|
31
|
+
when "tsv" then CSV.read(@data_path, col_sep: "\t", headers: true)
|
32
|
+
when "sqlite" then load_sqlite_data
|
39
33
|
else
|
40
|
-
raise "Unsupported data file type: #{
|
34
|
+
raise "Unsupported data file type: #{@config.format}"
|
41
35
|
end
|
42
36
|
end
|
43
37
|
|
44
|
-
def
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
38
|
+
def validate
|
39
|
+
return unless @config.schema
|
40
|
+
|
41
|
+
schema_path = File.join(File.dirname(@data_path), @config.schema)
|
42
|
+
schema = YAML.load_file(schema_path) if @config.format == "yaml"
|
43
|
+
schema = JSON.parse(File.read(schema_path)) if @config.format == "json"
|
44
|
+
|
45
|
+
case @config.format
|
46
|
+
when "yaml" then YAML.load_file(@data_path)
|
47
|
+
when "json" then JSON.parse(File.read(@data_path))
|
51
48
|
else
|
52
|
-
raise "
|
49
|
+
raise "Validation is only supported for YAML and JSON formats"
|
53
50
|
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def as_json
|
57
|
-
{
|
58
|
-
name: name,
|
59
|
-
source: relative_path(path),
|
60
|
-
format: type.to_s
|
61
|
-
}
|
62
|
-
end
|
63
51
|
|
64
|
-
|
65
|
-
JSON.pretty_generate(as_json)
|
52
|
+
JSON::Validator.validate!(schema, @data.to_json)
|
66
53
|
end
|
67
54
|
|
68
|
-
def
|
69
|
-
|
55
|
+
def save_to_file(output_path)
|
56
|
+
File.write(output_path, to_json)
|
70
57
|
end
|
71
58
|
|
72
59
|
private
|
73
60
|
|
74
61
|
def load_sqlite_data
|
75
|
-
db = SQLite3::Database.new(@
|
62
|
+
db = SQLite3::Database.new(@data_path)
|
76
63
|
tables = db.execute("SELECT name FROM sqlite_master WHERE type='table';")
|
77
64
|
data = {}
|
78
65
|
tables.each do |table|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "shale"
|
2
|
+
|
3
|
+
module Capsium
|
4
|
+
class Package
|
5
|
+
class DatasetConfig < Shale::Mapper
|
6
|
+
attribute :name, Shale::Type::String
|
7
|
+
attribute :source, Shale::Type::String
|
8
|
+
attribute :format, Shale::Type::String
|
9
|
+
attribute :schema, Shale::Type::String
|
10
|
+
|
11
|
+
def to_dataset(data_path)
|
12
|
+
Dataset.new(config: self,
|
13
|
+
data_path: File.join(
|
14
|
+
File.dirname(data_path), source
|
15
|
+
))
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.from_dataset(dataset)
|
19
|
+
new(
|
20
|
+
name: dataset.config.name,
|
21
|
+
source: dataset.config.source,
|
22
|
+
format: dataset.config.format,
|
23
|
+
schema: dataset.config.schema,
|
24
|
+
)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -4,24 +4,25 @@
|
|
4
4
|
require "json"
|
5
5
|
require "marcel"
|
6
6
|
require "shale"
|
7
|
+
require_relative "manifest_config"
|
7
8
|
|
8
9
|
module Capsium
|
9
10
|
class Package
|
10
11
|
class Manifest
|
11
|
-
|
12
|
+
extend Forwardable
|
13
|
+
attr_accessor :path, :content_path, :config
|
14
|
+
|
15
|
+
def_delegators :@config, :to_json
|
12
16
|
|
13
17
|
def initialize(path)
|
14
18
|
@path = path
|
15
|
-
|
16
|
-
# or
|
17
|
-
# /tmp/../content
|
18
|
-
@content_path = File.join(File.dirname(@path), "content")
|
19
|
+
@content_path = File.join(File.dirname(@path), Package::CONTENT_DIR)
|
19
20
|
|
20
|
-
@
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
@config = if File.exist?(path)
|
22
|
+
ManifestConfig.from_json(File.read(path))
|
23
|
+
else
|
24
|
+
ManifestConfig.new(content: generate_manifest)
|
25
|
+
end
|
25
26
|
end
|
26
27
|
|
27
28
|
def generate_manifest
|
@@ -30,31 +31,28 @@ module Capsium
|
|
30
31
|
end
|
31
32
|
|
32
33
|
files.sort.map do |file_path|
|
33
|
-
|
34
|
+
ManifestConfigItem.new(
|
34
35
|
file: relative_path(file_path),
|
35
|
-
mime: mime_from_path(file_path)
|
36
|
+
mime: mime_from_path(file_path),
|
36
37
|
)
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
40
41
|
def lookup(filename)
|
41
|
-
@
|
42
|
+
@config.content.detect do |data_item|
|
42
43
|
data_item.file == filename
|
43
44
|
end
|
44
45
|
end
|
45
46
|
|
46
|
-
def to_json(*_args)
|
47
|
-
@data.to_json
|
48
|
-
end
|
49
|
-
|
50
47
|
def save_to_file(output_path = @path)
|
51
|
-
|
52
|
-
|
53
|
-
end
|
48
|
+
@config.content.sort_by!(&:file)
|
49
|
+
File.write(output_path, to_json)
|
54
50
|
end
|
55
51
|
|
56
52
|
def path_to_content_file(path)
|
57
|
-
|
53
|
+
raise TypeError, "Path cannot be nil" if path.nil?
|
54
|
+
|
55
|
+
Pathname.new(File.dirname(@path)).join(path)
|
58
56
|
end
|
59
57
|
|
60
58
|
def content_file_exists?(path)
|
@@ -62,7 +60,7 @@ module Capsium
|
|
62
60
|
end
|
63
61
|
|
64
62
|
def relative_path(path)
|
65
|
-
Pathname.new(path).relative_path_from(@
|
63
|
+
Pathname.new(path).relative_path_from(File.dirname(@path)).to_s
|
66
64
|
end
|
67
65
|
|
68
66
|
private
|
@@ -71,27 +69,9 @@ module Capsium
|
|
71
69
|
Marcel::MimeType.for(
|
72
70
|
Pathname.new(path),
|
73
71
|
name: File.basename(path),
|
74
|
-
extension: File.extname(path)
|
72
|
+
extension: File.extname(path),
|
75
73
|
)
|
76
74
|
end
|
77
75
|
end
|
78
|
-
|
79
|
-
class ManifestDataItem < Shale::Mapper
|
80
|
-
attribute :file, Shale::Type::String
|
81
|
-
attribute :mime, Shale::Type::String
|
82
|
-
|
83
|
-
# json do
|
84
|
-
# map "file", to: :file
|
85
|
-
# map "mime", to: :mime
|
86
|
-
# end
|
87
|
-
end
|
88
|
-
|
89
|
-
class ManifestData < Shale::Mapper
|
90
|
-
attribute :content, ManifestDataItem, collection: true
|
91
|
-
|
92
|
-
# json do
|
93
|
-
# map "content", to: :content
|
94
|
-
# end
|
95
|
-
end
|
96
76
|
end
|
97
77
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "shale"
|
2
|
+
|
3
|
+
module Capsium
|
4
|
+
class Package
|
5
|
+
class ManifestConfigItem < Shale::Mapper
|
6
|
+
attribute :file, Shale::Type::String
|
7
|
+
attribute :mime, Shale::Type::String
|
8
|
+
end
|
9
|
+
|
10
|
+
class ManifestConfig < Shale::Mapper
|
11
|
+
attribute :content, ManifestConfigItem, collection: true
|
12
|
+
|
13
|
+
def sort!
|
14
|
+
@content.sort_by!(&:file)
|
15
|
+
self
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|