structure 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm --create use 1.9.2@structure
data/CHANGELOG.md ADDED
@@ -0,0 +1,4 @@
1
+ # 0.8
2
+
3
+ * Make JSON patch compatible with Active Support.
4
+ * Remove URI from list of types.
data/README.md CHANGED
@@ -5,7 +5,8 @@ Structure is a Struct-like key/value container for modeling ephemeral data in
5
5
  Ruby.
6
6
 
7
7
  Structure typecasts, uses basic association idioms, and converts to and from
8
- JSON seamlessly.
8
+ JSON seamlessly, even when nested in structures or other structure-like
9
+ objects.
9
10
 
10
11
  #_ d
11
12
  ##_ d#
@@ -109,4 +110,3 @@ Structure supports the following types:
109
110
  * Integer
110
111
  * String
111
112
  * Structure
112
- * URI
data/lib/structure.rb CHANGED
@@ -1,5 +1,3 @@
1
- require 'uri'
2
-
3
1
  # Ruby doesn't have a Boolean class, so let's feign one.
4
2
  unless Object.const_defined?(:Boolean)
5
3
  module Boolean; end
@@ -11,7 +9,7 @@ end
11
9
  class Structure
12
10
  include Enumerable
13
11
 
14
- TYPES = [Array, Boolean, Float, Hash, Integer, String, Structure, URI]
12
+ TYPES = [Array, Boolean, Float, Hash, Integer, String, Structure]
15
13
 
16
14
  class << self
17
15
 
@@ -31,7 +29,7 @@ class Structure
31
29
  # Takes a name and an optional hash of options. Available options are:
32
30
  #
33
31
  # * :type, which can be Array, Boolean, Float, Hash, Integer, String,
34
- # Structure, or URI. If not specified, type defaults to String.
32
+ # or Structure. If not specified, type defaults to String.
35
33
  # * :default, which sets the default value for the attribute.
36
34
  #
37
35
  # class Book
@@ -1,3 +1,5 @@
1
+ require 'structure'
2
+
1
3
  unless Object.const_defined?(:JSON) and ::JSON.const_defined?(:JSON_LOADED) and
2
4
  ::JSON::JSON_LOADED
3
5
  require 'json'
@@ -16,3 +18,26 @@ class Structure
16
18
  to_json(*args)
17
19
  end
18
20
  end
21
+
22
+ if defined? ActiveSupport
23
+ class Structure
24
+ def as_json(options = nil)
25
+ # create a subset of the attributes by applying :only or :except
26
+ subset = if options
27
+ if attrs = options[:only]
28
+ @attributes.slice(*Array.wrap(attrs))
29
+ elsif attrs = options[:except]
30
+ @attributes.except(*Array.wrap(attrs))
31
+ else
32
+ @attributes.dup
33
+ end
34
+ else
35
+ @attributes.dup
36
+ end
37
+
38
+ klass = self.class.name
39
+ { JSON.create_id => klass }.
40
+ merge(subset)
41
+ end
42
+ end
43
+ end
@@ -1,3 +1,3 @@
1
1
  class Structure
2
- VERSION = '0.7.1'
2
+ VERSION = '0.8.0'
3
3
  end
@@ -1,6 +1,5 @@
1
1
  class Person < Structure
2
2
  key :name
3
3
  key :age, :type => Integer
4
- key :website, :type => URI
5
4
  has_many :friends
6
5
  end
@@ -1,30 +1,66 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Structure do
4
- context "when `structure/json' is required" do
5
- let(:person) { Person.new(:name => 'Joe', :age => 28, :website => 'http://example.com') }
6
- let(:json) { '{"json_class":"Person","name":"Joe","age":28,"website":"http://example.com","friends":[]}' }
3
+ shared_examples_for "a JSON interface" do
4
+ it "dumps to JSON" do
5
+ person.to_json.should eql json
6
+ end
7
7
 
8
+ it "loads from JSON" do
9
+ JSON.parse(json).should == person
10
+ end
11
+
12
+ context "when nesting other structures" do
8
13
  before do
14
+ person.friends = [Person.new(:name => 'Jane')]
15
+ end
16
+
17
+ it "loads them into their corresponding structures" do
18
+ json = person.to_json
19
+ JSON.parse(json).friends.first.should be_a Person
20
+ end
21
+ end
22
+ end
23
+
24
+ describe Structure do
25
+ let(:person) { Person.new(:name => 'Joe') }
26
+ let(:json) { '{"json_class":"Person","name":"Joe","age":null,"friends":[]}' }
27
+
28
+ context "without Active Support" do
29
+ before(:all) do
9
30
  require 'structure/json'
