fedux_org-stdlib 0.6.47 → 0.6.48

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
  SHA1:
3
- metadata.gz: 1ece173128292a383a56c8d916b0e6aae47d5961
4
- data.tar.gz: f16e7f741547036b3bd0d60a9e8d623c602305d7
3
+ metadata.gz: 83b6bcc48108fd4ffbf7271496c08875e9fd8b38
4
+ data.tar.gz: 90370b2ddcdad236c1fe53915cdafa781c4aea3b
5
5
  SHA512:
6
- metadata.gz: b2362f46430bb0e926f7448b0cb2ec667b5d5b3a0514043a2ff189acdeb99467c14cce5f54ebce49c238961e0fd340fe83a59cf82a3ee79b8b51f134241ba0ed
7
- data.tar.gz: 85003a967218a9b182866e75f716f8b8e4d556c1f12f21714b0ee970401c4260cd52a8884bf8859add1009dc0e9c8af88db9bc8f272c1742c99a6cc521e63d23
6
+ metadata.gz: 73b8bbf86f9aa7c5be2e757882af824c831d3cbfa9f2400dfa8cbe14b8b607f711491843b9a65c16709358ec3c9a7dec1bd37ee56047d7ee65b2d09a6b7a0dee
7
+ data.tar.gz: f564ed4e1960a030b77a0006b393af5e7ec966ba87fd46a162e03470bbb7c8df0930a4d757b3361757c5a0a53a95205aaf433b3b2dfd02d8def8c6966a30bf74
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fedux_org-stdlib (0.6.46)
4
+ fedux_org-stdlib (0.6.47)
5
5
  activesupport
6
6
 
7
7
  GEM
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  require 'fedux_org_stdlib/require_files'
3
3
  require 'fedux_org_stdlib/file_template/exceptions'
4
- require 'fedux_org_stdlib/core_ext/array'
4
+ require 'fedux_org_stdlib/core_ext/array/list'
5
5
  require 'fedux_org_stdlib/logging/logger'
6
6
  require_library %w{ json active_support/core_ext/string/inflections }
7
7
 
