abyss 0.3.2 → 0.4.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.
@@ -21,30 +21,76 @@ module Abyss
21
21
  #
22
22
  # Examples:
23
23
  #
24
- # Abyss.configure do
25
- # three do
26
- # levels do
27
- # deep do
28
- # day "Monday"
24
+ # Abyss.configure do
25
+ # three do
26
+ # levels do
27
+ # deep do
28
+ # day "Monday"
29
+ # end
30
+ # end
29
31
  # end
30
32
  # end
31
- # end
32
- # end
33
33
  #
34
- # Abyss.has?("three/levels/deep/day") #=> true
35
- # Abyss.has?("non/existent/thing") #=> false
34
+ # Abyss.has?("three/levels/deep/day") #=> true
35
+ # Abyss.has?("non/existent/thing") #=> false
36
36
  #
37
37
  def self.has?(path)
38
+ get(path) ? true : false
39
+ end
40
+
41
+ # Gets a value at a given configuration path, slash-separated
42
+ #
43
+ # Returns: Target value or nil
44
+ #
45
+ # Examples:
46
+ #
47
+ # Abyss.configure do
48
+ # three do
49
+ # levels do
50
+ # deep do
51
+ # day "Monday"
52
+ # end
53
+ # end
54
+ # end
55
+ # end
56
+ #
57
+ # Abyss.get("three/levels/deep/day") #=> "Monday"
58
+ # Abyss.has("non/existent/thing") #=> nil
59
+ #
60
+ def self.get(path)
38
61
  path.split('/').inject(Abyss.configuration) do |acc, current_path_item|
39
62
  begin
40
63
  target = acc.send(current_path_item)
41
- return false if target.nil?
64
+ return nil if target.nil?
42
65
  rescue NoMethodError
43
- return false
66
+ return nil
44
67
  end
45
68
  target
46
69
  end
47
- true
70
+ end
71
+
72
+ # Gets a value at a given configuration path, slash-separated. This version
73
+ # raises an error if the value isn't defined.
74
+ #
75
+ # Returns: Target value
76
+ #
77
+ # Examples:
78
+ #
79
+ # Abyss.configure do
80
+ # three do
81
+ # levels do
82
+ # deep do
83
+ # day "Monday"
84
+ # end
85
+ # end
86
+ # end
87
+ # end
88
+ #
89
+ # Abyss.get("three/levels/deep/day") #=> "Monday"
90
+ # Abyss.has("non/existent/thing") # Raises Abyss::Errors::NotFound
91
+ #
92
+ def self.get!(path)
93
+ get(path) || raise(Abyss::Errors::NotFound.new(path))
48
94
  end
49
95
 
50
96
  end
@@ -2,6 +2,18 @@ module Abyss
2
2
 
3
3
  module Errors
4
4
 
5
+ class NotFound < RuntimeError
6
+ attr_accessor :path
7
+
8
+ def initialize(path)
9
+ self.path = path
10
+ end
11
+
12
+ def message
13
+ "Value at '#{path}' not found."
14
+ end
15
+ end
16
+
5
17
  class AbstractMethod < RuntimeError
6
18
  attr_accessor :name
7
19
 
@@ -1,3 +1,3 @@
1
1
  module Abyss
2
- VERSION = "0.3.2"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -18,34 +18,63 @@ describe Abyss do
18
18
 
19
19
  end
20
20
 
21
- describe '.has?' do
22
-
23
- context "when given a path to an existing configuration" do
24
-
25
- before do
26
- Abyss.configure do
27
- three do
28
- levels do
29
- deep do
30
- here "hey!"
31
- end
21
+ describe 'access and validation mechanisms' do
22
+
23
+ before do
24
+ Abyss.configure do
25
+ three do
26
+ levels do
27
+ deep do
28
+ here "hey!"
32
29
  end
33
30
  end
34
31
  end
35
32
  end
33
+ end
34
+
35
+ describe '.has?' do
36
+
37
+ it 'returns true when the value exists' do
38
+ Abyss.has?('three/levels/deep/here').should be_true
39
+ end
40
+
41
+ context "when the config doesn't exist" do
36
42
 
37
- specify { Abyss.has?('three/levels/deep/here').should be_true }
43
+ before do
44
+ Abyss.configuration = nil
45
+ Abyss.configure {}
46
+ end
47
+
48
+ specify { Abyss.has?('three/levels/deep/here').should be_false }
49
+ specify { Abyss.has?('nope').should be_false }
50
+
51
+ end
38
52
 
39
53
  end
40
54
 
41
- context "when the config doesn't exist" do
55
+ describe '.get' do
56
+
57
+ it 'returns the value when it exists' do
58
+ Abyss.get('three/levels/deep/here').should == 'hey!'
59
+ end
42
60
 
43
- before do
44
- Abyss.configure {}
61
+ it "returns nil if it doesn't" do
62
+ Abyss.get('nope').should be_false
63
+ Abyss.get('no/can/do').should be_false
45
64
  end
46
65
 
47
- specify { Abyss.has?('three/levels/deep/here').should be_false }
48
- specify { Abyss.has?('nope').should be_false }
66
+ end
67
+
68
+ describe '.get!' do
69
+
70
+ it 'returns the value when it exists' do
71
+ Abyss.get('three/levels/deep/here').should == 'hey!'
72
+ end
73
+
74
+ it "raises an error when it doesn't" do
75
+ expect { Abyss.get!('nope').should be_false }.to raise_error Abyss::Errors::NotFound, /'nope' not found/
76
+ expect { Abyss.get!('no/can/do').should be_false }.to raise_error Abyss::Errors::NotFound, /'no\/can\/do' not found/
77
+ end
49
78
 
50
79
  end
51
80
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abyss
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-31 00:00:00.000000000 Z
12
+ date: 2012-06-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &70318152924440 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,7 +21,12 @@ dependencies:
21
21
  version: 3.2.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70318152924440
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 3.2.0
25
30
  description: Manage arbitrarily-deep configurations through a friendly DSL.
26
31
  email:
27
32
  - jesseltrimble@gmail.com
@@ -58,15 +63,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
58
63
  - - ! '>='
59
64
  - !ruby/object:Gem::Version
60
65
  version: '0'
66
+ segments:
67
+ - 0
68
+ hash: -772610373107186531
61
69
  required_rubygems_version: !ruby/object:Gem::Requirement
62
70
  none: false
63
71
  requirements:
64
72
  - - ! '>='
65
73
  - !ruby/object:Gem::Version
66
74
  version: '0'
75
+ segments:
76
+ - 0
77
+ hash: -772610373107186531
67
78
  requirements: []
68
79
  rubyforge_project:
69
- rubygems_version: 1.8.10
80
+ rubygems_version: 1.8.24
70
81
  signing_key:
71
82
  specification_version: 3
72
83
  summary: Manage arbitrarily-deep configurations through a friendly DSL.