eac_config 0.1.0 → 0.2.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: 84f6dfb659545033cf9bd7ad9514ef8328ec32c13af6d3534c8cb884e716a3ee
4
- data.tar.gz: a8fa8b10e98000122b2a9e479443d0975d55decf95a060474eaad7ecfa8f4dee
3
+ metadata.gz: fd6a6d3c5ab71a03c476e9d3237623e6d9911128c27301c73dcaf3fdc3e49e33
4
+ data.tar.gz: fd1d1139b115073c1f7bcec332dcdbbcd92c9ed7825acff34eaa7c3b76747e04
5
5
  SHA512:
6
- metadata.gz: 2d4c70a6acb8e033017a646ae5c1c1c3afe1b470fabcb194c8c8177fba8229d17abf13a504e58adf49983161a457a0d11b83ae1bc49a4917f80412672a9f518f
7
- data.tar.gz: 383d7fb5e5812d1491dc73104c679b78b25c16b3e353591c3c37b2f467a3e1bd5f84de346bdb79c044a829dea0f7e32c898508dc1bd12bec42e290079efa74ca
6
+ metadata.gz: c29cc31ab4a5c6a834af31f12986c0e8e3b862d6603d117b7a3ca5792465636693542ae13417764c23fc2b6cfdd834bda7db0915d419157b329aec836fc7d2b2
7
+ data.tar.gz: 2390811743a6a997ee6d0ec2bba40ca5f27222ac14d352a51eb508e0e345c3f2190a12105bb3e9cfd63dc45052cdbe41d0c3c4df2dcf319103ec00f16db162a1
@@ -7,6 +7,10 @@ module EacConfig
7
7
  PART_SEPARATOR = '.'
8
8
 
9
9
  class << self
10
+ def assert(source)
11
+ source.is_a?(self) ? source : new(build_parts(source))
12
+ end
13
+
10
14
  def build_parts(source)
11
15
  return validate_parts!(source.split(PART_SEPARATOR)) if source.is_a?(::String)
12
16
  return validate_parts!(source.flat_map { |part| build_parts(part) }) if
@@ -26,8 +30,8 @@ module EacConfig
26
30
 
27
31
  attr_reader :parts
28
32
 
29
- def initialize(*parts)
30
- @parts = self.class.build_parts(parts).freeze
33
+ def initialize(parts)
34
+ @parts = parts.to_a.freeze
31
35
  end
32
36
  end
33
37
  end
@@ -10,13 +10,23 @@ module EacConfig
10
10
 
11
11
  private
12
12
 
13
+ def result_from_load_path_uncached
14
+ node.recursive_loaded_nodes.lazy.map { |loaded_node| loaded_node.entry(path) }.find(&:found?)
15
+ end
16
+
17
+ def result_from_self_uncached
18
+ return nil unless paths_hash.key?(to_paths_hash_key)
19
+
20
+ ::EacConfig::Entry.new(node, path, true, paths_hash.fetch(to_paths_hash_key))
21
+ end
22
+
23
+ def result_not_found_uncached
24
+ ::EacConfig::Entry.new(nil, path, false, nil)
25
+ end
26
+
13
27
  # @return [EacConfig::Entry]
14
28
  def result_uncached
15
- if paths_hash.key?(to_paths_hash_key)
16
- ::EacConfig::Entry.new(node, path, true, paths_hash.fetch(to_paths_hash_key))
17
- else
18
- ::EacConfig::Entry.new(nil, path, false, nil)
19
- end
29
+ result_from_self || result_from_load_path || result_not_found
20
30
  end
21
31
 