@@ -0,0 +1,197 @@
1
+ # encoding: utf-8
2
+ require 'fedux_org_stdlib/require_files'
3
+ require 'fedux_org_stdlib/template_directory/exceptions'
4
+ require 'fedux_org_stdlib/core_ext/array/list'
5
+ require 'fedux_org_stdlib/logging/logger'
6
+ require_library %w{ json active_support/core_ext/string/inflections }
7
+
8
+ module FeduxOrgStdlib
9
+ # This class makes a template file available as an object. You can use
10
+ # whatever template language you prefer. It's up to you to compile the
11
+ # template with a suitable template parser.
12
+ #
13
+ # By default it will look for a suitable template file in the given order:
14
+ #
15
+ # 1. <current working directory>/templates/<template_directory>
16
+ # 2. $HOME/.config/<application_name>/templates/<template_directory>
17
+ # 3. $HOME/.<application_name>/templates/<template_directory>
18
+ # 4. /etc/<application_name>/templates/<template_directory>
19
+ #
20
+ # Please keep in mind
21
+ #
22
+ # * application_name: Module of your class, e.g. "MyApplication" becomes
23
+ # "my_application"
24
+ # * template_directory: Plural name of your class and "TemplateDirectory" strip
25
+ # off, e.g "ClientTemplateDirectory" becomes "clients.d"
26
+ #
27
+ # Most conventions defined by me are implemented as separate methods. If one convention
28
+ # is not suitable for your use case, just overwrite the method.
29
+ #
30
+ # If you prefer to use a different path to the template file or name of the
31
+ # template file one of the following methods needs to be overwritten:
32
+ #
33
+ # * template_directory
34
+ # * template_directory_basename
35
+ # * application_name
36
+ #
37
+ # If you want the class to look for your template file at a different place
38
+ # overwrite the following method
39
+ #
40
+ # * allowed_template_directory_paths
41
+ #
42
+ # Below you find some examples for the usage of the class:
43
+ #
44
+ # @example Create template with one writer and reader
45
+ # module MyApplication
46
+ # class ClientTemplateDirectory < FileTemplate
47
+ # end
48
+ # end
49
+ class TemplateDirectory
50
+
51
+ attr_reader :working_directory, :logger, :directory, :template_files
52
+
53
+ # Create a new instance of template
54
+ #
55
+ # It tries to find a suitable template directory. If it doesn't find one
56
+ # the template is empty
57
+ #
58
+ # @param [String] directory
59
+ # Path where template directory is stored.
60
+ #
61
+ # @raise [Exceptions::TemplateFileNotReadable]
62
+ # If an avaiable template directory could not be read by the template engine
63
+ #
64
+ # @return [AppTemplate]
65
+ # The template instance. If the resulting data structure created by the
66
+ # template_engine does not respond to `:[]` an empty template object will be
67
+ # created.
68
+ def initialize(
69
+ directory: nil,
70
+ logger: FeduxOrgStdlib::Logging::Logger.new,
71
+ working_directory: Dir.getwd,
72
+ output_directory: nil
73
+ )
74
+ @logger = logger
75
+ @working_directory = working_directory
76
+
77
+ @directory ||= available_template_directory
78
+
79
+ fail Exceptions::NoTemplateDirectoryFound, "No template directory found at #{allowed_template_directory_paths.to_list}, therefor I'm stop working as there are methods which depend on an available template directory path." unless @directory
80
+
81
+ begin
82
+ @template_files = Dir.glob(File.join(@directory, '**', '*')).keep_if { |o| FileTest.file? o }
83
+ rescue StandardError => e
84
+ fail Exceptions::TemplateDirectoryNotReadable, JSON.dump(message: e.message, file: @directory)
85
+ end
86
+ end
87
+
88
+ # Return the path to the preferred template file
89
+ # @return [String]
90
+ # The path to the preferred template file
91
+ def preferred_template_directory
92
+ allowed_template_directory_paths[1]
93
+ end
94
+
95
+ private
96
+
97
+ # The name of the template file
98
+ #
99
+ # @return [String]
100
+ # The name of the template file. It defaults to `<template_directory_basename>.yaml`. If
101
+ # you want to use a different file name you need to overwrite this
102
+ # method.
103
+ def template_directory
104
+ "#{template_directory_basename}#{template_directory_suffix}"
105
+ end
106
+
107
+ # The suffix of the template file
108
+ #
109
+ # @return [String]
110
+ # The suffix of the template file
111
+ def template_directory_suffix
112
+ '.d'
113
+ end
114
+
115
+ # The base name of the template
116
+ #
117
+ # @return [String]
118
+ # This one returns the base name of the template file (without the file
119
+ # extension). It uses the class name of the template class
120
+ #
121
+ # @example Determine the base name of the template
122
+ #
123
+ # class ClientTemplate; end
124
+ #
125
+ # This will result in `client` as base name for the template file.
126
+ def template_directory_basename
127
+ unless (name = class_name.sub(/TemplateDirectory/, '').underscore.pluralize).blank?
128
+ return name
129
+ end
130
+
131
+ fail Exceptions::ClassNameIsMissing, JSON.dump(klass: class_name)
132
+ end
133
+
134
+ # The name of your application
135
+ #
136
+ # @return [String]
137
+ # This will strip of the class part of fully qualified class name and
138
+ # converted it to a path.
139
+ #
140
+ # @example Determine application name
141
+ #
142
+ # class MyApplication::MyTemplate; end
143
+ #
144
+ # This will be converted to
145
+ #
146
+ # my_application
147
+ def application_name
148
+ module_name.underscore
149
+ end
150
+
151
+ # The paths where to look for the template file
152
+ #
153
+ # @return [Array]
154
+ # A list of paths where the template object should look for its template
155
+ # file.
156
+ def allowed_template_directory_paths
157
+ paths = []
158
+
159
+ paths << resolve_path(working_directory, 'templates', template_directory)
160
+ paths << resolve_path('~', '.config', application_name, 'templates', template_directory)
161
+ paths << resolve_path('~', format('.%s', application_name), 'templates', template_directory)
162
+ paths << resolve_path('/etc', application_name, 'templates', template_directory)
163
+ paths << resolve_path(fallback_template_directory, template_directory) if fallback_template_directory
164
+
165
+ paths
166
+ end
167
+
168
+ def resolve_path(*path)
169
+ ::File.expand_path(::File.join(*path))
170
+ end
171
+
172
+
173
+ # Use this path as fall back path
174
+ def fallback_template_directory; end
175
+
176
+ def class_name
177
+ self.class.name.to_s.demodulize
178
+ end
179
+
180
+ def module_name
181
+ self.class.to_s.deconstantize
182
+ end
183
+
184
+ def available_template_directory
185
+ allowed_template_directory_paths.each do |p|
186
+ object = Dir.glob("#{p}/**/*").keep_if { |o| ::FileTest.file?(o) }.first
187
+
188
+ next if object.blank?
189
+ return p if object
190
+ end
191
+ end
192
+
193
+ def self.reserved_key_words
194
+ (methods | instance_methods | private_methods | private_instance_methods ) - (Class.methods | Class.private_methods ) | [:to_s]
195
+ end
196
+ end
197
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ module FeduxOrgStdlib
3
+ class TemplateDirectory
4
+ module Exceptions
5
+ # Found config file is not readable
6
+ class TemplateDirectoryNotReadable < StandardError; end
7
+
8
+ # No allowed config file could be found
9
+ class NoTemplateDirectoryFound < StandardError; end
10
+
11
+ # If no module is given on class
12
+ class NamespaceIsMissing < StandardError; end
13
+
14
+ # If no class name is present
15
+ class ClassNameIsMissing < StandardError; end
16
+
17
+ # If one tries to define an option name which is forbbiden
18
+ class OptionNameForbidden < StandardError; end
19
+ end
20
+ end
21
+ end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
  # FeduxOrgStdlib
