evt-settings 1.0.0.0 → 2.1.1.2

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: 6b662f4360590c38fc8b3a371fc338116973a0b7165778d739c8a46c1a3ddd06
4
- data.tar.gz: 75aced59eb4a2452434a06463d2f55fbe83d33f25d13058ab2b2d999ca377778
3
+ metadata.gz: f63d7a57242b5c276a1b82330875c9b44a8c3d3d3e086620f0557f9451eb91d9
4
+ data.tar.gz: 8997b34df92c4bebae15a97d7911e8d7cb3c7dff3bc92b6ec2fcd1ccea96d7d9
5
5
  SHA512:
6
- metadata.gz: ef866a762a34fa31311135ad85835404789d3cc8d3c3dfed71b9616d4cb13ca977130ec48c558f63ad9c4b8ad1f4729ed248112eb0ffeaa6df215341125f24b7
7
- data.tar.gz: 1d169da8fbc126cdedcadc971d94b1179a6b93384bef0a4377149e3546de7b0ce03a4503e4769e28e1a2d216a76132300acd4e73254b7e92f797c1802c76e636
6
+ metadata.gz: 8a9cc43cd6e9c3f9e51d279f3cd2788101793db84639ad0045647ffbe324a4b16135789f94cb61aa21ffdfc8bb06ea73be1de7067992c7b5953727fda4c01b2f
7
+ data.tar.gz: 0075160e16ea5987eb90093ca692722c59840d67a04326e3a9834b05710fa1a68627131db1d04391222fd8ba2bc77f8f72b277ca56cbe15c761a9b1355c7dc0d
@@ -1,14 +1,12 @@
1
1
  require 'pathname'
2
2
  require 'json'
3
3
 
4
- require 'log'
5
4
  require 'casing'
6
5
  require 'attribute'
7
- require 'confstruct'
8
6
 
9
- require 'settings/log'
10
- require 'settings/data_source/data_source'
7
+ require 'settings/data_source'
11
8
  require 'settings/data_source/hash'
9
+ require 'settings/data_source/env'
12
10
  require 'settings/data_source/file'
13
11
  require 'settings/data_source/build'
14
12
  require 'settings/registry'
@@ -1,3 +1,4 @@
1
1
  require 'settings/controls/subject'
2
2
  require 'settings/controls/data_source'
3
+ require 'settings/controls/data'
3
4
  require 'settings/controls/settings'
@@ -0,0 +1,44 @@
1
+ class Settings
2
+ module Controls
3
+ module Data
4
+ module Flat
5
+ module Single
6
+ def self.example
7
+ {
8
+ 'some_setting' => 'some value'
9
+ }
10
+ end
11
+ end
12
+
13
+ module Multiple
14
+ def self.example
15
+ {
16
+ 'some_setting' => 'some value',
17
+ 'some_other_setting' => 'some other value',
18
+ }
19
+ end
20
+ end
21
+ end
22
+
23
+ module Hierarchical
24
+ def self.example
25
+ {
26
+ 'some_namespace' => {
27
+ 'some_setting' => 'some value'
28
+ }
29
+ }
30
+ end
31
+ end
32
+
33
+ module SymbolKeys
34
+ def self.example
35
+ {
36
+ :some_namespace => {
37
+ :some_setting => 'some value'
38
+ }
39
+ }
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -7,9 +7,17 @@ class Settings
7
7
  end
8
8
 
9
9
  def self.data
10
- {
11
- some_setting: 'some value'
12
- }
10
+ Data::Flat::Single.example
11
+ end
12
+
13
+ module SymbolKeys
14
+ def self.example
15
+ ::Settings::DataSource::Hash.build(data)
16
+ end
17
+
18
+ def self.data
19
+ Data::SymbolKeys.example
20
+ end
13
21
  end
14
22
  end
15
23
 
@@ -3,84 +3,44 @@ class Settings
3
3
  module Settings
4
4
  module SettingAttribute
5
5
  def self.example
6
- ::Settings.new(data)
6
+ ::Settings.build(data)
7
7
  end
8
8
 
9
9
  def self.data
10
- {
11
- "some_setting" => "some value"
12
- }
10
+ Data::Flat::Single.example
13
11
  end
14
12
  end
15
13
 
16
- module SettingAttributes
14
+ module PartialMatch
17
15
  def self.example
18
- ::Settings.new(data)
16
+ ::Settings.build(data)
19
17
  end
20
18
 
21
19
  def self.data
