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 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