eac_tools 0.61.0 → 0.62.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +30 -25
  3. data/lib/eac_tools/version.rb +1 -1
  4. data/sub/avm/avm.gemspec +2 -2
  5. data/sub/avm/lib/avm/version.rb +1 -1
  6. data/sub/avm-eac_redmine_base0/avm-eac_redmine_base0.gemspec +3 -3
  7. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/instances/base.rb +1 -1
  8. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/instances/rest_api/entity_base.rb +35 -0
  9. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/instances/rest_api/project.rb +26 -0
  10. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/instances/rest_api/root.rb +21 -0
  11. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/instances/rest_api/wiki_page.rb +54 -0
  12. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/instances/rest_api.rb +1 -0
  13. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/instances/runners/project/wiki_page/read.rb +27 -0
  14. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/instances/runners/project/wiki_page/write.rb +70 -0
  15. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/instances/runners/project/wiki_page.rb +30 -0
  16. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/instances/runners/project.rb +26 -0
  17. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/version.rb +1 -1
  18. data/sub/avm-files/avm-files.gemspec +1 -1
  19. data/sub/avm-files/lib/avm/files/version.rb +1 -1
  20. data/sub/avm-git/avm-git.gemspec +2 -2
  21. data/sub/avm-git/lib/avm/git/version.rb +1 -1
  22. data/sub/{eac_ruby_base0/lib/eac_ruby_base0 → eac_cli/lib/eac_cli}/runner_with/confirmation.rb +3 -1
  23. data/sub/{eac_ruby_base0/lib/eac_ruby_base0 → eac_cli/lib/eac_cli}/runner_with/input.rb +1 -1
  24. data/sub/{eac_ruby_base0/lib/eac_ruby_base0 → eac_cli/lib/eac_cli}/runner_with/output.rb +1 -1
  25. data/sub/eac_cli/lib/eac_cli/version.rb +1 -1
  26. data/sub/{eac_ruby_base0/spec/lib/eac_ruby_base0 → eac_cli/spec/lib/eac_cli}/runner_with/confirmation_spec.rb +2 -2
  27. data/sub/{eac_ruby_base0/spec/lib/eac_ruby_base0 → eac_cli/spec/lib/eac_cli}/runner_with/output_spec.rb +4 -4
  28. data/sub/eac_rest/Gemfile +8 -0
  29. data/sub/eac_rest/eac_rest.gemspec +21 -0
  30. data/sub/eac_rest/lib/eac_rest/api.rb +69 -0
  31. data/sub/eac_rest/lib/eac_rest/entity.rb +66 -0
  32. data/sub/eac_rest/lib/eac_rest/error.rb +6 -0
  33. data/sub/eac_rest/lib/eac_rest/request.rb +48 -0
  34. data/sub/eac_rest/lib/eac_rest/response.rb +25 -0
  35. data/sub/eac_rest/lib/eac_rest/version.rb +5 -0
  36. data/sub/eac_rest/lib/eac_rest.rb +7 -0
  37. data/sub/eac_rest/spec/lib/eac_rest/api_spec.rb +71 -0
  38. data/sub/eac_rest/spec/lib/eac_rest/api_spec_files/get.source.yaml +5 -0
  39. data/sub/eac_rest/spec/lib/eac_rest/api_spec_files/get.target.yaml +9 -0
  40. data/sub/eac_rest/spec/lib/eac_rest/api_spec_files/get_with_auth.source.yaml +8 -0
  41. data/sub/eac_rest/spec/lib/eac_rest/api_spec_files/get_with_auth.target.yaml +10 -0
  42. data/sub/eac_rest/spec/lib/eac_rest/api_spec_files/post_array_body.source.yaml +10 -0
  43. data/sub/eac_rest/spec/lib/eac_rest/api_spec_files/post_array_body.target.yaml +11 -0
  44. data/sub/eac_rest/spec/lib/eac_rest/api_spec_files/post_string_body.source.yaml +4 -0
  45. data/sub/eac_rest/spec/lib/eac_rest/api_spec_files/post_string_body.target.yaml +11 -0
  46. data/sub/eac_rest/spec/lib/eac_rest/api_spec_files/put_hash_body.source.yaml +6 -0
  47. data/sub/eac_rest/spec/lib/eac_rest/api_spec_files/put_hash_body.target.yaml +11 -0
  48. data/sub/eac_rest/spec/lib/eac_rest/api_spec_files/put_with_file.source.yaml +5 -0
  49. data/sub/eac_rest/spec/lib/eac_rest/api_spec_files/put_with_file.target.yaml +13 -0
  50. data/sub/eac_rest/spec/lib/eac_rest/api_spec_files/root.source.yaml +2 -0
  51. data/sub/eac_rest/spec/lib/eac_rest/api_spec_files/root.target.yaml +9 -0
  52. data/sub/eac_rest/spec/rubocop_spec.rb +3 -0
  53. data/sub/eac_rest/spec/spec_helper/request_builder.rb +50 -0
  54. data/sub/eac_rest/spec/spec_helper.rb +7 -0
  55. data/sub/eac_ruby_base0/eac_ruby_base0.gemspec +2 -2
  56. data/sub/eac_ruby_base0/lib/eac_ruby_base0/version.rb +1 -1
  57. data/sub/eac_templates/lib/eac_templates/abstract/directory.rb +42 -0
  58. data/sub/eac_templates/lib/eac_templates/abstract/file.rb +25 -0
  59. data/sub/eac_templates/lib/eac_templates/abstract/fs_object.rb +94 -0
  60. data/sub/eac_templates/lib/eac_templates/abstract/fs_object_by_pathname.rb +13 -0
  61. data/sub/eac_templates/lib/eac_templates/abstract/not_found_error.rb +8 -0
  62. data/sub/eac_templates/lib/eac_templates/interface_methods.rb +3 -3
  63. data/sub/eac_templates/lib/eac_templates/modules/ancestor/directory.rb +4 -2
  64. data/sub/eac_templates/lib/eac_templates/modules/ancestor/file.rb +3 -2
  65. data/sub/eac_templates/lib/eac_templates/modules/ancestor/fs_object.rb +6 -13
  66. data/sub/eac_templates/lib/eac_templates/modules/ancestor.rb +6 -3
  67. data/sub/eac_templates/lib/eac_templates/sources/directory.rb +23 -10
  68. data/sub/eac_templates/lib/eac_templates/sources/file.rb +3 -14
  69. data/sub/eac_templates/lib/eac_templates/sources/fs_object.rb +17 -17
  70. data/sub/eac_templates/lib/eac_templates/sources/set.rb +5 -4
  71. data/sub/eac_templates/lib/eac_templates/variables/content.rb +52 -0
  72. data/sub/eac_templates/lib/eac_templates/variables/directory.rb +7 -5
  73. data/sub/eac_templates/lib/eac_templates/variables/file.rb +9 -33
  74. data/sub/eac_templates/lib/eac_templates/version.rb +1 -1
  75. data/sub/eac_templates/spec/lib/eac_templates/{patches/module/template_spec.rb → modules/base_spec.rb} +41 -20
  76. data/sub/eac_templates/spec/lib/eac_templates/modules/base_spec_files/path2/a_module/a/a_b +1 -0
  77. data/sub/eac_templates/spec/lib/eac_templates/modules/base_spec_files/path2/a_module/c +1 -0
  78. data/sub/eac_templates/spec/lib/eac_templates/modules/base_spec_files/path2/prepended_module/c +1 -0
  79. data/sub/eac_templates/spec/lib/eac_templates/modules/base_spec_files/path2/super_class/a/a_b +1 -0
  80. data/sub/eac_templates/spec/lib/eac_templates/variables/{file_spec.rb → content_spec.rb} +4 -4
  81. metadata +69 -39
  82. data/sub/eac_templates/spec/lib/eac_templates/patches/module/template_spec_files/path2/a_module/a/a_b +0 -1
  83. data/sub/eac_templates/spec/lib/eac_templates/patches/module/template_spec_files/path2/a_module/c +0 -1
  84. data/sub/eac_templates/spec/lib/eac_templates/patches/module/template_spec_files/path2/super_class/a/a_b +0 -1
  85. /data/sub/eac_templates/spec/lib/eac_templates/{patches/module/template_spec_files → modules/base_spec_files}/path1/a_module/a/a_a +0 -0
  86. /data/sub/eac_templates/spec/lib/eac_templates/{patches/module/template_spec_files → modules/base_spec_files}/path1/a_module/b +0 -0
  87. /data/sub/eac_templates/spec/lib/eac_templates/{patches/module/template_spec_files → modules/base_spec_files}/path1/super_class/a/a_b +0 -0
  88. /data/sub/eac_templates/spec/lib/eac_templates/{patches/module/template_spec_files → modules/base_spec_files}/path1/super_class/b +0 -0
  89. /data/sub/eac_templates/spec/lib/eac_templates/{patches/module/template_spec_files → modules/base_spec_files}/path2/a_module/b +0 -0
  90. /data/sub/eac_templates/spec/lib/eac_templates/{patches/module/template_spec_files → modules/base_spec_files}/path2/sub_class/b +0 -0
  91. /data/sub/eac_templates/spec/lib/eac_templates/{patches/module/template_spec_files → modules/base_spec_files}/path2/super_class/b +0 -0
  92. /data/sub/eac_templates/spec/lib/eac_templates/variables/{file_spec_files → content_spec_files}/expected_content +0 -0
  93. /data/sub/eac_templates/spec/lib/eac_templates/variables/{file_spec_files → content_spec_files}/source.template +0 -0
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'eac_templates/abstract/fs_object_by_pathname'
5
+ require 'eac_templates/abstract/not_found_error'
6
+
7
+ module EacTemplates
8
+ module Abstract
9
+ class FsObject
10
+ class << self
11
+ # @param obj [Object]
12
+ # @return [EacTemplates::Abstract::FsObject, EacTemplates::Abstracts::FsObjectByPathname]
13
+ def assert(obj)
14
+ if obj.is_a?(self)
15
+ obj
16
+ else
17
+ ::EacTemplates::Abstract::FsObjectByPathname.new(obj)
18
+ end
19
+ end
20
+
21
+ # @param owner [Object]
22
+ # @param parent_object [Object, nil]
23
+ # @param subpath [Pathname]
24
+ # @return [EacTemplates::Abstract::FsObject]
25
+ def by_subpath(owner, parent_object, subpath, options = {})
26
+ r = nil
27
+ subpath.to_pathname.each_filename do |basename|
28
+ r = new(owner, parent_object, basename, options)
29
+ parent_object = r
30
+ end
31
+ r || raise("Subpath is empty: #{subpath}")
32
+ end
33
+ end
34
+
35
+ enable_abstract_methods
36
+ enable_simple_cache
37
+ enable_listable
38
+ lists.add_symbol :option, :source_set
39
+ lists.add_symbol :type, :directory, :file
40
+ common_constructor :owner, :parent_object, :basename, :options, default: [{}] do
41
+ self.basename = basename.present? ? basename.to_pathname : ::Pathname.new('')
42
+ self.options = ::EacTemplates::Abstract::FsObject.lists.option.hash_keys_validate!(options)
43
+ end
44
+
45
+ # @return [EacTemplates::Variables::Directory, EacTemplates::Variables::File]
46
+ def applier
47
+ applier_class.new(self)
48
+ end
49
+
50
+ # @return [Class]
51
+ def applier_class
52
+ ::EacTemplates::Variables.const_get(type.to_s.camelize)
53
+ end
54
+
55
+ # @return [Module]
56
+ def category_module
57
+ self.class.module_parent
58
+ end
59
+
60
+ # @return [Pathname]
61
+ def path_for_search
62
+ if parent_object.present?
63
+ parent_object.path_for_search.join(basename)
64
+ else
65
+ path_for_search_prefix.join(basename)
66
+ end
67
+ end
68
+
69
+ # @return [Pathname]
70
+ def path_for_search_prefix
71
+ raise_abstract_method __method__
72
+ end
73
+
74
+ def raise_not_found(message)
75
+ raise ::EacTemplates::Abstract::NotFoundError, message
76
+ end
77
+
78
+ # @return [EacTemplates::Sources::Set]
79
+ def source_set
80
+ options[OPTION_SOURCE_SET] || ::EacTemplates::Sources::Set.default
81
+ end
82
+
83
+ # @return [Symbol]
84
+ def type
85
+ type_list.value_validate!(self.class.name.demodulize.underscore.to_sym)
86
+ end
87
+
88
+ # @return [EacRubyUtils::Listable::SymbolList]
89
+ def type_list
90
+ ::EacTemplates::Abstract::FsObject.lists.type
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EacTemplates
6
+ module Abstract
7
+ class FsObjectByPathname
8
+ common_constructor :path do
9
+ self.path = path.to_pathname
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacTemplates
4
+ module Abstract
5
+ class NotFoundError < ::RuntimeError
6
+ end
7
+ end
8
+ end
@@ -2,10 +2,10 @@
2
2
 
