dot_options 0.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: fb3d62c652e1453a6a6d4fcc5df1334c3998c257089fe8ac455bee3b93a7a3b2
4
+ data.tar.gz: d52505910635b560f397d91d59a49001a625011eff3971e246791d46c62e65bd
5
+ SHA512:
6
+ metadata.gz: 8c1e1384ad4a64014e35921c903a7994e38c97cab01441e3716ce659b5e1051390d9755065e6e6c4f8ec5af2507c34f32011569b5a080908ff219100c3c8f75d
7
+ data.tar.gz: 2e6a4e3df06791a9eae4b10d2eac41b29bb814b0392f0ae600ee6d47fc8e99616aa975f37b8c1dd6e40b4df4ff53f0d3bb32ed46f735d70364df22b623c194ff
data/README.md ADDED
@@ -0,0 +1,44 @@
1
+ # DotOptions - Options object with dot-notation access
2
+
3
+ Convert any hash to a an object with deep read/write dot-notation access.
4
+
5
+ [![Gem Version](https://badge.fury.io/rb/dot_options.svg)](https://badge.fury.io/rb/dot_options)
6
+ [![Build Status](https://github.com/DannyBen/dot_options/workflows/Test/badge.svg)](https://github.com/DannyBen/dot_options/actions?query=workflow%3ATest)
7
+
8
+ ---
9
+
10
+ ## Install
11
+
12
+ ```
13
+ $ gem install dot_options
14
+ ```
15
+
16
+ ## Usage
17
+
18
+ ```ruby
19
+ # Initialize a DotOptions object with a hash:
20
+ opts = {
21
+ debug: true,
22
+ output: { color: true },
23
+ skin: { background: { color: :black, texture: 'Stripes' } },
24
+ }
25
+ options = DotOptions.new opts
26
+
27
+ # Read any option with dot-notation:
28
+ p options.skin.background.color # => :black
29
+
30
+ # Update any option with dot-notation:
31
+ options.skin.background.color = :black
32
+
33
+ # ... or create an entire branch by providing a hash
34
+ options.skin.foreground = { color: :white, font: 'JetBrains Mono' }
35
+ p options.skin.foreground.font # => 'JetBrains Mono'
36
+ ```
37
+
38
+ ## Contributing / Support
39
+
40
+ If you experience any issue, have a question or a suggestion, or if you wish
41
+ to contribute, feel free to [open an issue][issues].
42
+
43
+
44
+ [issues]: https://github.com/DannyBen/dot_options/issues
@@ -0,0 +1,3 @@
1
+ class DotOptions
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,66 @@
1
+ class DotOptions
2
+ OptionNotFoundError = Class.new StandardError
3
+
4
+ attr_reader :options, :key, :parent
5
+
6
+ def initialize(options = {}, key: nil, parent: nil)
7
+ @options = options
8
+ @key = key
9
+ @parent = parent
10
+ build_options
11
+ end
12
+
13
+ def inspect
14
+ "{ #{options.map { |key, value| "#{key}: #{value.inspect}" }.join(', ')} }"
15
+ end
16
+
17
+ def to_s
18
+ flat_options.map { |key, value| "#{key} = #{value.inspect}" }.join "\n"
19
+ end
20
+
21
+ def flat_options(prefix = nil)
22
+ result = {}
23
+ options.each do |key, value|
24
+ full_key = [prefix, key].compact.join '.'
25
+ opts = value.is_a?(DotOptions) ? value.flat_options(full_key) : { full_key => value }
26
+ result.merge! opts
27
+ end
28
+
29
+ result
30
+ end
31
+
32
+ def method_missing(name, *args)
33
+ if name.to_s.end_with?('=')
34
+ key = name.to_s.chomp('=').to_sym
35
+ options[key] = args.first
36
+ build_options if args.first.is_a? Hash
37
+ elsif options.has_key? name
38
+ options[name]
39
+ else
40
+ raise OptionNotFoundError, "Option '#{full_path(name)}' not found"
41
+ end
42
+ end
43
+
44
+ def respond_to_missing?(name, include_private = false)
45
+ options.has_key?(name.to_s.chomp('=').to_sym) || super
46
+ end
47
+
48
+ private
49
+
50
+ def build_options
51
+ options.each do |key, value|
52
+ options[key] = DotOptions.new(value, key: key, parent: self) if value.is_a?(Hash)
53
+ end
54
+ end
55
+
56
+ def full_path(name)
57
+ ancestors = [name]
58
+ current = self
59
+ while current.is_a? DotOptions
60
+ ancestors.unshift(current.key) if current.key
61
+ current = current.parent
62
+ end
63
+
64
+ ancestors.join '.'
65
+ end
66
+ end
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dot_options
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Danny Ben Shitrit
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-07-30 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Convert any hash to a deep dot-notation object
14
+ email: db@dannyben.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - README.md
20
+ - lib/dot_options.rb
21
+ - lib/dot_options/version.rb
22
+ homepage: https://github.com/dannyben/dot_notation
23
+ licenses:
24
+ - MIT
25
+ metadata:
26
+ bug_tracker_uri: https://github.com/DannyBen/dot_options/issues
27
+ changelog_uri: https://github.com/DannyBen/dot_options/blob/master/CHANGELOG.md
28
+ source_code_uri: https://github.com/DannyBen/dot_options
29
+ rubygems_mfa_required: 'true'
30
+ post_install_message:
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '3.1'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubygems_version: 3.5.14
46
+ signing_key:
47
+ specification_version: 4
48
+ summary: Options object with dot-notation support
49
+ test_files: []