eac_templates 0.6.0 → 0.7.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: bc9aafcd773770ed687e7ba11baa553e5968e18c9f124f71a446430d387e18a5
4
- data.tar.gz: '096625ceb82074fbf40278cb545602726e33848488b734fd4ff86ab199bc5637'
3
+ metadata.gz: 6760f4ce4cf38f54efeecca766e9c0871e8c25b2243f08a538456732c5f5ff83
4
+ data.tar.gz: 4bc5d3c58bf1a5e99f8bd577a75588caef089aad7d3f10d94d2659d1986a8baf
5
5
  SHA512:
6
- metadata.gz: c42ec59495782f16ecba7f27a05a89fd096900baeb30745806bdb5262b8d5057d2100339cdf3f11ea7bd503a42567fef0bf489ba0a4e7dd25648b6da8d616512
7
- data.tar.gz: 106e1e173c5adc5e448514009616f6760ae7053cc05e2c2aa44c35b3963dc14e28b1edbd3d2bf8cc124753337ab91808787b175fc89116fa852df967ee68e10e
6
+ metadata.gz: c15346833718e092f413eed81e1370bcbc61595ad0a935c985be8ecb37589b10941a6b2e952c7ab06a55c8bb590caaa60bf31801153307e107c07bc3060f5898
7
+ data.tar.gz: fa8ce19ec361c461f8d3182477bec458566cca407c21d647da4255b6dd06b86c60d75c4bfd29086633bad4084ed4915bd11487675fe3ed05e9ce9fed8bcc1532
@@ -12,7 +12,7 @@ module EacTemplates
12
12
  delegate(*::EacTemplates::InterfaceMethods::DIRECTORY - %i[child chidren], to: :applier)
13
13
 
14
14
  # @param basename [Pathname]
15
- # @return [EacTemplates::Abstract::FsObject
15
+ # @return [EacTemplates::Abstract::FsObject]
16
16
  def build_child(child_basename, child_type)
17
17
  child_basename = child_basename.to_pathname
18
18
  child_type = type_list.value_validate!(child_type)
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'eac_ruby_utils/core_ext'
4
4
  require 'eac_templates/abstract/fs_object_by_pathname'
5
- require 'eac_templates/abstract/not_found_error'
5
+ require 'eac_templates/errors/not_found'
6
6
 
7
7
  module EacTemplates
8
8
  module Abstract
@@ -72,7 +72,7 @@ module EacTemplates
72
72
  end
73
73
 
74
74
  def raise_not_found(message)
75
- raise ::EacTemplates::Abstract::NotFoundError, message
75
+ raise ::EacTemplates::Errors::NotFound, message
76
76
  end
77
77
 
78
78
  # @return [EacTemplates::Sources::Set]
@@ -1,10 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_templates/abstract/not_found_error'
3
+ require 'eac_templates/errors/not_found'
4
4
 
5
5
  module EacTemplates
6
6
  module Abstract
7
7
  module WithDirectoryFileMethods
8
+ common_concern do
9
+ enable_simple_cache
10
+ end
11
+
8
12
  def build_fs_object(type)
9
13
  fs_object_class(type).by_subpath(self, nil, subpath, source_set: source_set)
10
14
  end
@@ -15,14 +19,24 @@ module EacTemplates
15
19
  subpath.if_present(child_basename) { |v| v.join(child_basename) }.to_pathname
16
20
  end
17
21
 
18
- # @return [EacTemplates::Abstract::Directory]
19
- def directory
20
- build_fs_object(:directory)
22
+ # @return [Boolean]
23
+ def directory?
24
+ directory.found?
21
25
  end
22
26
 
23
- # @return [EacTemplates::Abstract::File]
24
- def file
25
- build_fs_object(:file)
27
+ # @return [Boolean]
28
+ def file?
29
+ file.found?
30
+ end
31
+
32
+ # @return [Boolean]
33
+ def file_template?
34
+ file? && file.template?
35
+ end
36
+
37
+ # @return [Boolean]
38
+ def found?
39
+ directory? || file?
26
40
  end
27
41
 
28
42
  # @param type [Symbol]
@@ -33,13 +47,22 @@ module EacTemplates
33
47
 
34
48
  # @return [EacTemplates::Abstract::Directory, EacTemplates::Abstract::File]
35
49
  def sub_fs_object
36
- file_search = file
37
- return file_search if file_search.found?
50
+ return file if file.found?
51
+ return directory if directory.found?
52
+
53
+ raise ::EacTemplates::Errors::NotFound, "No template found: #{self}"
54
+ end
38
55
 
39
- directory_search = directory
40
- return directory_search if directory_search.found?
56
+ private
41
57
 