10
31
  end
11
32
 
12
- it "dumps to JSON" do
13
- person.to_json.should eql json
33
+ it_behaves_like "a JSON interface"
34
+ end
35
+
36
+ context "with Active Support" do
37
+ before(:all) do
38
+ require 'active_support/ordered_hash'
39
+ require 'active_support/json'
40
+ load 'structure/json.rb'
14
41
  end
15
42
 
16
- it "loads from JSON" do
17
- JSON.parse(json).should == person
43
+ after(:all) do
44
+ Object.send(:remove_const, :ActiveSupport)
18
45
  end
19
46
 
20
- context "when nesting other structures" do
21
- before do
22
- person.friends = [Person.new(:name => 'Jane')]
47
+ it_behaves_like "a JSON interface"
48
+
49
+ describe "#as_json" do
50
+ it "returns a hash" do
51
+ person.as_json.should be_a Hash
52
+ end
53
+
54
+ it "selects a subset of attributes" do
55
+ as_json = person.as_json(:only => :name)
56
+ as_json.should have_key :name
57
+ as_json.should_not have_key :age
23
58
  end
24
59
 
25
- it "loads them into their corresponding structures" do
26
- json = person.to_json
27
- JSON.parse(json).friends.first.should be_a Person
60
+ it "rejects a subset of attributes" do
61
+ as_json = person.as_json(:except => :name)
62
+ as_json.should_not have_key :name
63
+ as_json.should have_key :age
28
64
  end
29
65
  end
30
66
  end
@@ -41,7 +41,6 @@ describe Structure do
41
41
  it "returns the default attributes for the structure" do
42
42
  Person.send(:default_attributes).should == { :name => nil,
43
43
  :age => nil,
44
- :website => nil,
45
44
  :friends => [] }
46
45
  Book.send(:default_attributes).should == { :title => nil,
47
46
  :authors => nil }
data/structure.gemspec CHANGED
@@ -18,8 +18,9 @@ Gem::Specification.new do |s|
18
18
  s.rubyforge_project = "structure"
19
19
 
20
20
  {
21
- 'rspec' => '~> 2.6.0',
22
- 'ruby-debug19' => '~> 0.11.6'
21
+ 'activesupport' => '>= 3.0',
22
+ 'rspec' => '~> 2.6',
23
+ 'ruby-debug19' => '~> 0.11.6'
23
24
  }.each do |lib, version|
24
25
  s.add_development_dependency lib, version
25
26
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 7
8
- - 1
9
- version: 0.7.1
7
+ - 8
8
+ - 0
9
+ version: 0.8.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Paper Cavalier
@@ -14,13 +14,27 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-05-29 00:00:00 +01:00
17
+ date: 2011-06-24 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: rspec
21
+ name: activesupport
22
22
  prerelease: false
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 3
30
+ - 0
31
+ version: "3.0"
32
+ type: :development
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: rspec
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
24
38
  none: false
25
39
  requirements:
26
40
  - - ~>
@@ -28,14 +42,13 @@ dependencies:
28
42
  segments:
29
43
  - 2
30
44
  - 6
31
- - 0
32
- version: 2.6.0
45
+ version: "2.6"
33
46
  type: :development
34
- version_requirements: *id001
47
+ version_requirements: *id002
35
48
  - !ruby/object:Gem::Dependency
36
49
  name: ruby-debug19
37
50
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
51
+ requirement: &id003 !ruby/object:Gem::Requirement
39
52
  none: false
40
53
  requirements:
41
54
  - - ~>
@@ -46,7 +59,7 @@ dependencies:
46
59
  - 6
47
60
  version: 0.11.6
48
61
  type: :development
49
- version_requirements: *id002
62
+ version_requirements: *id003
50
63
  description: |-
51
64
  Structure is a Struct-like key/value container for modeling ephemeral data
52
65
  in Ruby.
@@ -60,6 +73,8 @@ extra_rdoc_files: []
60
73
 
61
74
  files:
62
75
  - .gitignore
76
+ - .rvmrc
77
+ - CHANGELOG.md
63
78
  - Gemfile
64
79
  - LICENSE
65
80
  - README.md