22
- {
23
- "some_setting" => "some value",
24
- "some_other_setting" => "some other value",
25
- "yet_another_setting" => "yet another value"
26
- }
27
- end
28
-
29
- module Partial
30
- def self.example
31
- ::Settings.new(data)
32
- end
33
-
34
- def self.data
35
- {
36
- "some_setting" => "some value",
37
- "some_other_setting" => "some other value",
38
- }
39
- end
20
+ Data::Flat::Multiple.example
40
21
  end
41
22
  end
42
23
 
43
- module AccessorAttribute
24
+ module Namespace
44
25
  def self.example
45
- ::Settings.new(data)
26
+ ::Settings.build(data)
46
27
  end
47
28
 
48
29
  def self.data
49
- {
50
- "some_accessor_attribute" => "some accessor value"
51
- }
30
+ Data::Hierarchical.example
52
31
  end
53
32
  end
54
33
 
55
- module Namespace
34
+ module AccessorAttribute
56
35
  def self.example
57
- ::Settings.new(data)
36
+ ::Settings.build(data)
58
37
  end
59
38
 
60
39
  def self.data
61
40
  {
62
- "some_namespace" => {
63
- "some_setting" => "some value"
64
- }
41
+ 'some_accessor_attribute' => 'some accessor value'
65
42
  }
66
43
  end
67
-
68
- module Override
69
- def self.example
70
- s = ::Settings.build(Namespace.data)
71
- s.override(data)
72
- s
73
- end
74
-
75
- def self.data
76
- {
77
- "some_namespace" => {
78
- "some_setting" => "some overridden value",
79
- "some_other_setting" => "some other value"
80
- }
81
- }
82
- end
83
- end
84
44
  end
85
45
  end
86
46
  end
@@ -1,11 +1,15 @@
1
1
  class Settings
2
2
  class DataSource
3
- include Log::Dependency
4
-
5
3
  attr_reader :source
6
4
 
7
5
  def initialize(source)
8
6
  @source = source
9
7
  end
8
+
9
+ def self.build(source=nil)
10
+ source = canonize(source) if respond_to? :canonize
11
+
12
+ new(source)
13
+ end
10
14
  end
11
15
  end
@@ -10,6 +10,7 @@ class Settings
10
10
  def self.type(input=nil)
11
11
  return Settings::DataSource::Hash if input.is_a?(::Hash)
12
12
  return Settings::DataSource::File if input.is_a?(String) || input.nil?
13
+ return Settings::DataSource::Env if input.instance_of?(Object)
13
14
 
14
15
  raise Settings::Error, "Input is not supported: #{input}"
15
16
  end
@@ -0,0 +1,11 @@
1
+ class Settings
2
+ class DataSource
3
+ class Env < DataSource
4
+ def get_data
5
+ source.map do |k, v|
6
+ [k.downcase, v]
7
+ end.to_h
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,22 +1,14 @@
1
1
  class Settings
2
2
  class DataSource
3
3
  class File < DataSource
4
- def self.build(source=nil)
5
- canonical = canonical(source)
6
- validate(canonical)
7
-
8
- new(canonical)
9
- end
10
-
11
- def self.canonical(source)
12
- logger.trace { "Canonizing the file source (#{source})" }
4
+ def self.canonize(source)
5
+ canonized_filepath = canonize_filepath(source)
6
+ validate(canonized_filepath)
13
7
 
14
- canonize(source).tap do |instance|
15
- logger.debug { "Canonized the file source (#{source})" }
16
- end
8
+ canonized_filepath
17
9
  end
18
10
 
19
- def self.canonize(source)
11
+ def self.canonize_filepath(source)
20
12
  return default_filepath if source.nil?
21
13
  return source if full_path?(source)
22
14
 
@@ -59,58 +51,32 @@ class Settings
59
51
  end
60
52
 
61
53
  def self.validate(pathname)
62
- logger.trace { "Validating the pathname (#{pathname})" }
63
-
64
54
  pathname = Pathname.new(pathname)
65
55
 
66
56
  unless pathname.file?
67
- msg = "Settings cannot be read from #{pathname}. The file doesn't exist."
68
- logger.error { msg }
69
- raise Settings::Error, msg
57
+ raise Settings::Error, "Settings cannot be read from #{pathname}. The file doesn't exist."
70
58
  end
71
-
72
- logger.trace { "Validated the pathname (#{pathname})" }
73
- end
74
-
75
- def self.logger
76
- @logger ||= Log.get(self)
77
59
  end
78
60
 
79
61
  def get_data