22
32
  # @return [EacConfig::PathsHash]
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EacConfig
6
+ class LoadNodesSearch
7
+ common_constructor :root_node do
8
+ add_next_pending until pending.empty?
9
+ end
10
+
11
+ def result
12
+ added
13
+ end
14
+
15
+ private
16
+
17
+ def added
18
+ @added ||= []
19
+ end
20
+
21
+ def add_next_pending
22
+ current = pending.pop
23
+ current.self_loaded_nodes.each do |loaded_node|
24
+ next if added.include?(loaded_node)
25
+
26
+ added << loaded_node
27
+ pending.push(loaded_node)
28
+ end
29
+ end
30
+
31
+ def pending
32
+ @pending ||= begin
33
+ r = Queue.new
34
+ r.push(root_node)
35
+ r
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_config/entry_path'
4
+ require 'eac_config/load_nodes_search'
5
+ require 'eac_ruby_utils/core_ext'
6
+
7
+ module EacConfig
8
+ module Node
9
+ common_concern do
10
+ enable_abstract_methods
11
+ include ::Comparable
12
+ end
13
+
14
+ LOAD_PATH_ENTRY_PATH = ::EacConfig::EntryPath.assert(%w[load_path])
15
+ LOAD_PATH_PATH_SEPARATOR = ':'
16
+
17
+ def entry(path)
18
+ ::EacConfig::EntrySearch.new(self, ::EacConfig::EntryPath.assert(path)).result
19
+ end
20
+
21
+ # @return [Addressable::URI]
22
+ def url
23
+ raise_abstract_method(__method__)
24
+ end
25
+
26
+ # @return [Array<EacConfig::Node>]
27
+ def self_loaded_nodes
28
+ ::EacConfig::EntrySearch.new(self, ::EacConfig::EntryPath.assert(LOAD_PATH_ENTRY_PATH))
29
+ .result_from_self.if_present([]) do |e|
30
+ e.value.split(LOAD_PATH_PATH_SEPARATOR).map { |node_path| load_node(node_path) }
31
+ end
32
+ end
33
+
34
+ # @return [Array<EacConfig::Node>]
35
+ def recursive_loaded_nodes
36
+ ::EacConfig::LoadNodesSearch.new(self).result
37
+ end
38
+
39
+ private
40
+
41
+ def load_node(node_path)
42
+ self.class.new(node_path.to_pathname.expand_path(path.parent))
43
+ end
44
+ end
45
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacConfig
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
@@ -1,16 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'addressable'
3
4
  require 'eac_config/entry'
4
5
  require 'eac_config/entry_search'
5
- require 'eac_config/readable_node'
6
- require 'eac_config/writeable_node'
6
+ require 'eac_config/node'
7
7
  require 'eac_ruby_utils/core_ext'
8
8
  require 'eac_ruby_utils/yaml'
9
9
 
10
10
  module EacConfig
11
11
  class YamlFileNode
12
- include ::EacConfig::ReadableNode
13
- include ::EacConfig::WriteableNode
12
+ include ::EacConfig::Node
14
13
 
15
14
  common_constructor :path do
16
15
  self.path = path.to_pathname
@@ -20,8 +19,8 @@ module EacConfig
20
19
  @data ||= ::EacRubyUtils::Yaml.load_file(path)
21
20
  end
22
21
 
23
- def entry(*path)
24
- ::EacConfig::EntrySearch.new(self, ::EacConfig::EntryPath.new(*path)).result
22
+ def url
23
+ ::Addressable::URI.parse("file://#{path.expand_path}")
25
24
  end
26
25
  end
27
26
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eac_config
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.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: 2021-05-14 00:00:00.000000000 Z
11
+ date: 2021-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: addressable
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: eac_ruby_utils
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -48,14 +62,13 @@ files:
48
62
  - lib/eac_config/entry.rb
49
63
  - lib/eac_config/entry_path.rb
50
64
  - lib/eac_config/entry_search.rb
51
- - lib/eac_config/manager.rb
65
+ - lib/eac_config/load_nodes_search.rb
66
+ - lib/eac_config/node.rb
52
67
  - lib/eac_config/paths_hash.rb
53
68
  - lib/eac_config/paths_hash/entry_key_error.rb
54
69
  - lib/eac_config/paths_hash/node.rb
55
70
  - lib/eac_config/paths_hash/path_search.rb
56
- - lib/eac_config/readable_node.rb
57
71
  - lib/eac_config/version.rb
58
- - lib/eac_config/writeable_node.rb
59
72
  - lib/eac_config/yaml_file_node.rb
60
73
  homepage:
61
74
  licenses: []
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/core_ext'
4
-
5
- module EacConfig
6
- class Manager
7
- common_constructor :root_node
8
-
9
- # @return [EacConfig::Entry]
10
- def entry(*parts)
11
- root_node.entry(*parts)
12
- end
13
- end
14
- end
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module EacConfig
4
- module ReadableNode
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module EacConfig
4
- module WriteableNode
5
- end
6
- end