3
3
  module EacTemplates
4
4
  module InterfaceMethods
5
- COMMON = %w[apply path].freeze
6
- ONLY_DIRECTORY = %w[child children].freeze
5
+ COMMON = %i[apply path].freeze
6
+ ONLY_DIRECTORY = %i[child children].freeze
7
7
  DIRECTORY = COMMON + ONLY_DIRECTORY
8
- ONLY_FILE = %w[apply_to_file content variables].freeze
8
+ ONLY_FILE = %i[apply_to_file content variables].freeze
9
9
  FILE = COMMON + ONLY_FILE
10
10
  ALL = COMMON + ONLY_DIRECTORY + ONLY_FILE
11
11
  end
@@ -1,14 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'eac_ruby_utils/core_ext'
4
+ require 'eac_templates/abstract/directory'
4
5
  require 'eac_templates/interface_methods'
5
6
  require 'eac_templates/modules/ancestor/fs_object'
6
7
 
7
8
  module EacTemplates
8
9
  module Modules
9
10
  class Ancestor
10
- class Directory < ::EacTemplates::Modules::Ancestor::FsObject
11
- delegate(*::EacTemplates::InterfaceMethods::ONLY_DIRECTORY, to: :source_object)
11
+ class Directory < ::EacTemplates::Abstract::Directory
12
+ include ::EacTemplates::Modules::Ancestor::FsObject
13
+ delegate :children_basenames, to: :source_object
12
14
  end
