ree 1.0.47 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/Gemfile.lock +2 -1
- data/exe/ree +0 -31
- data/lib/ree/cli/indexing/index_file.rb +1 -7
- data/lib/ree/cli/indexing/index_package.rb +1 -1
- data/lib/ree/cli/indexing/index_project.rb +1 -3
- data/lib/ree/cli/indexing.rb +0 -2
- data/lib/ree/cli/spec_runner.rb +1 -1
- data/lib/ree/cli.rb +0 -1
- data/lib/ree/container.rb +6 -0
- data/lib/ree/core/package.rb +3 -9
- data/lib/ree/core/package_file_structure_loader.rb +53 -0
- data/lib/ree/core/package_loader.rb +67 -61
- data/lib/ree/core/packages_detector.rb +15 -17
- data/lib/ree/core/packages_schema.rb +2 -2
- data/lib/ree/core/packages_schema_builder.rb +3 -2
- data/lib/ree/core/packages_schema_loader.rb +4 -6
- data/lib/ree/core/path_helper.rb +4 -12
- data/lib/ree/dsl/build_package_dsl.rb +1 -1
- data/lib/ree/dsl/import_dsl.rb +15 -0
- data/lib/ree/facades/packages_facade.rb +11 -119
- data/lib/ree/templates/init/ree.setup.rb +0 -3
- data/lib/ree/version.rb +1 -1
- data/lib/ree.rb +6 -34
- metadata +3 -8
- data/lib/ree/cli/generate_package_schema.rb +0 -40
- data/lib/ree/core/package_schema.rb +0 -31
- data/lib/ree/core/package_schema_builder.rb +0 -46
- data/lib/ree/core/package_schema_loader.rb +0 -172
- data/lib/ree/templates/package/Package.schema.json +0 -0
- data/lib/ree/templates/package/spec/package_schema_spec.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2f0f2ca665d289e3603982d8fefe5397fdbfacfdc2e11221e0c1d671e088f1b2
|
4
|
+
data.tar.gz: 2c4c6b8bfcd5e1f88217c39e8c33f914ff4f1d706a08e32a55c281cb5e633e16
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8dc3a61e17a907c33aa125d7f094fb7fce07b7b35e88e6b76d8973bfe37508d7205a7a687a7bb63b09fe0d639f3d0230c01a320717ee782c2a3aaf6ee94458b2
|
7
|
+
data.tar.gz: 7a0b94dcf8a004578a87ce3c7ee221862729c70afe3998af1ad463710a57023ea05733ba29425358c01f20c49fc7b4081e1a7e61fb82611f6839fabfad050465
|
data/.rspec
CHANGED
data/Gemfile.lock
CHANGED
data/exe/ree
CHANGED
@@ -85,12 +85,6 @@ class ReeCliRunner
|
|
85
85
|
|
86
86
|
Ree::CLI::GeneratePackage.run(**options_with_defaults)
|
87
87
|
Ree::CLI::GeneratePackagesSchema.run(options_with_defaults[:project_path])
|
88
|
-
|
89
|
-
Ree::CLI::GeneratePackageSchema.run(
|
90
|
-
package_name: options_with_defaults[:package_name],
|
91
|
-
project_path: options_with_defaults[:project_path],
|
92
|
-
silence: false
|
93
|
-
)
|
94
88
|
end
|
95
89
|
end
|
96
90
|
|
@@ -112,31 +106,6 @@ class ReeCliRunner
|
|
112
106
|
end
|
113
107
|
end
|
114
108
|
|
115
|
-
command :"gen.package_json" do |c|
|
116
|
-
c.syntax = 'ree gen.package_json PACKAGE_NAME'
|
117
|
-
c.description = 'generates Package.schema.json for specific package'
|
118
|
-
c.summary = '> ' + c.description
|
119
|
-
c.example 'ree gen.package_json PACKAGE_NAME', ''
|
120
|
-
c.option '--silence', String, 'Silence all logs'
|
121
|
-
c.option '--project_path [ROOT_PROJECT_DIR]', String, 'Root project dir path'
|
122
|
-
c.action do |args, options|
|
123
|
-
package_name = args.first || ""
|
124
|
-
options_hash = options.__hash__
|
125
|
-
|
126
|
-
if options_hash[:project_path]
|
127
|
-
options_hash[:project_path] = File.expand_path(options_hash[:project_path])
|
128
|
-
end
|
129
|
-
|
130
|
-
default_options = {
|
131
|
-
package_name: package_name,
|
132
|
-
project_path: options_hash[:project_path] || File.expand_path(Dir.pwd),
|
133
|
-
silence: options_hash.has_key?(:silence)
|
134
|
-
}
|
135
|
-
|
136
|
-
Ree::CLI::GeneratePackageSchema.run(**default_options)
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
109
|
command :"gen.template" do |c|
|
141
110
|
c.syntax = "ree gen.template TEMPLATE_NAME [options]"
|
142
111
|
c.description = "generates template from ROOT/.ree/templates folder with specified variables"
|
@@ -19,7 +19,7 @@ module Ree
|
|
19
19
|
|
20
20
|
current_package_schema = self.find_package(File.dirname(file_path))
|
21
21
|
|
22
|
-
return {} unless current_package_schema
|
22
|
+
return '{}' unless current_package_schema
|
23
23
|
|
24
24
|
package_schema = JSON.load_file(current_package_schema)
|
25
25
|
current_package_name = package_schema["name"].to_sym
|
@@ -65,12 +65,6 @@ module Ree
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def find_package(dir)
|
68
|
-
package_schema = File.join(dir, Ree::PACKAGE_SCHEMA_FILE)
|
69
|
-
|
70
|
-
if File.exist?(package_schema)
|
71
|
-
return package_schema
|
72
|
-
end
|
73
|
-
|
74
68
|
if dir == '/'
|
75
69
|
return nil
|
76
70
|
end
|
@@ -23,7 +23,7 @@ module Ree
|
|
23
23
|
hsh[:objects] = {}
|
24
24
|
|
25
25
|
package_name = package_name.to_sym
|
26
|
-
facade.
|
26
|
+
facade.read_package_structure(package_name)
|
27
27
|
package = facade.get_loaded_package(package_name)
|
28
28
|
package_hsh = index_package_entry(package)
|
29
29
|
|
@@ -30,12 +30,10 @@ module Ree
|
|
30
30
|
gem_package_hsh = {}
|
31
31
|
gem_package_hsh[:name] = package.name
|
32
32
|
gem_package_hsh[:gem] = package.gem_name
|
33
|
-
gem_package_hsh[:schema_rpath] = package.schema_rpath
|
34
33
|
gem_package_hsh[:entry_rpath] = package.entry_rpath
|
35
34
|
gem_package_hsh[:objects] = package.objects.map {
|
36
35
|
{
|
37
36
|
name: _1.name,
|
38
|
-
schema_rpath: _1.schema_rpath,
|
39
37
|
file_rpath: _1.rpath,
|
40
38
|
mount_as: _1.mount_as,
|
41
39
|
methods: map_fn_methods(_1),
|
@@ -57,7 +55,7 @@ module Ree
|
|
57
55
|
|
58
56
|
next if package.dir.nil?
|
59
57
|
|
60
|
-
facade.
|
58
|
+
facade.read_package_structure(package.name)
|
61
59
|
|
62
60
|
package_hsh = index_package_entry(package)
|
63
61
|
|
data/lib/ree/cli/indexing.rb
CHANGED
@@ -12,13 +12,11 @@ module Ree
|
|
12
12
|
def index_package_entry(package)
|
13
13
|
package_hsh = {}
|
14
14
|
package_hsh[:name] = package.name
|
15
|
-
package_hsh[:schema_rpath] = package.schema_rpath
|
16
15
|
package_hsh[:entry_rpath] = package.entry_rpath
|
17
16
|
package_hsh[:tags] = package.tags
|
18
17
|
package_hsh[:objects] = package.objects.map {
|
19
18
|
{
|
20
19
|
name: _1.name,
|
21
|
-
schema_rpath: _1.schema_rpath,
|
22
20
|
file_rpath: _1.rpath,
|
23
21
|
mount_as: _1.mount_as,
|
24
22
|
methods: map_fn_methods(_1),
|
data/lib/ree/cli/spec_runner.rb
CHANGED
@@ -118,7 +118,7 @@ module Ree
|
|
118
118
|
names = packages.map(&:name)
|
119
119
|
|
120
120
|
names.select do |package_name|
|
121
|
-
package = container.packages_facade.
|
121
|
+
package = container.packages_facade.get_loaded_package(package_name)
|
122
122
|
package.tags.include?(@tag_name)
|
123
123
|
end.compact
|
124
124
|
end
|
data/lib/ree/cli.rb
CHANGED
@@ -4,7 +4,6 @@ module Ree
|
|
4
4
|
module CLI
|
5
5
|
autoload :Init, 'ree/cli/init'
|
6
6
|
autoload :GeneratePackagesSchema, 'ree/cli/generate_packages_schema'
|
7
|
-
autoload :GeneratePackageSchema, 'ree/cli/generate_package_schema'
|
8
7
|
autoload :GeneratePackage, 'ree/cli/generate_package'
|
9
8
|
autoload :GenerateTemplate, 'ree/cli/generate_template'
|
10
9
|
autoload :Indexing, 'ree/cli/indexing'
|
data/lib/ree/container.rb
CHANGED
@@ -62,6 +62,12 @@ class Ree::Container
|
|
62
62
|
# @param [Symbol] package_name
|
63
63
|
# @return [Ree::Package]
|
64
64
|
def load_package(package_name)
|
65
|
+
@packages_facade.read_package_structure(package_name)
|
66
|
+
end
|
67
|
+
|
68
|
+
# @param [Symbol] package_name
|
69
|
+
# @return [Ree::Package]
|
70
|
+
def load_entire_package(package_name)
|
65
71
|
@packages_facade.load_entire_package(package_name)
|
66
72
|
end
|
67
73
|
end
|
data/lib/ree/core/package.rb
CHANGED
@@ -3,13 +3,12 @@
|
|
3
3
|
require 'pathname'
|
4
4
|
|
5
5
|
class Ree::Package
|
6
|
-
attr_reader :schema_version, :name, :
|
6
|
+
attr_reader :schema_version, :name, :entry_rpath, :objects_store,
|
7
7
|
:module, :tags, :preload, :default_links, :gem_name
|
8
8
|
|
9
|
-
def initialize(schema_version, name, entry_rpath,
|
9
|
+
def initialize(schema_version, name, entry_rpath, gem_name = nil)
|
10
10
|
@schema_version = schema_version
|
11
11
|
@name = name
|
12
|
-
@schema_rpath = schema_rpath
|
13
12
|
@entry_rpath = entry_rpath
|
14
13
|
@objects_store = {}
|
15
14
|
@deps_store = {}
|
@@ -51,11 +50,6 @@ class Ree::Package
|
|
51
50
|
@tags = (@tags + list).map(&:to_s).uniq; self
|
52
51
|
end
|
53
52
|
|
54
|
-
# @param [String] val
|
55
|
-
def set_schema_rpath(val)
|
56
|
-
@schema_rpath = val; self
|
57
|
-
end
|
58
|
-
|
59
53
|
def reset
|
60
54
|
@entry_loaded = false
|
61
55
|
@schema_loaded = false
|
@@ -94,7 +88,7 @@ class Ree::Package
|
|
94
88
|
end
|
95
89
|
|
96
90
|
def dir
|
97
|
-
@dir ||= @
|
91
|
+
@dir ||= @entry_rpath ? Pathname.new(@entry_rpath).dirname.parent.to_s : nil
|
98
92
|
end
|
99
93
|
|
100
94
|
def gem?
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
class Ree::PackageFileStructureLoader
|
6
|
+
PACKAGE_FOLDER = 'package'
|
7
|
+
|
8
|
+
# @param [Ree::Package] package Loaded package
|
9
|
+
# @return [Ree::Package]
|
10
|
+
def call(package)
|
11
|
+
return package if package.schema_loaded?
|
12
|
+
|
13
|
+
package_dir = if package && package.gem?
|
14
|
+
File.join(Ree.gem(package.gem_name).dir, package.dir)
|
15
|
+
else
|
16
|
+
File.join(Ree.root_dir, package.dir)
|
17
|
+
end
|
18
|
+
|
19
|
+
root_dir = if package.gem?
|
20
|
+
Ree.gem(package.gem_name).dir
|
21
|
+
else
|
22
|
+
Ree.root_dir
|
23
|
+
end
|
24
|
+
|
25
|
+
object_store = {}
|
26
|
+
package.set_schema_loaded
|
27
|
+
|
28
|
+
files_dir = File.join(package_dir, PACKAGE_FOLDER)
|
29
|
+
Dir[File.join(files_dir, '**', '*.rb')].each do |path|
|
30
|
+
file_path = Pathname.new(path)
|
31
|
+
object_name = File.basename(path, '.rb')
|
32
|
+
rpath = file_path.relative_path_from(root_dir)
|
33
|
+
|
34
|
+
object = Ree::Object.new(
|
35
|
+
object_name.to_sym,
|
36
|
+
rpath,
|
37
|
+
rpath,
|
38
|
+
)
|
39
|
+
|
40
|
+
if object_store.has_key?(object_name)
|
41
|
+
raise Ree::Error.new("duplicate object name for '#{object_name}': #{rpath}", :invalid_package_file_structure)
|
42
|
+
end
|
43
|
+
|
44
|
+
object_store[object_name] = true
|
45
|
+
|
46
|
+
object.set_package(package.name)
|
47
|
+
|
48
|
+
package.set_object(object)
|
49
|
+
end
|
50
|
+
|
51
|
+
package
|
52
|
+
end
|
53
|
+
end
|
@@ -4,92 +4,98 @@ require 'set'
|
|
4
4
|
require 'pathname'
|
5
5
|
|
6
6
|
class Ree::PackageLoader
|
7
|
+
include Ree::Args
|
8
|
+
|
7
9
|
def initialize(packages_store)
|
8
|
-
@packages_store = packages_store
|
9
10
|
@loaded_paths = {}
|
10
11
|
@loaded_packages = {}
|
12
|
+
@packages_store = packages_store
|
11
13
|
end
|
12
14
|
|
13
|
-
def
|
14
|
-
|
15
|
-
end
|
15
|
+
def load_entire_package(package_name)
|
16
|
+
return if @loaded_packages[package_name]
|
16
17
|
|
17
|
-
|
18
|
-
def call(name)
|
19
|
-
return @loaded_packages[name] if @loaded_packages.has_key?(name)
|
18
|
+
package = get_loaded_package(package_name)
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
return unless package
|
21
|
+
|
22
|
+
package.objects.each do |package_object|
|
23
|
+
object_path = Ree::PathHelper.abs_object_path(package_object)
|
25
24
|
|
26
|
-
|
27
|
-
|
28
|
-
return if @loaded_paths[package_name][path]
|
29
|
-
@loaded_paths[package_name][path] = true
|
25
|
+
load_file(object_path, package.name)
|
26
|
+
end
|
30
27
|
|
31
|
-
|
32
|
-
|
28
|
+
@loaded_packages[package.name] = true
|
29
|
+
|
30
|
+
package.deps.each do |dep|
|
31
|
+
load_entire_package(dep.name)
|
32
|
+
end
|
33
33
|
end
|
34
34
|
|
35
|
-
|
35
|
+
def get_loaded_package(package_name)
|
36
|
+
package = get_package(package_name)
|
37
|
+
load_package_entry(package_name)
|
38
|
+
|
39
|
+
return package if package.schema_loaded?
|
36
40
|
|
37
|
-
|
38
|
-
package = @packages_store.get(name)
|
39
|
-
@loaded_packages[name] = package
|
41
|
+
read_package_structure(package_name)
|
40
42
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
package
|
44
|
+
end
|
45
|
+
|
46
|
+
def get_package(package_name, raise_if_missing = true)
|
47
|
+
check_arg(package_name, :package_name, Symbol)
|
48
|
+
package = @packages_store.get(package_name)
|
49
|
+
|
50
|
+
if !package && raise_if_missing
|
51
|
+
raise Ree::Error.new("Package :#{package_name} is not found in Packages.schema.json. Run `ree gen.packages_json` to update schema.", :package_schema_not_found)
|
46
52
|
end
|
47
53
|
|
48
|
-
|
49
|
-
|
50
|
-
|
54
|
+
package
|
55
|
+
end
|
56
|
+
|
57
|
+
def load_package_entry(package_name)
|
58
|
+
package = @packages_store.get(package_name)
|
59
|
+
|
60
|
+
if package.nil?
|
61
|
+
raise Ree::Error.new("package :#{package_name} not found in Packages.schema.json")
|
51
62
|
end
|
52
63
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
64
|
+
return if package.loaded?
|
65
|
+
|
66
|
+
Ree.logger.debug("load_package_entry(:#{package_name})")
|
67
|
+
|
68
|
+
load_file(
|
69
|
+
Ree::PathHelper.abs_package_entry_path(package),
|
70
|
+
package_name
|
57
71
|
)
|
72
|
+
end
|
58
73
|
|
59
|
-
|
60
|
-
|
61
|
-
Ree::PathHelper.abs_package_entry_path(package), name
|
62
|
-
)
|
74
|
+
def read_package_structure(package_name)
|
75
|
+
package = get_package(package_name)
|
63
76
|
|
64
|
-
|
65
|
-
load_file(path, name)
|
66
|
-
end
|
77
|
+
Ree.logger.debug("read_package_file_structure(:#{package_name})")
|
67
78
|
|
68
|
-
|
79
|
+
if !package.dir
|
80
|
+
package.set_schema_loaded
|
81
|
+
return package
|
69
82
|
end
|
70
83
|
|
71
|
-
|
72
|
-
|
73
|
-
if !ENV.has_key?(env_var.name)
|
74
|
-
msg = <<~DOC
|
75
|
-
package: :#{package.name}
|
76
|
-
path: #{File.join(Ree::PathHelper.project_root_dir(package), package.entry_rpath)}
|
77
|
-
error: Package :#{name} requires env var '#{env_var.name}' to be set
|
78
|
-
DOC
|
79
|
-
|
80
|
-
raise Ree::Error.new(msg, :env_var_not_set)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
+
Ree::PackageFileStructureLoader.new.call(package)
|
85
|
+
end
|
84
86
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
87
|
+
def reset
|
88
|
+
@loaded_paths = {}
|
89
|
+
end
|
90
|
+
|
91
|
+
def load_file(path, package_name)
|
92
|
+
@loaded_paths[package_name] ||= {}
|
93
|
+
return if @loaded_paths[package_name][path]
|
94
|
+
@loaded_paths[package_name][path] = true
|
90
95
|
|
91
|
-
|
96
|
+
Ree.logger.debug("load_file(:#{package_name}, '#{path}')")
|
92
97
|
|
93
|
-
|
98
|
+
Kernel.require(path)
|
94
99
|
end
|
95
100
|
end
|
101
|
+
|
@@ -4,40 +4,38 @@ require 'pathname'
|
|
4
4
|
|
5
5
|
class Ree::PackagesDetector
|
6
6
|
# @param [String] dir Packages root dir
|
7
|
-
# @return [ArrayOf[{name: String, entry_path: String,
|
7
|
+
# @return [ArrayOf[{name: String, entry_path: String, gem_name: Nilor[String]}]]
|
8
8
|
def call(dir, gem_name = nil)
|
9
9
|
if !Dir.exist?(dir)
|
10
10
|
raise Ree::Error.new("dir does not exist: #{dir}", :invalid_dir)
|
11
11
|
end
|
12
12
|
|
13
|
-
files = File.join(dir, "**/", Ree::PACKAGE_SCHEMA_FILE)
|
14
13
|
names = {}
|
14
|
+
packages = []
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
.relative_path_from(Pathname.new(dir))
|
20
|
-
.to_s
|
16
|
+
package_dirs = File.join(dir, "**/package")
|
17
|
+
Dir[package_dirs].each do |package_dir|
|
18
|
+
next unless File.directory?(package_dir)
|
21
19
|
|
22
|
-
|
23
|
-
|
20
|
+
dir_path = Pathname.new(package_dir)
|
21
|
+
name = dir_path.parent.basename.to_s
|
24
22
|
|
25
|
-
if
|
26
|
-
Ree.logger.error("Entry file does not exist for '#{name}' package: #{entry_path}")
|
27
|
-
end
|
23
|
+
next if names.has_key?(name)
|
28
24
|
|
29
|
-
|
30
|
-
|
31
|
-
|
25
|
+
package_rel_path = dir_path.relative_path_from(dir)
|
26
|
+
parent_rel_path = dir_path.parent.relative_path_from(dir)
|
27
|
+
|
28
|
+
entry_path = Ree::PathHelper.package_entry_path(package_rel_path)
|
32
29
|
|
33
30
|
names[name] = entry_path
|
34
31
|
|
35
|
-
{
|
32
|
+
packages << {
|
36
33
|
name: name.to_sym,
|
37
34
|
entry_path: entry_path,
|
38
|
-
package_schema_path: package_schema_path,
|
39
35
|
gem_name: gem_name
|
40
36
|
}
|
41
37
|
end
|
38
|
+
|
39
|
+
packages
|
42
40
|
end
|
43
41
|
end
|
@@ -11,12 +11,12 @@ module Ree::PackagesSchema
|
|
11
11
|
|
12
12
|
module Packages
|
13
13
|
NAME = 'name'
|
14
|
-
|
14
|
+
ENTRY_PATH = 'entry_path'
|
15
15
|
GEM = 'gem'
|
16
16
|
end
|
17
17
|
|
18
18
|
module GemPackages
|
19
19
|
NAME = 'name'
|
20
|
-
|
20
|
+
ENTRY_PATH = 'entry_path'
|
21
21
|
end
|
22
22
|
end
|
@@ -19,20 +19,21 @@ class Ree::PackagesSchemaBuilder
|
|
19
19
|
gem_packages += @packages_detector.call(gem.dir, gem.name)
|
20
20
|
end
|
21
21
|
|
22
|
+
|
22
23
|
result = {
|
23
24
|
Schema::SCHEMA_VERSION => Schema::SCHEMA_VERSION_NUMBER,
|
24
25
|
Schema::SCHEMA_TYPE => Schema::PACKAGES,
|
25
26
|
Schema::PACKAGES => packages.sort_by { _1[:name] }.map {
|
26
27
|
{
|
27
28
|
Schema::Packages::NAME => _1.fetch(:name),
|
28
|
-
Schema::Packages::
|
29
|
+
Schema::Packages::ENTRY_PATH => _1.fetch(:entry_path),
|
29
30
|
}
|
30
31
|
},
|
31
32
|
Schema::GEM_PACKAGES => gem_packages.sort_by { [_1.fetch(:gem_name), _1.fetch(:name)] }.map {
|
32
33
|
{
|
33
34
|
Schema::Packages::GEM => _1.fetch(:gem_name),
|
34
35
|
Schema::Packages::NAME => _1.fetch(:name),
|
35
|
-
Schema::Packages::
|
36
|
+
Schema::Packages::ENTRY_PATH => _1.fetch(:entry_path),
|
36
37
|
}
|
37
38
|
},
|
38
39
|
}
|
@@ -48,7 +48,7 @@ class Ree::PackagesSchemaLoader
|
|
48
48
|
|
49
49
|
data.each do |item|
|
50
50
|
name = item[Schema::Packages::NAME].to_s
|
51
|
-
|
51
|
+
entry_path = item[Schema::Packages::ENTRY_PATH].to_s
|
52
52
|
list = [name, schema]
|
53
53
|
|
54
54
|
if list.reject(&:empty?).size != list.size
|
@@ -56,7 +56,7 @@ class Ree::PackagesSchemaLoader
|
|
56
56
|
end
|
57
57
|
|
58
58
|
if names.has_key?(name)
|
59
|
-
raise Ree::Error.new("duplicate package name for '#{
|
59
|
+
raise Ree::Error.new("duplicate package name for '#{name}'", :invalid_packages_schema)
|
60
60
|
end
|
61
61
|
|
62
62
|
names[name] = true
|
@@ -64,8 +64,7 @@ class Ree::PackagesSchemaLoader
|
|
64
64
|
package = Ree::Package.new(
|
65
65
|
schema_version,
|
66
66
|
name.to_sym,
|
67
|
-
|
68
|
-
schema_rpath,
|
67
|
+
entry_path,
|
69
68
|
gem_name
|
70
69
|
)
|
71
70
|
|
@@ -83,8 +82,7 @@ class Ree::PackagesSchemaLoader
|
|
83
82
|
Ree::Package.new(
|
84
83
|
schema_version,
|
85
84
|
name.to_sym,
|
86
|
-
|
87
|
-
schema_rpath,
|
85
|
+
entry_path,
|
88
86
|
gem_name
|
89
87
|
)
|
90
88
|
)
|
data/lib/ree/core/path_helper.rb
CHANGED
@@ -55,16 +55,14 @@ class Ree::PathHelper
|
|
55
55
|
# @param [String] directory inside package
|
56
56
|
# @return [String] name of package
|
57
57
|
def package_name_from_dir(dir)
|
58
|
-
package_schema = File.join(dir, Ree::PACKAGE_SCHEMA_FILE)
|
59
|
-
|
60
|
-
if File.exist?(package_schema)
|
61
|
-
return package_schema.split('/')[-2]
|
62
|
-
end
|
63
|
-
|
64
58
|
if dir == '/'
|
65
59
|
return nil
|
66
60
|
end
|
67
61
|
|
62
|
+
if dir == 'package'
|
63
|
+
return File.expand_path('..', dir)
|
64
|
+
end
|
65
|
+
|
68
66
|
package_name_from_dir(File.expand_path('..', dir))
|
69
67
|
end
|
70
68
|
|
@@ -90,12 +88,6 @@ class Ree::PathHelper
|
|
90
88
|
)
|
91
89
|
end
|
92
90
|
|
93
|
-
# @param [Ree::Package] package Package schema
|
94
|
-
# @return [String] Absolute package schema path
|
95
|
-
def abs_package_schema_path(package)
|
96
|
-
File.join(project_root_dir(package), package.schema_rpath)
|
97
|
-
end
|
98
|
-
|
99
91
|
# @param [Ree::Package] package Package schema
|
100
92
|
# @return [String] Absolute package folder path (ex. /data/project/bc/accounts)
|
101
93
|
def abs_package_dir(package)
|
@@ -133,7 +133,7 @@ class Ree::BuildPackageDsl
|
|
133
133
|
package = @packages_facade.get_package(name, false)
|
134
134
|
|
135
135
|
if package.nil?
|
136
|
-
package = Ree::Package.new(Ree::VERSION, name, nil, nil
|
136
|
+
package = Ree::Package.new(Ree::VERSION, name, nil, nil)
|
137
137
|
@packages_facade.store_package(package)
|
138
138
|
end
|
139
139
|
|
data/lib/ree/dsl/import_dsl.rb
CHANGED
@@ -6,6 +6,8 @@ class Ree::ImportDsl
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def execute(klass, proc)
|
9
|
+
patch_const_missing
|
10
|
+
|
9
11
|
class_constant = self.class.instance_exec(&proc)
|
10
12
|
|
11
13
|
[
|
@@ -28,8 +30,21 @@ class Ree::ImportDsl
|
|
28
30
|
.eval("#{e.name} = Ree::ImportDsl::ClassConstant.new('#{e.name}')")
|
29
31
|
|
30
32
|
retry
|
33
|
+
ensure
|
34
|
+
cancel_patch_const_missing
|
31
35
|
end
|
32
36
|
|
37
|
+
def patch_const_missing
|
38
|
+
return if @_original_const_missing
|
39
|
+
@_original_const_missing = Module.instance_method(:const_missing)
|
40
|
+
Module.define_method(:const_missing){ |const_name| raise NameError.new("class not found #{const_name.to_s}", const_name) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def cancel_patch_const_missing
|
44
|
+
Module.define_method(:const_missing, @_original_const_missing)
|
45
|
+
@_original_const_missing = nil
|
46
|
+
end
|
47
|
+
|
33
48
|
private def extract_constants(class_constant)
|
34
49
|
[class_constant] + class_constant.constants
|
35
50
|
end
|
@@ -27,23 +27,10 @@ class Ree::PackagesFacade
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
def perf_mode?(package)
|
31
|
-
package.gem? ? true : Ree.performance_mode?
|
32
|
-
end
|
33
|
-
|
34
30
|
# @param [Symbol] package_name
|
35
31
|
# @return [Ree::Package]
|
36
32
|
def get_loaded_package(package_name)
|
37
|
-
|
38
|
-
return package if package.schema_loaded?
|
39
|
-
|
40
|
-
if perf_mode?(package)
|
41
|
-
read_package_schema_json(package_name)
|
42
|
-
else
|
43
|
-
load_entire_package(package_name)
|
44
|
-
end
|
45
|
-
|
46
|
-
package
|
33
|
+
@package_loader.get_loaded_package(package_name)
|
47
34
|
end
|
48
35
|
|
49
36
|
# @param [Symbol] package_name
|
@@ -53,10 +40,6 @@ class Ree::PackagesFacade
|
|
53
40
|
package = get_loaded_package(package_name)
|
54
41
|
object = package.get_object(object_name)
|
55
42
|
|
56
|
-
if !object && perf_mode?(package)
|
57
|
-
raise Ree::Error.new("Ree object :#{object_name} for package :#{package_name} not found")
|
58
|
-
end
|
59
|
-
|
60
43
|
object
|
61
44
|
end
|
62
45
|
|
@@ -67,98 +50,26 @@ class Ree::PackagesFacade
|
|
67
50
|
!object.nil?
|
68
51
|
end
|
69
52
|
|
70
|
-
# @param [Symbol] package_name
|
71
|
-
# @return nil
|
72
|
-
def dump_package_schema(package_name)
|
73
|
-
Ree.logger.debug("dump_package_schema(:#{package_name})")
|
74
|
-
|
75
|
-
read_package_schema_json(package_name)
|
76
|
-
package = get_package(package_name)
|
77
|
-
|
78
|
-
if package.dir
|
79
|
-
schema_path = Ree::PathHelper.abs_package_schema_path(package)
|
80
|
-
|
81
|
-
if !File.exist?(schema_path)
|
82
|
-
raise Ree::Error.new("File does not exist: #{schema_path}", :invalid_path)
|
83
|
-
end
|
84
|
-
|
85
|
-
schema = Ree::PackageSchemaBuilder.new.call(package)
|
86
|
-
json = JSON.pretty_generate(schema)
|
87
|
-
File.write(schema_path, json, mode: 'w')
|
88
|
-
|
89
|
-
json
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
# @param [Symbol] package_name
|
94
|
-
# @return nil
|
95
|
-
def write_package_schema(package_name)
|
96
|
-
Ree.logger.debug("write_package_schema(:#{package_name})")
|
97
|
-
|
98
|
-
load_entire_package(package_name)
|
99
|
-
package = get_package(package_name)
|
100
|
-
|
101
|
-
if package.dir
|
102
|
-
schema_path = Ree::PathHelper.abs_package_schema_path(package)
|
103
|
-
|
104
|
-
if !File.exist?(schema_path)
|
105
|
-
raise Ree::Error.new("File does not exist: #{schema_path}", :invalid_path)
|
106
|
-
end
|
107
|
-
|
108
|
-
schema = Ree::PackageSchemaBuilder.new.call(package)
|
109
|
-
json = JSON.pretty_generate(schema)
|
110
|
-
File.write(schema_path, json, mode: 'w')
|
111
|
-
|
112
|
-
json
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
53
|
# @param [Symbol] package_name
|
117
54
|
# @return nil
|
118
55
|
def load_package_entry(package_name)
|
119
|
-
|
120
|
-
|
121
|
-
if package.nil?
|
122
|
-
raise Ree::Error.new("package :#{package_name} not found in Packages.schema.json")
|
123
|
-
end
|
124
|
-
|
125
|
-
return if package.loaded?
|
126
|
-
|
127
|
-
Ree.logger.debug("load_package_entry(:#{package_name})")
|
128
|
-
|
129
|
-
load_file(
|
130
|
-
Ree::PathHelper.abs_package_entry_path(package),
|
131
|
-
package_name
|
132
|
-
)
|
56
|
+
@package_loader.load_package_entry(package_name)
|
133
57
|
end
|
134
58
|
|
59
|
+
|
135
60
|
# @param [Symbol] package_name
|
136
61
|
# @param [Symbol] object_name
|
137
62
|
# @return [Ree::Object]
|
138
63
|
def load_package_object(package_name, object_name)
|
139
64
|
package = get_loaded_package(package_name)
|
140
|
-
load_package_entry(package_name)
|
141
|
-
|
142
65
|
object = get_object(package_name, object_name)
|
143
|
-
return object if object && object.loaded?
|
144
|
-
|
145
|
-
if !object && !perf_mode?(package)
|
146
|
-
Dir[
|
147
|
-
File.join(
|
148
|
-
Ree::PathHelper.abs_package_module_dir(package),
|
149
|
-
"**/#{object_name}.rb"
|
150
|
-
)
|
151
|
-
].each do |path|
|
152
|
-
load_file(path, package_name)
|
153
|
-
end
|
154
|
-
|
155
|
-
object = get_object(package_name, object_name)
|
156
|
-
end
|
157
66
|
|
158
|
-
|
67
|
+
unless object
|
159
68
|
raise Ree::Error.new("object :#{object_name} from :#{package_name} was not found")
|
160
69
|
end
|
161
70
|
|
71
|
+
return object if object.loaded?
|
72
|
+
|
162
73
|
Ree.logger.debug("load_package_object(:#{package_name}, :#{object_name})")
|
163
74
|
|
164
75
|
if object.rpath
|
@@ -171,26 +82,14 @@ class Ree::PackagesFacade
|
|
171
82
|
|
172
83
|
# @param [Symbol] package_name
|
173
84
|
# @return [Ree::Package]
|
174
|
-
def
|
175
|
-
@package_loader.
|
85
|
+
def read_package_structure(package_name)
|
86
|
+
@package_loader.read_package_structure(package_name)
|
176
87
|
end
|
177
88
|
|
178
89
|
# @param [Symbol] package_name
|
179
90
|
# @return [Ree::Package]
|
180
|
-
def
|
181
|
-
@
|
182
|
-
return @loaded_schemas[package_name] if @loaded_schemas[package_name]
|
183
|
-
|
184
|
-
Ree.logger.debug("read_package_schema_json(:#{package_name})")
|
185
|
-
package = get_package(package_name)
|
186
|
-
|
187
|
-
if !package.dir
|
188
|
-
package.set_schema_loaded
|
189
|
-
return package
|
190
|
-
end
|
191
|
-
|
192
|
-
schema_path = Ree::PathHelper.abs_package_schema_path(package)
|
193
|
-
@loaded_schemas[package_name] = Ree::PackageSchemaLoader.new.call(schema_path, package)
|
91
|
+
def load_entire_package(package_name)
|
92
|
+
@package_loader.load_entire_package(package_name)
|
194
93
|
end
|
195
94
|
|
196
95
|
# @return [Ree::PackagesStore]
|
@@ -217,14 +116,7 @@ class Ree::PackagesFacade
|
|
217
116
|
# @param [Symbol] package_name
|
218
117
|
# @return [Ree::Package]
|
219
118
|
def get_package(package_name, raise_if_missing = true)
|
220
|
-
|
221
|
-
package = @packages_store.get(package_name)
|
222
|
-
|
223
|
-
if !package && raise_if_missing
|
224
|
-
raise Ree::Error.new("Package :#{package_name} is not found in Packages.schema.json. Run `ree gen.packages_json` to update schema.", :package_schema_not_found)
|
225
|
-
end
|
226
|
-
|
227
|
-
package
|
119
|
+
@package_loader.get_package(package_name, raise_if_missing)
|
228
120
|
end
|
229
121
|
|
230
122
|
# @param [Ree::Package] package
|
data/lib/ree/version.rb
CHANGED
data/lib/ree.rb
CHANGED
@@ -32,10 +32,8 @@ module Ree
|
|
32
32
|
autoload :BuildPackageDsl, 'ree/dsl/build_package_dsl'
|
33
33
|
autoload :PackageDSL, 'ree/package_dsl'
|
34
34
|
autoload :PackageEnvVar, 'ree/core/package_env_var'
|
35
|
+
autoload :PackageFileStructureLoader, 'ree/core/package_file_structure_loader'
|
35
36
|
autoload :PackageLoader, 'ree/core/package_loader'
|
36
|
-
autoload :PackageSchema, 'ree/core/package_schema'
|
37
|
-
autoload :PackageSchemaBuilder, 'ree/core/package_schema_builder'
|
38
|
-
autoload :PackageSchemaLoader, 'ree/core/package_schema_loader'
|
39
37
|
autoload :PackagesDetector, 'ree/core/packages_detector'
|
40
38
|
autoload :PackagesFacade, 'ree/facades/packages_facade'
|
41
39
|
autoload :PackagesSchema, 'ree/core/packages_schema'
|
@@ -56,7 +54,6 @@ module Ree
|
|
56
54
|
SCHEMAS = 'schemas'
|
57
55
|
SCHEMA = 'schema'
|
58
56
|
REE_SETUP = 'ree.setup.rb'
|
59
|
-
PACKAGE_SCHEMA_FILE = 'Package.schema.json'
|
60
57
|
PACKAGES_SCHEMA_FILE = 'Packages.schema.json'
|
61
58
|
ROOT_DIR_MESSAGE = 'Ree.root_dir is not set. Use Ree.init(DIR) to set project dir'
|
62
59
|
|
@@ -116,19 +113,6 @@ module Ree
|
|
116
113
|
logger.level = Logger::DEBUG
|
117
114
|
end
|
118
115
|
|
119
|
-
# Ree will use schema files to load packages and registered objects
|
120
|
-
def set_performance_mode
|
121
|
-
@performance_mode = true
|
122
|
-
end
|
123
|
-
|
124
|
-
def set_dev_mode
|
125
|
-
@performance_mode = false
|
126
|
-
end
|
127
|
-
|
128
|
-
def performance_mode?
|
129
|
-
!!@performance_mode
|
130
|
-
end
|
131
|
-
|
132
116
|
# Define preload context for registered objects
|
133
117
|
def preload_for(env)
|
134
118
|
check_arg(env, :env, Symbol)
|
@@ -215,6 +199,11 @@ module Ree
|
|
215
199
|
container.load_package(name)
|
216
200
|
end
|
217
201
|
|
202
|
+
def load_entire_package(name)
|
203
|
+
check_arg(name, :name, Symbol)
|
204
|
+
container.load_entire_package(name)
|
205
|
+
end
|
206
|
+
|
218
207
|
def locate_packages_schema(path)
|
219
208
|
check_arg(path, :path, String)
|
220
209
|
Ree.logger.debug("locate_packages_schema: #{path}")
|
@@ -228,23 +217,6 @@ module Ree
|
|
228
217
|
def root_dir
|
229
218
|
@root_dir || (raise Ree::Error.new(ROOT_DIR_MESSAGE, :invalid_root_dir))
|
230
219
|
end
|
231
|
-
|
232
|
-
def generate_schemas_for_all_packages(silence = false)
|
233
|
-
Ree.logger.debug("generate_schemas_for_all_packages") if !silence
|
234
|
-
facade = container.packages_facade
|
235
|
-
|
236
|
-
facade.class.write_packages_schema
|
237
|
-
facade.load_packages_schema
|
238
|
-
|
239
|
-
facade.packages_store.packages.each do |package|
|
240
|
-
next if package.gem?
|
241
|
-
next if package.dir.nil?
|
242
|
-
puts("Generating Package.schema.json for :#{package.name} package") if !silence
|
243
|
-
|
244
|
-
facade.load_entire_package(package.name)
|
245
|
-
facade.write_package_schema(package.name)
|
246
|
-
end
|
247
|
-
end
|
248
220
|
end
|
249
221
|
end
|
250
222
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ruslan Gatiyatov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-01-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: commander
|
@@ -64,7 +64,6 @@ files:
|
|
64
64
|
- lib/ree/bean_dsl.rb
|
65
65
|
- lib/ree/cli.rb
|
66
66
|
- lib/ree/cli/generate_package.rb
|
67
|
-
- lib/ree/cli/generate_package_schema.rb
|
68
67
|
- lib/ree/cli/generate_packages_schema.rb
|
69
68
|
- lib/ree/cli/generate_template.rb
|
70
69
|
- lib/ree/cli/indexing.rb
|
@@ -127,10 +126,8 @@ files:
|
|
127
126
|
- lib/ree/core/package.rb
|
128
127
|
- lib/ree/core/package_dep.rb
|
129
128
|
- lib/ree/core/package_env_var.rb
|
129
|
+
- lib/ree/core/package_file_structure_loader.rb
|
130
130
|
- lib/ree/core/package_loader.rb
|
131
|
-
- lib/ree/core/package_schema.rb
|
132
|
-
- lib/ree/core/package_schema_builder.rb
|
133
|
-
- lib/ree/core/package_schema_loader.rb
|
134
131
|
- lib/ree/core/packages_detector.rb
|
135
132
|
- lib/ree/core/packages_schema.rb
|
136
133
|
- lib/ree/core/packages_schema_builder.rb
|
@@ -178,9 +175,7 @@ files:
|
|
178
175
|
- lib/ree/templates/package/.rspec
|
179
176
|
- lib/ree/templates/package/<%=package_subdir_name%>/<%=package_name%>.rb
|
180
177
|
- lib/ree/templates/package/<%=package_subdir_name%>/<%=package_name%>/.gitkeep
|
181
|
-
- lib/ree/templates/package/Package.schema.json
|
182
178
|
- lib/ree/templates/package/bin/console
|
183
|
-
- lib/ree/templates/package/spec/package_schema_spec.rb
|
184
179
|
- lib/ree/templates/package/spec/spec_helper.rb
|
185
180
|
- lib/ree/templates/template_detector.rb
|
186
181
|
- lib/ree/templates/template_renderer.rb
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
|
3
|
-
module Ree
|
4
|
-
module CLI
|
5
|
-
class GeneratePackageSchema
|
6
|
-
class << self
|
7
|
-
def run(package_name:, project_path:, silence: false)
|
8
|
-
ENV['REE_SKIP_ENV_VARS_CHECK'] = 'true'
|
9
|
-
|
10
|
-
path = Ree.locate_packages_schema(project_path)
|
11
|
-
dir = Pathname.new(path).dirname.to_s
|
12
|
-
|
13
|
-
Ree.init(dir)
|
14
|
-
Ree.set_dev_mode
|
15
|
-
|
16
|
-
if package_name.strip.empty?
|
17
|
-
puts("Generating Package.schema.json for all packages") if !silence
|
18
|
-
Ree.generate_schemas_for_all_packages(silence)
|
19
|
-
return
|
20
|
-
end
|
21
|
-
|
22
|
-
puts("Generating Package.schema.json for :#{package_name} package") if !silence
|
23
|
-
|
24
|
-
package_name = package_name.to_sym
|
25
|
-
|
26
|
-
facade = Ree.container.packages_facade
|
27
|
-
facade.load_packages_schema
|
28
|
-
facade.load_entire_package(package_name)
|
29
|
-
facade.write_package_schema(package_name)
|
30
|
-
|
31
|
-
package = facade.get_package(package_name)
|
32
|
-
schema_path = Ree::PathHelper.abs_package_schema_path(package)
|
33
|
-
|
34
|
-
puts("output: #{schema_path}") if !silence
|
35
|
-
puts("done") if !silence
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Ree::PackageSchema
|
4
|
-
SCHEMA_VERSION_NUMBER = '1.1'
|
5
|
-
|
6
|
-
SCHEMA_TYPE = 'schema_type'
|
7
|
-
REE_VERSION = 'ree_version'
|
8
|
-
SCHEMA_VERSION = 'schema_version'
|
9
|
-
NAME = 'name'
|
10
|
-
PACKAGE = 'package'
|
11
|
-
ENTRY_PATH = 'entry_path'
|
12
|
-
OBJECTS = 'objects'
|
13
|
-
ENV_VARS = 'env_vars'
|
14
|
-
DEPENDS_ON = 'depends_on'
|
15
|
-
TAGS = 'tags'
|
16
|
-
|
17
|
-
module Objects
|
18
|
-
NAME = 'name'
|
19
|
-
SCHEMA = 'schema'
|
20
|
-
TAGS = 'tags'
|
21
|
-
end
|
22
|
-
|
23
|
-
module DependsOn
|
24
|
-
NAME = 'name'
|
25
|
-
end
|
26
|
-
|
27
|
-
module EnvVars
|
28
|
-
NAME = 'name'
|
29
|
-
DOC = 'doc'
|
30
|
-
end
|
31
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'pathname'
|
4
|
-
require 'json'
|
5
|
-
|
6
|
-
class Ree::PackageSchemaBuilder
|
7
|
-
Schema = Ree::PackageSchema
|
8
|
-
|
9
|
-
# @param [Ree::Package] package
|
10
|
-
# @return [Hash]
|
11
|
-
def call(package)
|
12
|
-
Ree.logger.debug("generating package schema for '#{package.name}' package")
|
13
|
-
|
14
|
-
if !package.loaded?
|
15
|
-
raise Ree::Error.new("package schema should be loaded", :invalid_schema)
|
16
|
-
end
|
17
|
-
|
18
|
-
data = {
|
19
|
-
Schema::SCHEMA_TYPE => Schema::PACKAGE,
|
20
|
-
Schema::SCHEMA_VERSION => Schema::SCHEMA_VERSION_NUMBER,
|
21
|
-
Schema::NAME => package.name,
|
22
|
-
Schema::ENTRY_PATH => package.entry_rpath,
|
23
|
-
Schema::TAGS => package.tags,
|
24
|
-
Schema::DEPENDS_ON => package.deps.sort_by(&:name).map { |dep|
|
25
|
-
{
|
26
|
-
Schema::DependsOn::NAME => dep.name,
|
27
|
-
}
|
28
|
-
},
|
29
|
-
Schema::ENV_VARS => package.env_vars.sort_by(&:name).map { |var|
|
30
|
-
{
|
31
|
-
Schema::EnvVars::NAME => var.name,
|
32
|
-
Schema::EnvVars::DOC => var.doc,
|
33
|
-
}
|
34
|
-
},
|
35
|
-
Schema::OBJECTS => package.objects.select { !_1.rpath.nil? }.sort_by(&:name).map { |object|
|
36
|
-
{
|
37
|
-
Schema::Objects::NAME => object.name,
|
38
|
-
Schema::Objects::SCHEMA => object.schema_rpath,
|
39
|
-
Schema::Objects::TAGS => object.tags
|
40
|
-
}
|
41
|
-
}
|
42
|
-
}
|
43
|
-
|
44
|
-
data
|
45
|
-
end
|
46
|
-
end
|
@@ -1,172 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'json'
|
4
|
-
require 'pathname'
|
5
|
-
|
6
|
-
class Ree::PackageSchemaLoader
|
7
|
-
# Sample Package.schema.json
|
8
|
-
# {
|
9
|
-
# "schema_type": "package",
|
10
|
-
# "schema_version": "1.2.3",
|
11
|
-
# "name": "accounts",
|
12
|
-
# "entry_path": "package/accounts.rb",
|
13
|
-
# "depends_on": [
|
14
|
-
# {
|
15
|
-
# "name": "clock",
|
16
|
-
# },
|
17
|
-
# {
|
18
|
-
# "name": "test_utils",
|
19
|
-
# }
|
20
|
-
# ],
|
21
|
-
# "env_vars": [
|
22
|
-
# {
|
23
|
-
# "name": "accounts.string_var",
|
24
|
-
# "doc": null
|
25
|
-
# },
|
26
|
-
# {
|
27
|
-
# "name": "accounts.integer_var",
|
28
|
-
# "doc": "integer value"
|
29
|
-
# }
|
30
|
-
# ],
|
31
|
-
# "objects": [
|
32
|
-
# {
|
33
|
-
# "name": "accounts_cfg",
|
34
|
-
# "schema": "schemas/accounts/accounts_cfg.schema.json"
|
35
|
-
# },
|
36
|
-
# {
|
37
|
-
# "name": "transaction",
|
38
|
-
# "schema": "schemas/accounts/transaction.schema.json"
|
39
|
-
# }
|
40
|
-
# ]
|
41
|
-
# }
|
42
|
-
|
43
|
-
Schema = Ree::PackageSchema
|
44
|
-
|
45
|
-
# @param [String] abs_schema_path Absolute path to package Package.schema.json file
|
46
|
-
# @param [Nilor[Ree::Package]] existing_package Loaded package
|
47
|
-
# @return [Ree::Package]
|
48
|
-
def call(abs_schema_path, existing_package = nil)
|
49
|
-
if !File.exist?(abs_schema_path)
|
50
|
-
raise Ree::Error.new("File not found: #{abs_schema_path}", :invalid_package_schema)
|
51
|
-
end
|
52
|
-
|
53
|
-
json_schema = begin
|
54
|
-
JSON.load_file(abs_schema_path)
|
55
|
-
rescue
|
56
|
-
raise Ree::Error.new("Invalid content: #{abs_schema_path}", :invalid_package_schema)
|
57
|
-
end
|
58
|
-
|
59
|
-
schema_type = json_schema.fetch(Schema::SCHEMA_TYPE)
|
60
|
-
|
61
|
-
if schema_type != Schema::PACKAGE
|
62
|
-
raise Ree::Error.new("Invalid schema type: #{abs_schema_path}", :invalid_package_schema)
|
63
|
-
end
|
64
|
-
|
65
|
-
schema_version = json_schema.fetch(Schema::SCHEMA_VERSION) { Schema::SCHEMA_VERSION_NUMBER }
|
66
|
-
entry_rpath = json_schema.fetch(Schema::ENTRY_PATH)
|
67
|
-
package_name = json_schema.fetch(Schema::NAME).to_sym
|
68
|
-
|
69
|
-
root_dir = if existing_package && existing_package.gem?
|
70
|
-
Ree.gem(existing_package.gem_name).dir
|
71
|
-
else
|
72
|
-
Ree.root_dir
|
73
|
-
end
|
74
|
-
|
75
|
-
schema_rpath = Pathname
|
76
|
-
.new(abs_schema_path)
|
77
|
-
.relative_path_from(Pathname.new(root_dir))
|
78
|
-
.to_s
|
79
|
-
|
80
|
-
object_store = {}
|
81
|
-
deps_store = {}
|
82
|
-
vars_store = {}
|
83
|
-
|
84
|
-
package = if existing_package
|
85
|
-
existing_package
|
86
|
-
.set_schema_version(schema_version)
|
87
|
-
.set_entry_rpath(entry_rpath)
|
88
|
-
.set_schema_rpath(schema_rpath)
|
89
|
-
else
|
90
|
-
Ree::Package.new(
|
91
|
-
schema_version,
|
92
|
-
package_name,
|
93
|
-
entry_rpath,
|
94
|
-
schema_rpath,
|
95
|
-
nil
|
96
|
-
)
|
97
|
-
end
|
98
|
-
|
99
|
-
package.set_schema_loaded
|
100
|
-
|
101
|
-
json_schema.fetch(Schema::OBJECTS).each do |item|
|
102
|
-
name = item[Schema::Objects::NAME].to_s
|
103
|
-
schema_rpath = item[Schema::Objects::SCHEMA].to_s
|
104
|
-
list = [name, schema_rpath]
|
105
|
-
tags = item[Schema::Objects::TAGS] || []
|
106
|
-
|
107
|
-
if list.reject(&:empty?).size != list.size
|
108
|
-
raise Ree::Error.new("invalid object data for #{item.inspect}: #{abs_schema_path}", :invalid_package_schema)
|
109
|
-
end
|
110
|
-
|
111
|
-
if object_store.has_key?(name)
|
112
|
-
raise Ree::Error.new("duplicate object name for '#{item[:name]}': #{abs_schema_path}", :invalid_package_schema)
|
113
|
-
end
|
114
|
-
|
115
|
-
object_store[name] = true
|
116
|
-
|
117
|
-
object = Ree::Object.new(
|
118
|
-
name.to_sym,
|
119
|
-
schema_rpath,
|
120
|
-
Ree::PathHelper.object_rpath(schema_rpath),
|
121
|
-
)
|
122
|
-
|
123
|
-
object.add_tags(tags)
|
124
|
-
object.set_package(package.name)
|
125
|
-
|
126
|
-
package.set_object(object)
|
127
|
-
end
|
128
|
-
|
129
|
-
deps = json_schema.fetch(Schema::DEPENDS_ON).map do |item|
|
130
|
-
name = item[Schema::DependsOn::NAME].to_sym
|
131
|
-
list = [name]
|
132
|
-
|
133
|
-
if list.reject(&:empty?).size != list.size
|
134
|
-
raise Ree::Error.new("invalid depends_on for: #{item.inspect}", :invalid_package_schema)
|
135
|
-
end
|
136
|
-
|
137
|
-
if deps_store.has_key?(name)
|
138
|
-
raise Ree::Error.new("duplicate depends_on name for '#{item[:name]}'", :invalid_package_schema)
|
139
|
-
end
|
140
|
-
|
141
|
-
deps_store[name] = true
|
142
|
-
Ree::PackageDep.new(name)
|
143
|
-
end
|
144
|
-
|
145
|
-
package.set_deps(deps)
|
146
|
-
|
147
|
-
env_vars = json_schema.fetch(Schema::ENV_VARS).map do |item|
|
148
|
-
name = item[Schema::EnvVars::NAME].to_s
|
149
|
-
doc = item[Schema::EnvVars::DOC]
|
150
|
-
list = [name]
|
151
|
-
|
152
|
-
if list.reject(&:empty?).size != list.size
|
153
|
-
raise Ree::Error.new("invalid env_var for: #{item.inspect}", :invalid_package_schema)
|
154
|
-
end
|
155
|
-
|
156
|
-
if vars_store.has_key?(name)
|
157
|
-
raise Ree::Error.new("duplicate env_var name for '#{item[:name]}'", :invalid_package_schema)
|
158
|
-
end
|
159
|
-
|
160
|
-
vars_store[name] = true
|
161
|
-
|
162
|
-
Ree::PackageEnvVar.new(name, doc)
|
163
|
-
end
|
164
|
-
|
165
|
-
package.set_env_vars(env_vars)
|
166
|
-
|
167
|
-
tags = json_schema.fetch(Schema::TAGS)
|
168
|
-
package.set_tags(tags)
|
169
|
-
|
170
|
-
package
|
171
|
-
end
|
172
|
-
end
|
File without changes
|
@@ -1,14 +0,0 @@
|
|
1
|
-
RSpec.describe "<%= Ree::StringUtils.camelize(package_name) %>" do
|
2
|
-
it "generates package schema" do
|
3
|
-
require 'fileutils'
|
4
|
-
|
5
|
-
packages_schema_path = Ree.locate_packages_schema(__dir__)
|
6
|
-
packages_schema_dir = Pathname.new(packages_schema_path).dirname.to_s
|
7
|
-
|
8
|
-
FileUtils.cd packages_schema_dir do
|
9
|
-
expect(
|
10
|
-
system("bundle exec ree gen.package_json <%= package_name %> --silence")
|
11
|
-
).to eq(true)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|