3
3
  module FeduxOrgStdlib
4
- VERSION = '0.6.47'
4
+ VERSION = '0.6.48'
5
5
  end
@@ -0,0 +1,139 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'fedux_org_stdlib/template_directory'
4
+
5
+ RSpec.describe TemplateDirectory do
6
+
7
+ context '#preferred_template_directory' do
8
+ it 'has a default template file which is the preferred place to store the template' do
9
+ with_environment 'HOME' => working_directory do
10
+ create_file '.config/my_application/templates/tests.d/test.tt'
11
+
12
+ template_klass = Class.new(TemplateDirectory) do
13
+ def class_name
14
+ 'TestTemplateDirectory'
15
+ end
16
+
17
+ def module_name
18
+ 'MyApplication'
19
+ end
20
+ end
21
+
22
+ template = template_klass.new
23
+ expect(template.preferred_template_directory).to eq File.expand_path('~/.config/my_application/templates/tests.d')
24
+ end
25
+ end
26
+
27
+ it 'works with nested module names' do
28
+ with_environment 'HOME' => working_directory do
29
+ create_file '.config/my_application/my_sub/templates/tests.d/test.tt'
30
+
31
+ template_klass = Class.new(TemplateDirectory) do
32
+ def class_name
33
+ 'TestTemplateDirectory'
34
+ end
35
+
36
+ def module_name
37
+ 'MyApplication::MySub'
38
+ end
39
+ end
40
+
41
+ template = template_klass.new
42
+ expect(template.preferred_template_directory).to eq File.expand_path('~/.config/my_application/my_sub/templates/tests.d')
43
+ end
44
+ end
45
+ end
46
+
47
+ context 'template files' do
48
+ it 'looks at ~/.config/my_application/templates/tests.d/test.tt' do
49
+ with_environment 'HOME' => working_directory do
50
+ file = create_file '.config/my_application/templates/tests.d/test.tt', <<-EOS.strip_heredoc
51
+ <%= hello world %>
52
+ EOS
53
+
54
+ template_klass = Class.new(TemplateDirectory) do
55
+ def class_name
56
+ 'TestTemplateDirectory'
57
+ end
58
+
59
+ def module_name
60
+ 'MyApplication'
61
+ end
62
+ end
63
+
64
+ template = template_klass.new
65
+ expect(template.template_files).to include file
66
+ end
67
+ end
68
+
69
+ it 'looks at ~/.my_application/templates/tests.d/test.tt' do
70
+ with_environment 'HOME' => working_directory do
71
+ file = create_file '.my_application/templates/tests.d/test.tt', <<-EOS.strip_heredoc
72
+ <%= hello world %>
73
+ EOS
74
+
75
+ template_klass = Class.new(TemplateDirectory) do
76
+ def class_name
77
+ 'TestTemplateDirectory'
78
+ end
79
+
80
+ def module_name
81
+ 'MyApplication'
82
+ end
83
+ end
84
+
85
+ template = template_klass.new
86
+ expect(template.template_files).to include file
87
+ end
88
+ end
89
+
90
+ it 'returns templates in subdirectories as well' do
91
+ with_environment 'HOME' => working_directory do
92
+ file = create_file '.my_application/templates/tests.d/blub/test.tt', <<-EOS.strip_heredoc
93
+ <%= hello world %>
94
+ EOS
95
+
96
+ template_klass = Class.new(TemplateDirectory) do
97
+ def class_name
98
+ 'TestTemplateDirectory'
99
+ end
100
+
101
+ def module_name
102
+ 'MyApplication'
103
+ end
104
+ end
105
+
106
+ template = template_klass.new
107
+ expect(template.template_files).to include file
108
+ end
109
+ end
110
+ end
111
+
112
+ context '#template_files' do
113
+ it 'returns template_files in template directory' do
114
+ with_environment 'HOME' => working_directory do
115
+ file1 = create_file '.my_application/templates/tests.d/test1.tt', <<-EOS.strip_heredoc
116
+ <%= hello world %>
117
+ EOS
118
+
119
+ file2 = create_file '.my_application/templates/tests.d/test2.tt', <<-EOS.strip_heredoc
120
+ <%= hello world %>
121
+ EOS
122
+
123
+ template_klass = Class.new(TemplateDirectory) do
124
+ def class_name
125
+ 'TestTemplateDirectory'
126
+ end
127
+
128
+ def module_name
129
+ 'MyApplication'
130
+ end
131
+ end
132
+
133
+ template = template_klass.new
134
+ expect(template.template_files).to include file1
135
+ expect(template.template_files).to include file2
136
+ end
137
+ end
138
+ end
139
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fedux_org-stdlib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.47
4
+ version: 0.6.48
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max Meyer
@@ -126,6 +126,8 @@ files:
126
126
  - lib/fedux_org_stdlib/require_files.rb