42
- raise ::EacTemplates::Abstract::NotFoundError, "No template found: #{self}"
58
+ # @return [EacTemplates::Abstract::Directory]
59
+ def directory_uncached
60
+ build_fs_object(:directory)
61
+ end
62
+
63
+ # @return [EacTemplates::Abstract::File]
64
+ def file_uncached
65
+ build_fs_object(:file)
43
66
  end
44
67
  end
45
68
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacTemplates
4
- module Abstract
5
- class NotFoundError < ::RuntimeError
4
+ module Errors
5
+ class NotFound < ::RuntimeError
6
6
  end
7
7
  end
8
8
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacTemplates
4
+ module Errors
5
+ class TypeMismatch < ::RuntimeError
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EacTemplates
6
+ module Errors
7
+ require_sub __FILE__
8
+ end
9
+ end
@@ -10,7 +10,27 @@ module EacTemplates
10
10
  class Ancestor
11
11
  class Directory < ::EacTemplates::Abstract::Directory
12
12
  include ::EacTemplates::Modules::Ancestor::FsObject
13
- delegate :children_basenames, to: :source_object
13
+ delegate :found?, :path, to: :source_object
14
+
15
+ # @return [Hash<Pathname, Symbol>]
16
+ def children_basenames
17
+ source_object.children_basenames.to_h { |k, v| parse_child_basename(k, v) }
18
+ end
19
+
20
+ protected
21
+
22
+ # @param basename [Pathname]
23
+ # @param type [Symbol]
24
+ # @return [Array]
25
+ def parse_child_basename(basename, type)
26
+ return [basename, type] unless type == :file
27
+
28
+ new_basename = ::EacTemplates::Modules::Ancestor::File.parse_basename(basename)
29
+
30
+ return [basename, type] if new_basename == basename
31
+
32
+ [new_basename, :file_template]
33
+ end
14
34
  end
15
35
  end
16
36
  end
@@ -10,6 +10,54 @@ module EacTemplates
10
10
  class Ancestor
11
11
  class File < ::EacTemplates::Abstract::File
12
12
  include ::EacTemplates::Modules::Ancestor::FsObject
13
+
14
+ TEMPLATE_EXTNAME_PATTERN =
15
+ /#{::Regexp.quote(::EacTemplates::Variables::FsObject::TEMPLATE_EXTNAME)}\z/.freeze
16
+
17
+ class << self
18
+ def parse_basename(basename)
19
+ basename.if_present do |v|
20
+ v.to_pathname
21
+ .to_path
22
+ .gsub(TEMPLATE_EXTNAME_PATTERN, '')
23
+ .to_pathname
24
+ end
25
+ end
26
+ end
27
+
28
+ # @return [Boolean]
29
+ def found?
30
+ source_object.found? || template?
31
+ end
32
+
33
+ # @return [Pathname]
34
+ def path
35
+ template? ? template_source_object.path : source_object.path
36
+ end
37
+
38
+ # @return [Pathname]
39
+ def basename
40
+ self.class.parse_basename(super)
41
+ end
42
+
43
+ # @return [Boolean]
44
+ def template?
45
+ template_source_object.found?
46
+ end
47
+
48
+ protected
49
+
50
+ # @return [EacTemplates::Sources::File]
51
+ def template_source_object_uncached
52
+ owner.source_set.send(type, template_source_object_path_for_search)
53
+ end
54
+
55
+ # @return [Pathname]
56
+ def template_source_object_path_for_search
57
+ path_for_search.basename_sub do |b|
58
+ "#{b}#{::EacTemplates::Variables::FsObject::TEMPLATE_EXTNAME}"
59
+ end
60
+ end
13
61
  end
14
62
  end
15
63
  end
@@ -7,8 +7,6 @@ module EacTemplates
7
7
  module Modules
8
8
  class Ancestor
9
9
  module FsObject
10
- delegate :found?, :path, to: :source_object
11
-
12
10
  # @return [Pathname]
13
11
  delegate :path_for_search, to: :owner
14
12
 
@@ -19,7 +19,7 @@ module EacTemplates
19
19
 
20
20
  common_constructor :base, :ancestor
21
21
  delegate :subpath, :source_set, to: :base
22
- delegate(*::EacTemplates::InterfaceMethods::ALL, to: :sub_fs_object)
22
+ delegate(*::EacTemplates::InterfaceMethods::ALL + [:children_basenames], to: :sub_fs_object)
23
23
 
24
24
  def ancestor_path_for_search
25
25
  self.class.path_for_search(ancestor)
@@ -10,15 +10,28 @@ module EacTemplates
10
10
  class Base
11
11
  class Directory < ::EacTemplates::Abstract::Directory
12
12
  include ::EacTemplates::Modules::Base::FsObject
13
- delegate(*(EacTemplates::InterfaceMethods::DIRECTORY - %i[children]), to: :self_ancestor)
13
+ delegate(*(EacTemplates::InterfaceMethods::DIRECTORY - %i[apply child children]),
14
+ to: :self_ancestor)
14
15
 