13
15
  end
14
16
  end
@@ -1,14 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'eac_ruby_utils/core_ext'
4
+ require 'eac_templates/abstract/file'
4
5
  require 'eac_templates/interface_methods'
5
6
  require 'eac_templates/modules/ancestor/fs_object'
6
7
 
7
8
  module EacTemplates
8
9
  module Modules
9
10
  class Ancestor
10
- class File < ::EacTemplates::Modules::Ancestor::FsObject
11
- delegate(*::EacTemplates::InterfaceMethods::ONLY_FILE, to: :source_object)
11
+ class File < ::EacTemplates::Abstract::File
12
+ include ::EacTemplates::Modules::Ancestor::FsObject
12
13
  end
13
14
  end
14
15
  end
@@ -6,25 +6,18 @@ require 'eac_templates/interface_methods'
6
6
  module EacTemplates
7
7
  module Modules
8
8
  class Ancestor
9
- class FsObject
10
- enable_simple_cache
11
- common_constructor :base
12
- delegate(*::EacTemplates::InterfaceMethods::COMMON, :found?, to: :source_object)
9
+ module FsObject
10
+ delegate :found?, :path, to: :source_object
13
11
 
14
- # @return [Symbol]
15
- def object_type
16
- self.class.name.demodulize.underscore.to_sym
17
- end
18
-
19
- # @return [Pathname, nil]
20
- def path
21
- source_object.found? ? source_object.send(:real_paths).first : nil
12
+ # @return [Pathname]
13
+ def path_for_search_prefix
14
+ owner.path_for_search
22
15
  end