80
- logger.trace { "Reading file: #{source}" }
81
62
  file = ::File.open(source)
82
- data = JSON.load(file).tap do
83
- logger.debug { "Read file: #{source}" }
84
- end
85
63
 
86
- data = Casing::Underscore.(data)
64
+ data = JSON.load(file)
87
65
 
88
66
  hash_data_source = Hash.build data
89
67
  hash_data_source.get_data
90
68
  end
91
69
 
92
70
  module Defaults
93
- def self.logger
94
- @logger ||= Log.get(self)
95
- end
96
-
97
71
  def self.filename
98
- default_file = 'settings.json'
99
- logger.debug { "Using the default settings file name (#{default_file})" }
100
- default_file
72
+ 'settings.json'
101
73
  end
102
74
  end
103
75
 
104
76
  module Directory
105
77
  module Defaults
106
- def self.logger
107
- @logger ||= Log.get(self)
108
- end
109
-
110
78
  def self.pathname
111
- default_dir = Dir.pwd
112
- logger.debug { "Using the working directory default settings directory (#{default_dir})" }
113
- default_dir
79
+ Dir.pwd
114
80
  end
115
81
  end
116
82
  end
@@ -1,18 +1,27 @@
1
1
  class Settings
2
2
  class DataSource
3
3
  class Hash < DataSource
4
- def self.logger
5
- @logger ||= Log.get(self)
4
+ def get_data
5
+ AssureStringKeys.(source)
6
6
  end
7
7
 
8
- def self.build(source)
9
- new(source)
10
- end
8
+ module AssureStringKeys
9
+ def self.call(data)
10
+ new_data = {}
11
11
 
12
- def get_data
13
- logger.trace { "Converting the raw source data to Confstruct" }
14
- Confstruct::Configuration.new(source).tap do |instance|
15
- logger.debug { "Converted the raw source data to Confstruct" }
12
+ data.each do |key, value|
13
+ new_key = key.to_s
14
+
15
+ if value.is_a?(::Hash)
16
+ new_value = self.(value)
17
+ else
18
+ new_value = value
19
+ end
20
+
21
+ new_data[new_key] = new_value
22
+ end
23
+
24
+ new_data
16
25
  end
17
26
  end
18
27
  end
@@ -3,10 +3,6 @@ class Settings
3
3
  module Assignment
4
4
  extend self
5
5
 
6
- def logger
7
- @logger ||= Log.get(self)
8
- end
9
-
10
6
  def assign(receiver, attribute, value, strict=false)
11
7
  settable = assure_settable(receiver, attribute, strict)
12
8
  if settable
@@ -17,11 +13,7 @@ class Settings
17
13
  end
18
14
 
19
15
  def assign_value(receiver, attribute, value)
20
- logger.trace { "Assigning to #{attribute}" }
21
- receiver.public_send("#{attribute}=", value).tap do
22
- logger.debug { "Assigned to #{attribute}" }
23
- logger.debug(tag: :data) { "#{attribute}: #{value}" }
24
- end
16
+ receiver.public_send("#{attribute}=", value)
25
17
  end
26
18
 
27
19
  def setting?(receiver, attribute)
@@ -37,40 +29,22 @@ class Settings
37
29
  :"#{attribute.to_s}=" unless attribute.to_s.end_with? '='
38
30
  end
39
31
 
40
- def digest(receiver, attribute, strict)
41
- content = []
42
- content << "Attribute: #{attribute}" if attribute
43
- content << "Receiver: #{receiver.class.name}"
44
- strict = "<not set>" if strict.nil?
45
- content << "Strict: #{strict}"
46
- content.join ', '
47
- end
48
-
49
32
  module Object
50
33
  extend Assignment
51
34
 
52
- def logger
53
- @logger ||= Log.get(self)
54
- end
55
-
56
35
  def self.assure_settable(receiver, attribute, strict=true)
57
- logger.trace { "Approving attribute (#{digest(receiver, attribute, strict)})" }
58
-
59
36
  if strict
60
37
  setting = setting?(receiver, attribute)
61
38
  unless setting
62
- logger.warn { "Can't set \"#{attribute}\". It isn't a setting of #{receiver.class.name}." }
63
39
  return false
64
40
  end
65
41
  end
66
42
 
67
43
  assignable = assignable? receiver, attribute
68
44
  unless assignable
69
- logger.warn { "Can't set \"#{attribute}\". It isn't assignable to #{receiver.class.name}." }
70
45
  return false
71
46
  end
72
47
 