127
127
  - lib/fedux_org_stdlib/shell_language_detector.rb
128
128
  - lib/fedux_org_stdlib/shell_language_detector/language.rb
129
+ - lib/fedux_org_stdlib/template_directory.rb
130
+ - lib/fedux_org_stdlib/template_directory/exceptions.rb
129
131
  - lib/fedux_org_stdlib/version.rb
130
132
  - lib/fedux_org_stdlib/version_management/exceptions.rb
131
133
  - lib/fedux_org_stdlib/version_management/library_builder.rb
@@ -179,6 +181,7 @@ files:
179
181
  - spec/support/reporting.rb
180
182
  - spec/support/rspec.rb
181
183
  - spec/support/string.rb
184
+ - spec/template_directory_spec.rb
182
185
  - spec/template_file_spec.rb
183
186
  - spec/version_management/library_builder_spec.rb
184
187
  - spec/version_management/ruby_library_spec.rb
@@ -251,6 +254,7 @@ test_files:
251
254
  - spec/support/reporting.rb
252
255
  - spec/support/rspec.rb
253
256
  - spec/support/string.rb
257
+ - spec/template_directory_spec.rb
254
258
  - spec/template_file_spec.rb
255
259
  - spec/version_management/library_builder_spec.rb
256
260
  - spec/version_management/ruby_library_spec.rb