capsium 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|