15
- # @param basename [Pathname]
16
- # @return [EacTemplates::Abstract::FsObject]
17
- delegate :child, to: :owner
16
+ # @param variables_source [Object]
17
+ # @param target_path [Pathname]
18
+ def apply(variables_source, target_path)
19
+ target_path = target_path.to_pathname
20
+ target_path.mkpath
21
+ children.each do |child|
22
+ child_apply(child, variables_source, target_path.join(child.basename))
23
+ end
24
+ end
25
+
26
+ # @!method build_child(child_basename, child_type)
27
+ # @param child_basename [Pathname]
28
+ # @param child_type [Symbol]
29
+ # @return [EacTemplates::Modules::Base]
30
+ delegate :build_child, to: :owner
18
31
 
19
32
  # @return [Hash<Pathname, Symbol>]
20
33
  def children_basenames
21
- owner.ancestors.each_with_object({}) do |e, a|
34
+ owner.ancestors.select(&:directory?).each_with_object({}) do |e, a|
22
35
  ancestor_children_names(e, a)
23
36
  end
24
37
  end
@@ -34,10 +47,25 @@ module EacTemplates
34
47
  # @param result [Hash<Pathname, Symbol>]
35
48
  # @return [void]
36
49
  def ancestor_children_names(ancestor, result)
37
- ancestor.directory.source_object.children_basenames.each do |path, type|
50
+ ancestor.children_basenames.each do |path, type|
38
51
  result[path] = type
39
52
  end
40
53
  end
54
+
55
+ # @param child [EacTemplates::Modules::Base]
56
+ # # @param variables_source [Object]
57
+ # @param target_path [Pathname]
58
+ def child_apply(child, variables_source, target_path)
59
+ if child.directory?
60
+ child.apply(variables_source, target_path)
61
+ elsif child.file_template?
62
+ child.apply_to_file(variables_source, target_path)
63
+ elsif child.file?
64
+ ::FileUtils.cp(child.path, target_path)
65
+ else
66
+ ibr
67
+ end
68
+ end
41
69
  end
42
70
  end
43
71
  end
@@ -10,7 +10,11 @@ module EacTemplates
10
10
  class Base
11
11
  class File < ::EacTemplates::Abstract::File
12
12
  include ::EacTemplates::Modules::Base::FsObject
13
- delegate(*EacTemplates::InterfaceMethods::FILE, to: :ancestor_found)
13
+ delegate(*EacTemplates::InterfaceMethods::FILE + [:template?], to: :ancestor_found)
14
+
15
+ def basename
16
+ ancestor_found.if_present(&:basename)
17
+ end
14
18
 
15
19
  def found?
16
20
  ancestor_found.present?
@@ -10,8 +10,6 @@ module EacTemplates
10
10
  def self_ancestor
11
11
  owner.self_ancestor.send(type)
12
12
  end
13
-
14
- delegate :found?, to: :self_ancestor
15
13
  end
16
14
  end
17
15
  end
@@ -5,6 +5,7 @@ require 'eac_templates/interface_methods'
5
5
  require 'eac_templates/abstract/with_directory_file_methods'
6
6
  require 'eac_templates/modules/ancestor'
7
7
  require 'eac_templates/sources/set'
8
+ require 'eac_templates/errors/type_mismatch'
8
9
 
9
10
  module EacTemplates
10
11
  module Modules
@@ -18,19 +19,20 @@ module EacTemplates
18
19
  end
19
20
  delegate(*::EacTemplates::InterfaceMethods::ONLY_DIRECTORY, to: :directory)
20
21
  delegate(*::EacTemplates::InterfaceMethods::ONLY_FILE, to: :file)
21
- delegate(*::EacTemplates::InterfaceMethods::COMMON, :path_for_search, :source_object,
22
- to: :sub_fs_object)
22
+ delegate(*::EacTemplates::InterfaceMethods::COMMON, :basename, :path_for_search,
23
+ :source_object, :type, to: :sub_fs_object)
23
24
 
24
- # @param basename [Pathname]
25
- # @return [EacTemplates::Abstract::FsObject]
26
- def child(basename)
25
+ # @param child_basename [Pathname]
26
+ # @param child_type [Symbol]
27
+ # @return [EacTemplates::Modules::Base]
28
+ def build_child(child_basename, child_type)
27
29
  r = ::EacTemplates::Modules::Base.new(
28
- the_module, subpath: child_subpath(basename), source_set: source_set
30
+ the_module, subpath: child_subpath(child_basename), source_set: source_set
29
31
  )
30
- return r if r.found?
32
+ return r.validate_type(child_type) if r.found?
31
33
 
32
- raise ::EacTemplates::Abstract::NotFoundError,
33
- "No child for #{self} found with basename \"#{basename}\""
34
+ raise ::EacTemplates::Errors::NotFound,
35
+ "No child for #{self} found with basename \"#{child_basename}\""
34
36
  end
