eac_templates 0.6.0 → 0.7.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: 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