hashie 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -58,6 +58,10 @@ can set defaults for each property.
58
58
  p.email # => 'abc@def.com'
59
59
  p[:awesome] # => NoMethodError
60
60
  p[:occupation] # => 'Rubyist'
61
+
62
+ p = Person.new(:name => "Bob")
63
+ p.name # => 'Bob'
64
+ p.occupation # => 'Rubyist'
61
65
 
62
66
 
63
67
  == Note on Patches/Pull Requests
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.1.3
data/hashie.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{hashie}
8
- s.version = "0.1.2"
8
+ s.version = "0.1.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Michael Bleigh"]
data/lib/hashie/dash.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'hashie/hash'
2
2
 
3
3
  module Hashie
4
+ include Hashie::PrettyInspect
4
5
  # A Dash is a 'defined' or 'discrete' Hash, that is, a Hash
5
6
  # that has a set of defined keys that are accessible (with
6
7
  # optional defaults) and only those keys may be set or read.
@@ -12,6 +13,9 @@ module Hashie
12
13
  # It is preferrable to a Struct because of the in-class
13
14
  # API for defining properties as well as per-property defaults.
14
15
  class Dash < Hashie::Hash
16
+ include Hashie::PrettyInspect
17
+ alias_method :to_s, :inspect
18
+
15
19
  # Defines a property on the Dash. Options are
16
20
  # as follows:
17
21
  #
@@ -27,11 +31,11 @@ module Hashie
27
31
 
28
32
  class_eval <<-RUBY
29
33
  def #{property_name}
30
- self['#{property_name}']
34
+ self[:#{property_name}]
31
35
  end
32
36
 
33
37
  def #{property_name}=(val)
34
- self['#{property_name}'] = val
38
+ self[:#{property_name}] = val
35
39
  end
36
40
  RUBY
37
41
  end
@@ -53,19 +57,32 @@ module Hashie
53
57
  @defaults
54
58
  end
55
59
 
60
+ # You may initialize a Dash with an attributes hash
61
+ # just like you would many other kinds of data objects.
62
+ def initialize(attributes = {})
63
+ self.class.properties.each do |prop|
64
+ puts "#{prop}="
65
+ self.send("#{prop}=", self.class.defaults[prop.to_sym])
66
+ end
67
+
68
+ attributes.each_pair do |att, value|
69
+ self.send("#{att}=", value)
70
+ end
71
+ end
72
+
56
73
  # Retrieve a value from the Dash (will return the
57
74
  # property's default value if it hasn't been set).
58
75
  def [](property_name)
59
- super(property_name.to_sym) || self.class.defaults[property_name.to_sym]
76
+ super(property_name.to_sym)
60
77
  end
61
78
 
62
79
  # Set a value on the Dash in a Hash-like way. Only works
63
80
  # on pre-existing properties.
64
81
  def []=(property, value)
65
- if self.class.property?(property)
82
+ if self.class.property?(property.to_sym)
66
83
  super
67
84
  else
68
- raise NoMethodError, 'You may only set pre-defined properties.'
85
+ raise NoMethodError, "The property '#{property}' is not defined for this Dash."
69
86
  end
70
87
  end
71
88
  end
@@ -28,4 +28,20 @@ module Hashie
28
28
  Hashie::Mash.new(self)
29
29
  end
30
30
  end
31
+
32
+ module PrettyInspect
33
+ def self.included(base)
34
+ base.send :alias_method, :hash_inspect, :inspect
35
+ base.send :alias_method, :inspect, :hashie_inspect
36
+ end
37
+
38
+ def hashie_inspect
39
+ ret = "<##{self.class.to_s}"
40
+ keys.sort.each do |key|
41
+ ret << " #{key}=#{self[key].inspect}"
42
+ end
43
+ ret << ">"
44
+ ret
45
+ end
46
+ end
31
47
  end
data/lib/hashie/mash.rb CHANGED
@@ -41,6 +41,9 @@ module Hashie
41
41
  # mash.author # => <Mash name="Michael Bleigh">
42
42
  #
43
43
  class Mash < Hashie::Hash
44
+ include Hashie::PrettyInspect
45
+ alias_method :to_s, :inspect
46
+
44
47
  # If you pass in an existing hash, it will
45
48
  # convert it to a Mash including recursively
46
49
  # descending into arrays and hashes, converting
@@ -109,19 +112,6 @@ module Hashie
109
112
  picky_key?(convert_key(key))
110
113
  end
111
114
 
112
- alias_method :regular_inspect, :inspect
113
- # Prints out a pretty object-like string of the
114
- # defined attributes.
115
- def inspect
116
- ret = "<#{self.class.to_s}"
117
- keys.sort.each do |key|
118
- ret << " #{key}=#{self[key].inspect}"
119
- end
120
- ret << ">"
121
- ret
122
- end
123
- alias_method :to_s, :inspect
124
-
125
115
  # Performs a deep_update on a duplicate of the
126
116
  # current mash.
127
117
  def deep_merge(other_hash)
@@ -45,6 +45,16 @@ describe Hashie::Dash do
45
45
  end
46
46
  end
47
47
 
48
+ describe ' initializing with a Hash' do
49
+ it 'should not be able to initialize non-existent properties' do
50
+ lambda{DashTest.new(:bork => 'abc')}.should raise_error(NoMethodError)
51
+ end
52
+
53
+ it 'should set properties that it is able to' do
54
+ DashTest.new(:first_name => 'Michael').first_name.should == 'Michael'
55
+ end
56
+ end
57
+
48
58
  describe ' defaults' do
49
59
  before do
50
60
  @dash = DashTest.new
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hashie
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Bleigh