35
37
 
36
38
  # @return [Boolean]
@@ -48,6 +50,21 @@ module EacTemplates
48
50
  options[OPTION_SUBPATH].if_present(&:to_pathname)
49
51
  end
50
52
 
53
+ # @return [String]
54
+ def to_s
55
+ "#{self.class}[#{the_module.name}#\"#{subpath}\"]"
56
+ end
57
+
58
+ # @param required_type [Symbol]
59
+ # @return [self]
60
+ # @raise [EacTemplates::Errors::TypeMismatch]
61
+ def validate_type(required_type)
62
+ return self if valid_type?(required_type)
63
+
64
+ raise ::EacTemplates::Errors::TypeMismatch, "A #{required_type} type was expected, but a " \
65
+ "#{type} was builded"
66
+ end
67
+
51
68
  private
52
69
 
53
70
  # @return [Enumerable<EacTemplates::Modules::Ancestor>]
@@ -60,6 +77,16 @@ module EacTemplates
60
77
  ancestors.find { |a| a.ancestor == the_module } || ibr
61
78
  end
62
79
 
80
+ # @return [Boolean]
81
+ def valid_type?(required_type)
82
+ file_types = %i[file file_template]
83
+ if file_types.include?(required_type)
84
+ file_types.include?(type)
85
+ else
86
+ type == required_type
87
+ end
88
+ end
89
+
63
90
  require_sub __FILE__
64
91
  end
65
92
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'eac_ruby_utils/core_ext'
4
- require 'eac_templates/abstract/not_found_error'
4
+ require 'eac_templates/errors/not_found'
5
5
 
6
6
  module EacTemplates
7
7
  module Sources
@@ -4,7 +4,7 @@ require 'active_support/core_ext/object/blank'
4
4
  require 'eac_templates/sources/directory'
5
5
  require 'eac_templates/sources/file'
6
6
  require 'eac_templates/sources/internal_set'
7
- require 'eac_templates/abstract/not_found_error'
7
+ require 'eac_templates/errors/not_found'
8
8
 
9
9
  module EacTemplates
10
10
  module Sources
@@ -47,7 +47,7 @@ module EacTemplates
47
47
  private
48
48
 
49
49
  def raise_template_not_found(subpath)
50
- raise ::EacTemplates::Abstract::NotFoundError,
50
+ raise ::EacTemplates::Errors::NotFound,
51
51
  'Template not found for subpath ' \
52
52
  "\"#{subpath}\" (Included paths: #{included_paths.to_a.join(::File::PATH_SEPARATOR)})"
53
53
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_templates/abstract/not_found_error'
3
+ require 'eac_templates/errors/not_found'
4
4
  require 'eac_templates/abstract/directory'
5
5
  require 'eac_templates/variables/file'
6
6
  require 'eac_templates/variables/fs_object'
@@ -22,7 +22,7 @@ module EacTemplates
22
22
  return ::EacTemplates::Variables::File.new(child_path) if ::File.file?(child_path)
23
23
  return ::EacTemplates::Variables::Directory.new(child_path) if ::File.directory?(child_path)
24
24
 
25
- raise ::EacTemplates::Abstract::NotFoundError,
25
+ raise ::EacTemplates::Errors::NotFound,
26
26
  "Child \"#{subpath}\" from \"#{path}\" not found"
27
27
  end
28
28
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacTemplates
4
- VERSION = '0.6.0'
4
+ VERSION = '0.7.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eac_templates
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Put here the authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-18 00:00:00.000000000 Z
11
+ date: 2024-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eac_config
@@ -44,6 +44,20 @@ dependencies:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0.122'
47
+ - !ruby/object:Gem::Dependency
48
+ name: eac_fs
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.17'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.17'
47
61
  - !ruby/object:Gem::Dependency
48
62
  name: eac_ruby_gem_support
49
63
  requirement: !ruby/object:Gem::Requirement
@@ -69,9 +83,11 @@ files:
69
83
  - lib/eac_templates/abstract/file.rb
70
84
  - lib/eac_templates/abstract/fs_object.rb
71
85
  - lib/eac_templates/abstract/fs_object_by_pathname.rb
72
- - lib/eac_templates/abstract/not_found_error.rb
73
86
  - lib/eac_templates/abstract/with_directory_file_methods.rb
74
87
  - lib/eac_templates/core_ext.rb
88
+ - lib/eac_templates/errors.rb
89
+ - lib/eac_templates/errors/not_found.rb
90
+ - lib/eac_templates/errors/type_mismatch.rb
75
91
  - lib/eac_templates/interface_methods.rb
76
92
  - lib/eac_templates/modules.rb
77
93
  - lib/eac_templates/modules/ancestor.rb