23
16
 
24
17
  private
25
18
 
26
19
  def source_object_uncached
27
- base.source_set.send(object_type, base.path_for_search)
20
+ owner.source_set.send(type, path_for_search)
28
21
  end
29
22
  end
30
23
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'eac_ruby_utils/core_ext'
4
4
  require 'eac_templates/interface_methods'
5
+ require 'eac_templates/abstract/not_found_error'
5
6
 
6
7
  module EacTemplates
7
8
  module Modules
@@ -20,12 +21,14 @@ module EacTemplates
20
21
 
21
22
  # @return [EacTemplates::Modules::Directory]
22
23
  def directory
23
- ::EacTemplates::Modules::Ancestor::Directory.new(self)
24
+ @directory ||= ::EacTemplates::Modules::Ancestor::Directory
25
+ .new(self, nil, nil, source_set: source_set)
24
26
  end
25
27
 
26
28
  # @return [EacTemplates::Modules::File]
27
29
  def file
28
- @file ||= ::EacTemplates::Modules::Ancestor::File.new(self)
30
+ @file ||= ::EacTemplates::Modules::Ancestor::File
31
+ .new(self, nil, nil, source_set: source_set)
29
32
  end
30
33
 
31
34
  # @return [Pathname]
@@ -39,7 +42,7 @@ module EacTemplates
39
42
  return file if file.found?
