structure 0.11.0 → 0.12.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/CHANGELOG.md +4 -0
- data/README.md +1 -1
- data/lib/structure/static.rb +52 -0
- data/lib/structure/version.rb +1 -1
- data/spec/fixtures/cities.yml +5 -0
- data/spec/fixtures/cities_without_id.yml +4 -0
- data/spec/models/city.rb +9 -0
- data/spec/structure/static_spec.rb +59 -0
- metadata +12 -3
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -79,7 +79,7 @@ Talk JSON:
|
|
79
79
|
require 'structure/json'
|
80
80
|
|
81
81
|
json = p1.to_json
|
82
|
-
=> {"json_class":"Person","name":"
|
82
|
+
=> {"json_class":"Person","name":"Gilles","age":28,"friends":[{"json_class":"Person","name":"John Doe","age":null,"friends":[]}],"partner":null}
|
83
83
|
|
84
84
|
person = JSON.parse(json)
|
85
85
|
person.friends.first
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
class Structure
|
4
|
+
|
5
|
+
# An enumurable static structure, sourced from a yaml file.
|
6
|
+
module Static
|
7
|
+
def self.included(base)
|
8
|
+
base.key(:id, Integer)
|
9
|
+
base.extend(ClassMethods)
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
include Enumerable
|
14
|
+
|
15
|
+
attr_accessor :data_path
|
16
|
+
|
17
|
+
def all
|
18
|
+
@all ||= data.map do |record|
|
19
|
+
record["id"] ||= increment_id
|
20
|
+
new(record)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def each(&block)
|
25
|
+
all.each { |record| block.call(record) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def find(id)
|
29
|
+
detect { |record| record.id == id }
|
30
|
+
end
|
31
|
+
|
32
|
+
def set_data_path(data_path)
|
33
|
+
@data_path = data_path
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def data
|
39
|
+
YAML.load_file(data_path)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Overwrite this method with an opiniated location to dry if necessary.
|
43
|
+
def data_path
|
44
|
+
@data_path
|
45
|
+
end
|
46
|
+
|
47
|
+
def increment_id
|
48
|
+
@increment_id = @increment_id.to_i + 1
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/structure/version.rb
CHANGED
data/spec/models/city.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Structure
|
4
|
+
describe "A static structure" do
|
5
|
+
it "is enumerable" do
|
6
|
+
City.should be_an Enumerable
|
7
|
+
end
|
8
|
+
|
9
|
+
describe ".all" do
|
10
|
+
it "returns all records" do
|
11
|
+
City.all.should have(2).cities
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe ".find" do
|
16
|
+
it "finds a record by its id" do
|
17
|
+
City.find(1).should be_a City
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns nil if the record does not exist" do
|
21
|
+
City.find(4).should be_nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe ".set_data_path" do
|
26
|
+
it "sets the data path" do
|
27
|
+
City.set_data_path("foo")
|
28
|
+
City.send(:data_path).should eql "foo"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "when sourced data does not include ids" do
|
33
|
+
before(:all) do
|
34
|
+
City.instance_variable_set(:@all, nil)
|
35
|
+
fixture = File.expand_path("../../fixtures/cities_without_id.yml", __FILE__)
|
36
|
+
City.set_data_path(fixture)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should auto-increment the ids of loaded records" do
|
40
|
+
City.map(&:id).should =~ [1, 2, 3]
|
41
|
+
end
|
42
|
+
|
43
|
+
describe ".increment_id" do
|
44
|
+
before do
|
45
|
+
City.instance_variable_set(:@increment_id, nil)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "starts from 1" do
|
49
|
+
City.send(:increment_id).should eql 1
|
50
|
+
end
|
51
|
+
|
52
|
+
it "auto-increments" do
|
53
|
+
City.send(:increment_id)
|
54
|
+
City.send(:increment_id).should eql 2
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 12
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.12.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Paper Cavalier
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-07-
|
17
|
+
date: 2011-07-07 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -80,11 +80,16 @@ files:
|
|
80
80
|
- benchmark.rb
|
81
81
|
- lib/structure.rb
|
82
82
|
- lib/structure/json.rb
|
83
|
+
- lib/structure/static.rb
|
83
84
|
- lib/structure/version.rb
|
85
|
+
- spec/fixtures/cities.yml
|
86
|
+
- spec/fixtures/cities_without_id.yml
|
84
87
|
- spec/models/book.rb
|
88
|
+
- spec/models/city.rb
|
85
89
|
- spec/models/person.rb
|
86
90
|
- spec/spec_helper.rb
|
87
91
|
- spec/structure/json_spec.rb
|
92
|
+
- spec/structure/static_spec.rb
|
88
93
|
- spec/structure_spec.rb
|
89
94
|
- structure.gemspec
|
90
95
|
has_rdoc: true
|
@@ -120,8 +125,12 @@ signing_key:
|
|
120
125
|
specification_version: 3
|
121
126
|
summary: A key/value container for modeling ephemeral data
|
122
127
|
test_files:
|
128
|
+
- spec/fixtures/cities.yml
|
129
|
+
- spec/fixtures/cities_without_id.yml
|
123
130
|
- spec/models/book.rb
|
131
|
+
- spec/models/city.rb
|
124
132
|
- spec/models/person.rb
|
125
133
|
- spec/spec_helper.rb
|
126
134
|
- spec/structure/json_spec.rb
|
135
|
+
- spec/structure/static_spec.rb
|
127
136
|
- spec/structure_spec.rb
|