73
- logger.debug { "\"#{attribute}\" can be set" }
74
48
  true
75
49
  end
76
50
  end
@@ -78,28 +52,19 @@ class Settings
78
52
  module Attribute
79
53
  extend Assignment
80
54
 
81
- def logger
82
- @logger ||= Log.get(self)
83
- end
84
-
85
55
  def self.assure_settable(receiver, attribute, strict=true)
86
56
  if strict
87
57
  setting = setting? receiver, attribute
88
58
  unless setting
89
- msg = "Can't set \"#{attribute}\". It isn't a setting of #{receiver.class.name}."
90
- logger.error { msg }
91
- raise msg
59
+ raise "Can't set \"#{attribute}\". It isn't a setting of #{receiver.class.name}."
92
60
  end
93
61
  end
94
62
 
95
- assignable = assignable? receiver, attribute
63
+ assignable = assignable?(receiver, attribute)
96
64
  unless assignable
97
- msg = "Can't set \"#{attribute}\". It isn't assignable to #{receiver.class.name}."
98
- logger.error { msg }
99
- raise msg
65
+ raise "Can't set \"#{attribute}\". It isn't assignable to #{receiver.class.name}."
100
66
  end
101
67
 
102
- logger.debug { "\"#{attribute}\" can be set" }
103
68
  true
104
69
  end
105
70
  end
@@ -2,13 +2,8 @@ class Settings
2
2
  module Setting
3
3
  module Macro
4
4
  def setting_macro(attribute)
5
- logger = Log.get(self)
6
-
7
- logger.trace { "Defining setting attribute: #{attribute}" }
8
5
  Attribute::Define.(self, attribute, :accessor)
9
- Settings::Registry.register(self, attribute).tap do
10
- logger.debug { "Defined setting attribute: #{attribute}" }
11
- end
6
+ Settings::Registry.register(self, attribute)
12
7
  end
13
8
  alias :setting :setting_macro
14
9
  end
@@ -1,18 +1,12 @@
1
1
  class Settings
2
2
  class Error < RuntimeError; end
3
3
 
4
- include Log::Dependency
5
-
6
4
  attr_reader :data
7
5
 
8
6
  def initialize(data)
9
7
  @data = data
10
8
  end
11
9
 
12
- def self.logger
13
- @logger ||= Log.get(self)
14
- end
15
-
16
10
  def self.build(source=nil)
17
11
  source ||= implementer_source
18
12
 
@@ -26,35 +20,14 @@ class Settings
26
20
  end
27
21
 
28
22
  def self.implementer_source
29
- logger.trace { "Getting data source from the implementer" }
30
-
31
- unless self.respond_to? :data_source
32
- logger.trace { "Implementer doesn't provide a data_source" }
23
+ unless self.respond_to?(:data_source)
33
24
  return nil
34
25
  end
35
26
 
36
- self.data_source.tap do |data_source|
37
- logger.trace { "Got data source from the implementer (#{data_source})" }
38
- end
39
- end
40
-
41
- def override(override_data)
42
- logger.trace { "Overriding settings data" }
43
- res = data.push!(override_data)
44
- logger.debug { "Overrode settings data" }
45
- logger.debug(tag: :data) { "Override data #{override_data}" }
46
- res
47
- end
48
-
49
- def reset
50
- logger.trace { "Resetting overridden settings data" }
51
- res = data.pop!
52
- logger.debug { "Reset overridden settings data" }
53
- res
27
+ self.data_source
54
28
  end
55
29
 
56
30
  def set(receiver, *namespace, attribute: nil, strict: true)
57
- logger.trace { "Setting #{receiver.class.name} (#{digest(namespace, attribute, strict)})" }
58
31
  unless attribute.nil?
59
32
  value = set_attribute(receiver, attribute, namespace, strict)
60
33
  else
@@ -64,8 +37,6 @@ class Settings
64
37
  end
65
38
 
66
39
  def set_attribute(receiver, attribute, namespace, strict)
67
- logger.trace { "Setting #{receiver.class.name} attribute (#{digest(namespace, attribute, strict)})" }
68
-
69
40
  attribute = attribute.to_s if attribute.is_a?(Symbol)
70
41
 
71
42
  attribute_namespace = namespace.dup
@@ -74,35 +45,25 @@ class Settings
74
45
  value = get(attribute_namespace)
75
46
 
76
47
  if value.nil?
77
- msg = "#{attribute_namespace} not found in the data"
78
- logger.error { msg }
79
- raise Settings::Error, msg
48
+ raise Settings::Error, "#{attribute_namespace} not found in the data"
80
49
  end