40
43
  return directory if directory.found?
41
44
 
42
- raise "No template found: #{path_for_search}"
45
+ raise ::EacTemplates::Abstract::NotFoundError, "No template found: #{path_for_search}"
43
46
  end
44
47
 
45
48
  require_sub __FILE__
@@ -1,23 +1,36 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'eac_ruby_utils/core_ext'
4
+ require 'eac_templates/abstract/directory'
4
5
  require 'eac_templates/sources/fs_object'
5
- require 'eac_templates/variables/directory'
6
6
 
7
7
  module EacTemplates
8
8
  module Sources
9
- class Directory < ::EacTemplates::Sources::FsObject
10
- delegate :apply, :child, :children, :path, to: :applier
9
+ class Directory < ::EacTemplates::Abstract::Directory
10
+ include ::EacTemplates::Sources::FsObject
11
11
 
12
- # @return [Class]
13
- def applier_class
14
- ::EacTemplates::Variables::Directory
12
+ # @return [Hash<Pathname, Symbol>]
13
+ def children_basenames
14
+ r = {}
15
+ real_paths.each do |real_path|
16
+ real_path.children.each do |child|
17
+ next if r.key?(child.basename)
18
+
19
+ r[child.basename] = real_path_type(child)
20
+ end
21
+ end
22
+ r
15
23
  end
16
24
 
17
- # @param path [Pathname]
18
- # @return [Boolean]
19
- def select_path?(path)
20
- super && path.directory?
25
+ # @return [Pathname]
26
+ def real_path_type(path)
27
+ if path.file?
28
+ :file
29
+ elsif path.directory?
30
+ :directory
31
+ else
32
+ raise "Path \"#{path}\" is not a file nor a directory"
33
+ end
21
34
  end
22
35
  end
23
36
  end
@@ -1,24 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'eac_ruby_utils/core_ext'
4
+ require 'eac_templates/abstract/file'
4
5
  require 'eac_templates/sources/fs_object'
5
- require 'eac_templates/variables/file'
6
6
 
7
7
  module EacTemplates
8
8
  module Sources
9
- class File < ::EacTemplates::Sources::FsObject
10
- delegate :apply, :apply_to_file, :content, :path, :variables, to: :applier
11
-
12
- # @return [Class]
13
- def applier_class
14
- ::EacTemplates::Variables::File
15
- end
16
-
17
- # @param path [Pathname]
18
- # @return [Boolean]
19
- def select_path?(path)
20
- super && path.file?
21
- end
9
+ class File < ::EacTemplates::Abstract::File
10
+ include ::EacTemplates::Sources::FsObject
22
11
  end
23
12
  end
24
13
  end
@@ -1,14 +1,16 @@
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
5
 
5
6
  module EacTemplates
6
7
  module Sources
7
- class FsObject
8
- enable_abstract_methods
9
- enable_simple_cache
10
- common_constructor :source_set, :subpath do
11
- self.subpath = subpath.to_pathname
8
+ module FsObject
9
+ PATH_FOR_SEARCH_PREFIX = ::Pathname.new('')
10
+
11
+ common_concern do
12
+ enable_abstract_methods
13
+ enable_simple_cache
12
14
  end
13
15
 
14
16
  # @return [Boolean]
@@ -16,20 +18,18 @@ module EacTemplates
16
18
  real_paths.any?
17
19
  end
18
20
 
19
- protected
20
-
21
- # @return [Class]
22
- def applier_class
23
- raise_abstract_method __method__
21
+ # @return [Pathname]
22
+ def path
23
+ real_paths.first
24
24
  end
