ree 1.0.47 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: acd36218ecd239c1b8977b93f10b9d42b21870acd6d20bacf5f4bd403eff7bbe
4
- data.tar.gz: d8416af9bb24a3adf8d73e529736ce25538de021661e5c08a19b1d9b7aca9b2a
3
+ metadata.gz: 2f0f2ca665d289e3603982d8fefe5397fdbfacfdc2e11221e0c1d671e088f1b2
4
+ data.tar.gz: 2c4c6b8bfcd5e1f88217c39e8c33f914ff4f1d706a08e32a55c281cb5e633e16
5
5
  SHA512:
6
- metadata.gz: 9f1b24e7100258545120f064a20c02787f10fd0d531ac52072fe1bb1f7202da9a7a62ba8c6f466c2668119cf362149ab42e225ab89dad5ac199df3354996cb75
7
- data.tar.gz: f0d263aeefee18f47c81b29a3c8d2d3da51390d90c539eb931d91dc10be8bfd710da10a8880e385ccc36f6ca71a73bafe277e2a7d6b2f03fb805c183e1219f6c
6
+ metadata.gz: 8dc3a61e17a907c33aa125d7f094fb7fce07b7b35e88e6b76d8973bfe37508d7205a7a687a7bb63b09fe0d639f3d0230c01a320717ee782c2a3aaf6ee94458b2
7
+ data.tar.gz: 7a0b94dcf8a004578a87ce3c7ee221862729c70afe3998af1ad463710a57023ea05733ba29425358c01f20c49fc7b4081e1a7e61fb82611f6839fabfad050465
data/.rspec CHANGED
@@ -1,3 +1,4 @@
1
1
  --format documentation
2
2
  --color
3
3
  --require spec_helper
4
+ --exclude-pattern "**/sample_project/**/*"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ree (1.0.47)
4
+ ree (1.1.0)
5
5
  commander (~> 5.0.0)
6
6
 
7
7
  GEM
@@ -45,6 +45,7 @@ PLATFORMS
45
45
  x86_64-darwin-19
46
46
  x86_64-darwin-21
47
47
  x86_64-darwin-22
48
+ x86_64-darwin-23
48
49
  x86_64-linux
49
50
 
50
51
  DEPENDENCIES
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.load_entire_package(package_name)
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.load_entire_package(package.name)
58
+ facade.read_package_structure(package.name)
61
59
 
62
60
  package_hsh = index_package_entry(package)
63
61
 
@@ -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),
@@ -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.read_package_schema_json(package_name)
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
@@ -3,13 +3,12 @@
3
3
  require 'pathname'
4
4
 
5
5
  class Ree::Package
6
- attr_reader :schema_version, :name, :schema_rpath, :entry_rpath,
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, schema_rpath, gem_name = nil)
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 ||= @schema_rpath ? Pathname.new(@schema_rpath).dirname.to_s : nil
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 reset
14
- @loaded_paths = {}
15
- end
15
+ def load_entire_package(package_name)
16
+ return if @loaded_packages[package_name]
16
17
 
17
- # @param [Symbol] name Package name
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
- Ree.logger.debug("full_package_load(:#{name})")
22
- recursively_load_package(name, Hash.new(false))
23
- @loaded_packages[name]
24
- end
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
- def load_file(path, package_name)
27
- @loaded_paths[package_name] ||= {}
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
- Ree.logger.debug("load_file(:#{package_name}, '#{path}')")
32
- Kernel.require(path)
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
- private
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
- def recursively_load_package(name, loaded_packages)
38
- package = @packages_store.get(name)
39
- @loaded_packages[name] = package
41
+ read_package_structure(package_name)
40
42
 
41
- if !package
42
- raise Ree::Error.new(
43
- "Package :#{name} was not found. Did you mistype the name? Run `ree gen.packages_json` to update Packages.schema.json",
44
- :invalid_package_name
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
- if package.dir.nil?
49
- package.set_schema_loaded
50
- return @loaded_packages[name] = package
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
- not_loaded = Set.new(
54
- [name, package.deps.map(&:name)]
55
- .uniq
56
- .select { |pn| !loaded_packages[pn] }
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
- if not_loaded.include?(name)
60
- load_file(
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
- Dir[File.join(Ree::PathHelper.abs_package_module_dir(package), '**/*.rb')].each do |path|
65
- load_file(path, name)
66
- end
77
+ Ree.logger.debug("read_package_file_structure(:#{package_name})")
67
78
 
68
- loaded_packages[name] = true
79
+ if !package.dir
80
+ package.set_schema_loaded
81
+ return package
69
82
  end
70
83
 
71
- if !ENV.has_key?('REE_SKIP_ENV_VARS_CHECK')
72
- package.env_vars.each do |env_var|
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
- package.deps.each do |dep|
86
- if !loaded_packages[dep.name]
87
- recursively_load_package(dep.name, loaded_packages)
88
- end
89
- end
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
- package.set_schema_loaded
96
+ Ree.logger.debug("load_file(:#{package_name}, '#{path}')")
92
97
 
93
- @loaded_packages[name] = package
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, package_schema_path: String, gem_name: Nilor[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
- Dir[files].map do |file|
17
- package_schema_path = Pathname
18
- .new(file)
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
- name = package_schema_path.split('/')[-2]
23
- entry_path = Ree::PathHelper.package_entry_path(package_schema_path)
20
+ dir_path = Pathname.new(package_dir)
21
+ name = dir_path.parent.basename.to_s
24
22
 
25
- if !File.exist?(File.join(dir, entry_path))
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
- if names.has_key?(name)
30
- raise Ree::Error.new("package '#{name}' has duplicate defintions.\n\t1) #{names[name]},\n\t2) #{entry_path}", :duplicate_package)
31
- end
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
- SCHEMA = 'schema'
14
+ ENTRY_PATH = 'entry_path'
15
15
  GEM = 'gem'
16
16
  end
17
17
 
18
18
  module GemPackages
19
19
  NAME = 'name'
20
- SCHEMA = 'schema'
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::SCHEMA => _1.fetch(:package_schema_path),
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::SCHEMA => _1.fetch(:package_schema_path),
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
- schema_rpath = item[Schema::Packages::SCHEMA].to_s
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 '#{item[:name]}'", :invalid_packages_schema)
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
- Ree::PathHelper.package_entry_path(schema_rpath),
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
- Ree::PathHelper.package_entry_path(schema_rpath),
87
- schema_rpath,
85
+ entry_path,
88
86
  gem_name
89
87
  )
90
88
  )
@@ -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, nil)
136
+ package = Ree::Package.new(Ree::VERSION, name, nil, nil)
137
137
  @packages_facade.store_package(package)
138
138
  end
139
139
 
@@ -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
- package = get_package(package_name)
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
- package = @packages_store.get(package_name)
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
- if !object
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 load_entire_package(package_name)
175
- @package_loader.call(package_name)
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 read_package_schema_json(package_name)
181
- @loaded_schemas ||= {}
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
- check_arg(package_name, :package_name, Symbol)
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
@@ -8,7 +8,4 @@ end
8
8
  if ENV['RUBY_ENV'] == 'production'
9
9
  # Define preload context for registered objects
10
10
  Ree.preload_for(:production)
11
-
12
- # Use performance mode to load packages and registered objects based on schema files
13
- Ree.set_performance_mode
14
11
  end
data/lib/ree/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ree
4
- VERSION = "1.0.47"
4
+ VERSION = "1.1.0"
5
5
  end
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.47
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: 2024-08-26 00:00:00.000000000 Z
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