81
50
 
82
51
  Settings::Setting::Assignment::Attribute.assign(receiver, attribute.to_sym, value, strict)
83
52
 
84
- logger.debug { "Set #{receiver.class.name} #{attribute} to #{value.inspect}" }
85
-
86
53
  value
87
54
  end
88
55
 
89
56
  def set_object(receiver, namespace, strict)
90
- logger.trace { "Setting #{receiver.class.name} object (#{digest(namespace, nil, strict)})" }
91
-
92
57
  data = get(namespace)
93
58
 
94
59
  if data.nil?
95
- msg = "#{namespace} not found in the data"
96
- logger.error { msg }
97
- raise Settings::Error, msg
60
+ raise Settings::Error, "#{namespace} not found in the data"
98
61
  end
99
62
 
100
63
  data.each do |attribute, value|
101
64
  Settings::Setting::Assignment::Object.assign(receiver, attribute.to_sym, value, strict)
102
65
  end
103
66
 
104
- logger.debug { "Set #{receiver.class.name} object (#{digest(namespace, nil, strict)})" }
105
-
106
67
  receiver
107
68
  end
108
69
 
@@ -112,24 +73,16 @@ class Settings
112
73
 
113
74
  def get(*namespace)
114
75
  namespace.flatten!
115
- logger.trace { "Getting #{namespace}" }
116
-
117
- string_keys = namespace.map { |n| n.is_a?(String) ? n : n.to_s }
118
76
 
119
- value = string_keys.inject(data) {|memo, k| memo ? memo[k] : nil }
77
+ keys = namespace.map { |n| n.is_a?(Symbol) ? n.to_s : n }
120
78
 
121
- logger.debug { "Got #{namespace}" }
122
- logger.debug(tag: :data) { "#{namespace}: #{value.inspect}" }
79
+ value = nil
80
+ if keys.empty?
81
+ value = data
82
+ else
83
+ value = data.dig(*keys)
84
+ end
123
85
 
124
86
  value
125
87
  end
126
-
127
- def digest(namespace, attribute, strict)
128
- content = []
129
- content << "Namespace: #{namespace.join ', '}" unless namespace.empty?
130
- content << "Attribute: #{attribute}" if attribute
131
- strict = "<not set>" if strict.nil?
132
- content << "Strict: #{strict}"
133
- content.join ', '
134
- end
135
88
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evt-settings
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.0
4
+ version: 2.1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - The Eventide Project
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-04 00:00:00.000000000 Z
11
+ date: 2020-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: evt-log
14
+ name: evt-attribute
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: confstruct
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: test_bench
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -74,14 +60,15 @@ extra_rdoc_files: []
74
60
  files:
75
61
  - lib/settings.rb
76
62
  - lib/settings/controls.rb
63
+ - lib/settings/controls/data.rb
77
64
  - lib/settings/controls/data_source.rb
78
65
  - lib/settings/controls/settings.rb
79
66
  - lib/settings/controls/subject.rb
67
+ - lib/settings/data_source.rb
80
68
  - lib/settings/data_source/build.rb
81
- - lib/settings/data_source/data_source.rb
69
+ - lib/settings/data_source/env.rb
82
70
  - lib/settings/data_source/file.rb
83
71
  - lib/settings/data_source/hash.rb
84
- - lib/settings/log.rb
85
72
  - lib/settings/registry.rb
86
73
  - lib/settings/setting.rb
87
74
  - lib/settings/setting/assignment.rb
@@ -91,7 +78,7 @@ homepage: https://github.com/eventide-project/settings
91
78
  licenses:
92
79
  - MIT
93
80
  metadata: {}
94
- post_install_message:
81
+ post_install_message:
95
82
  rdoc_options: []
96
83
  require_paths:
97
84
  - lib
@@ -106,9 +93,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
93
  - !ruby/object:Gem::Version
107
94
  version: '0'
108
95
  requirements: []
109
- rubyforge_project:
110
- rubygems_version: 2.7.6
111
- signing_key:
96
+ rubygems_version: 3.1.2
97
+ signing_key:
112
98
  specification_version: 4
113
99
  summary: Settings data access and assignment
114
100
  test_files: []
@@ -1,9 +0,0 @@
1
- class Settings
2
- class Log < ::Log
3
- def tag!(tags)
4
- tags << :settings
5
- tags << :library
6
- tags << :verbose
7
- end
8
- end
9
- end