25
25
 
26
- # @return [EacTemplates::Variables::SourceFile]
27
- def applier_uncached
28
- raise "No #{self.class.name.downcase} found for \"#{subpath}\"" unless found?
29
-
30
- applier_class.new(real_paths.first)
26
+ # @return [Pathname]
27
+ def path_for_search_prefix
28
+ PATH_FOR_SEARCH_PREFIX
31
29
  end
32
30
 
31
+ protected
32
+
33
33
  # @return [Array<Pathname>]
34
34
  def real_paths_uncached
35
35
  source_set.included_paths.lazy.map { |source_single| source_single_search(source_single) }
@@ -39,13 +39,13 @@ module EacTemplates
39
39
  # @param path [Pathname]
40
40
  # @return [Boolean]
41
41
  def select_path?(path)
42
- path.present?
42
+ path.present? && path.send("#{type}?")
43
43
  end
44
44
 
45
45
  # @param source_single [EacTemplates::Sources::Single]
46
46
  # @return [Pathname, nil]
47
47
  def source_single_search(source_single)
48
- r = source_single.search(subpath)
48
+ r = source_single.search(path_for_search)
49
49
  select_path?(r) ? r : nil
50
50
  end
51
51
  end
@@ -4,6 +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
8
 
8
9
  module EacTemplates
9
10
  module Sources
@@ -17,13 +18,13 @@ module EacTemplates
17
18
  # @param subpath [Pathname]
18
19
  # @return [EacTemplates::Sources::Directory]
19
20
  def directory(subpath)
20
- ::EacTemplates::Sources::Directory.new(self, subpath)
21
+ ::EacTemplates::Sources::Directory.by_subpath(self, nil, subpath, source_set: self)
21
22
  end
22
23
 
23
24
  # @param subpath [Pathname]
24
25
  # @return [EacTemplates::Sources::Directory]
25
26
  def file(subpath)
26
- ::EacTemplates::Sources::File.new(self, subpath)
27
+ ::EacTemplates::Sources::File.by_subpath(self, nil, subpath, source_set: self)
27
28
  end
28
29
 
29
30
  def template(subpath, required = true)
@@ -46,8 +47,8 @@ module EacTemplates
46
47
  private
47
48
 
48
49
  def raise_template_not_found(subpath)
49
- raise "Template not found for subpath \"#{subpath}\"" \
50
- " (Included paths: #{included_paths.to_a.join(::File::PATH_SEPARATOR)})"
50
+ raise ::EacTemplates::Abstract::NotFoundError, 'Template not found for subpath ' \
51
+ "\"#{subpath}\" (Included paths: #{included_paths.to_a.join(::File::PATH_SEPARATOR)})"
51
52
  end
52
53
  end
53
54
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'eac_templates/variables/providers'
5
+
6
+ module EacTemplates
7
+ module Variables
8
+ class Content
9
+ VARIABLE_DELIMITER = ::Regexp.quote('%%')
10
+ VARIABLE_PATTERN = /#{VARIABLE_DELIMITER}([a-z0-9\._]*)#{VARIABLE_DELIMITER}/i.freeze
11
+
12
+ class << self
13
+ # @param path [Pathname]
14
+ # @return [EacTemplates::Variables::Content]
15
+ def from_file(path)
16
+ new(path.to_pathname.read)
17
+ end
18
+ end
19
+
20
+ enable_simple_cache
21
+ common_constructor :content
22
+
23
+ # +variables_provider+ A [Hash] or object which responds to +read_entry(entry_name)+.
24
+ def apply(variables_source)
25
+ variables_provider = ::EacTemplates::Variables::Providers.build(variables_source)
26
+ variables.inject(content) do |a, e|
27
+ a.gsub(variable_pattern(e), variables_provider.variable_value(e).to_s)
28
+ end
29
+ end
30
+
31
+ def apply_to_file(variables_source, output_file_path)
32
+ output_file_path.to_pathname.write(apply(variables_source))
33
+ end
34
+
35
+ private
36
+
37
+ def variables_uncached
38
+ content.scan(VARIABLE_PATTERN).map(&:first).map do |name|
39
+ sanitize_variable_name(name)
40
+ end.to_set
41
+ end
42
+
43
+ def sanitize_variable_name(variable_name)
44
+ variable_name.to_s.downcase
45
+ end
46
+
47
+ def variable_pattern(name)
48
+ /#{VARIABLE_DELIMITER}#{::Regexp.quote(name)}#{VARIABLE_DELIMITER}/i
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,16 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'eac_templates/abstract/not_found_error'
4
+ require 'eac_templates/abstract/directory'
3
5
  require 'eac_templates/variables/file'
