structure 0.7.1 → 0.8.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.
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