4
6
  require 'eac_templates/variables/fs_object'
5
7
 
6
8
  module EacTemplates
7
9
  module Variables
8
10
  class Directory
9
- attr_reader :path
10
-
11
- def initialize(path)
12
- @path = path.is_a?(::Pathname) ? path : ::Pathname.new(path.to_s)
11
+ common_constructor :abstract_directory do
12
+ self.abstract_directory = ::EacTemplates::Abstract::Directory.assert(abstract_directory)
13
13
  end
14
+ delegate :path, to: :abstract_directory
14
15
 
15
16
  def apply(variables_source, directory)
16
17
  ::EacTemplates::Variables::FsObject.new(self, '.', directory, variables_source).apply
@@ -21,7 +22,8 @@ module EacTemplates
21
22
  return ::EacTemplates::Variables::File.new(child_path) if ::File.file?(child_path)
22
23
  return ::EacTemplates::Variables::Directory.new(child_path) if ::File.directory?(child_path)
23
24
 
24
- raise "Child \"#{subpath}\" from \"#{path}\" not found"
25
+ raise ::EacTemplates::Abstract::NotFoundError,
26
+ "Child \"#{subpath}\" from \"#{path}\" not found"
25
27
  end
26
28
 
27
29
  def children
@@ -1,49 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'eac_ruby_utils/core_ext'
4
+ require 'eac_templates/abstract/file'
5
+ require 'eac_templates/variables/content'
4
6
  require 'eac_templates/variables/providers'
5
7
 
6
8
  module EacTemplates
7
9
  module Variables
8
10
  class File
9
- VARIABLE_DELIMITER = ::Regexp.quote('%%')
10
- VARIABLE_PATTERN = /#{VARIABLE_DELIMITER}([a-z0-9\._]*)#{VARIABLE_DELIMITER}/i.freeze
11
-
12
11
  enable_simple_cache
13
- common_constructor :path do
14
- self.path = path.to_pathname
15
- end
16
-
17
- # +variables_provider+ A [Hash] or object which responds to +read_entry(entry_name)+.
18
- def apply(variables_source)
19
- variables_provider = ::EacTemplates::Variables::Providers.build(variables_source)
20
- variables.inject(content) do |a, e|
21
- a.gsub(variable_pattern(e), variables_provider.variable_value(e).to_s)
22
- end
23
- end
24
-
25
- def apply_to_file(variables_source, output_file_path)
26
- output_file_path.to_pathname.write(apply(variables_source))
12
+ common_constructor :abstract_file do
13
+ self.abstract_file = ::EacTemplates::Abstract::File.assert(abstract_file)
27
14
  end
15
+ delegate :path, to: :abstract_file
16
+ delegate :apply, :apply_to_file, :content, :variables, to: :content_applier
28
17
 
29
18
  private
30
19
 
31
- def variables_uncached
32
- content.scan(VARIABLE_PATTERN).map(&:first).map do |name|
33
- sanitize_variable_name(name)
34
- end.to_set
35
- end
36
-
37
- def content_uncached
38
- path.read
39
- end
40
-
41
- def sanitize_variable_name(variable_name)
42
- variable_name.to_s.downcase
43
- end
44
-
45
- def variable_pattern(name)
46
- /#{VARIABLE_DELIMITER}#{::Regexp.quote(name)}#{VARIABLE_DELIMITER}/i
20
+ # @return [EacTemplates::Variables::Content]
21
+ def content_applier_uncached
22
+ ::EacTemplates::Variables::Content.from_file(path)
47
23
  end
48
24
  end
49
25
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacTemplates
4
- VERSION = '0.4.0'
4
+ VERSION = '0.5.0'
5
5
  end