entasis 0.5.0.rc1 → 0.5.0.rc2
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/README.md +22 -5
- data/lib/entasis/model.rb +1 -0
- data/lib/entasis/relations.rb +12 -9
- data/lib/entasis/version.rb +1 -1
- data/spec/relations_spec.rb +16 -1
- metadata +1 -1
data/README.md
CHANGED
@@ -2,6 +2,7 @@ entasis
|
|
2
2
|
=======
|
3
3
|
|
4
4
|
[](http://travis-ci.org/ingemar/entasis)
|
5
|
+
[](https://codeclimate.com/github/ingemar/entasis)
|
5
6
|
|
6
7
|
Entasis provides a few neat methods for building a basic class. Handy for models without a database.
|
7
8
|
|
@@ -11,6 +12,8 @@ Example:
|
|
11
12
|
class Person
|
12
13
|
include Entasis::Model
|
13
14
|
|
15
|
+
has_many :friends
|
16
|
+
|
14
17
|
attributes :name, :age, :city
|
15
18
|
|
16
19
|
def age=(years)
|
@@ -18,9 +21,22 @@ class Person
|
|
18
21
|
end
|
19
22
|
end
|
20
23
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
+
class Friend
|
25
|
+
include Entasis::Model
|
26
|
+
|
27
|
+
belongs_to :best_friend, class: 'Person'
|
28
|
+
|
29
|
+
attributes :name
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
hilda = Person.new(name: 'Hilda', age: '23', city: 'Stockholm', friends: [{ name: 'Emma' }, { name: 'Johan' }])
|
34
|
+
|
35
|
+
hilda.attribute_names # => ["name", "age", "city"]
|
36
|
+
hilda.attributes # => {"name"=>"Hilda", "age"=>23, "city"=>"Stockholm"}
|
37
|
+
|
38
|
+
hilda.friends # => [#<Friend:0x0 @name="Emma">, #<Friend:0x1 @name="Johan">]
|
39
|
+
hilda.friends[0].best_friend == hilda # => true
|
24
40
|
|
25
41
|
anon = Person.new
|
26
42
|
anon.valid? # => false
|
@@ -44,7 +60,8 @@ Contributors
|
|
44
60
|
------------
|
45
61
|
|
46
62
|
- Ingemar Edsborn (ingemar)
|
47
|
-
-
|
48
|
-
- Johnny Winn (nurugger07)
|
63
|
+
- Gabriel Reis (greis)
|
49
64
|
- Jack Christensen (jackc)
|
65
|
+
- Johnny Winn (nurugger07)
|
66
|
+
- Joshua Davey (jgdavey)
|
50
67
|
|
data/lib/entasis/model.rb
CHANGED
@@ -7,6 +7,7 @@ module Entasis
|
|
7
7
|
include ActiveModel::Validations
|
8
8
|
class_attribute :attribute_names, :attributes_config, :belongings, instance_writer: false
|
9
9
|
|
10
|
+
self.belongings ||= {}
|
10
11
|
self.attribute_names ||= []
|
11
12
|
self.class_eval 'class UnknownAttributeError < StandardError; end'
|
12
13
|
end
|
data/lib/entasis/relations.rb
CHANGED
@@ -25,7 +25,7 @@ module Entasis
|
|
25
25
|
options = relations.last.is_a?(Hash) ? relations.pop : {}
|
26
26
|
|
27
27
|
relations.each do |relation|
|
28
|
-
relation_model =
|
28
|
+
relation_model = options[:class] || relation.to_s.singularize.camelize
|
29
29
|
|
30
30
|
self.class_eval <<-RUBY
|
31
31
|
def #{relation}=(resources)
|
@@ -36,8 +36,8 @@ module Entasis
|
|
36
36
|
resource = #{relation_model}.new resource
|
37
37
|
end
|
38
38
|
|
39
|
-
if resource.
|
40
|
-
resource.send "\#{
|
39
|
+
if inverse_relation = resource.belongings[self.class.to_s]
|
40
|
+
resource.send "\#{inverse_relation}=", self
|
41
41
|
end
|
42
42
|
|
43
43
|
@#{relation} << resource
|
@@ -55,18 +55,21 @@ module Entasis
|
|
55
55
|
# To complete the inverse relationship and tie two models togeter
|
56
56
|
# specify the +belongs_to+ relationship.
|
57
57
|
#
|
58
|
+
# Last argument can be an options hash:
|
59
|
+
#
|
60
|
+
# class: provide a custom class name
|
61
|
+
#
|
58
62
|
def belongs_to(*relations)
|
59
63
|
options = relations.last.is_a?(Hash) ? relations.pop : {}
|
60
64
|
|
61
|
-
|
62
|
-
|
65
|
+
relations.each do |relation|
|
66
|
+
relation_model = options[:class] || relation.to_s.singularize.camelize
|
67
|
+
|
68
|
+
self.belongings[relation_model] = relation
|
69
|
+
end
|
63
70
|
|
64
71
|
attr_accessor *relations
|
65
72
|
end
|
66
73
|
end
|
67
|
-
|
68
|
-
def belongs_to?(model)
|
69
|
-
self.belongings.include? model.to_s.underscore
|
70
|
-
end
|
71
74
|
end
|
72
75
|
end
|
data/lib/entasis/version.rb
CHANGED
data/spec/relations_spec.rb
CHANGED
@@ -5,12 +5,14 @@ describe Entasis::Relations do
|
|
5
5
|
{
|
6
6
|
name: 'Volvo',
|
7
7
|
people: [{ name: 'Aslog' }],
|
8
|
-
passengers: [{ name: 'Gunnar' }]
|
8
|
+
passengers: [{ name: 'Gunnar' }],
|
9
|
+
destinations: [{ name: 'Stockholm' }]
|
9
10
|
}
|
10
11
|
end
|
11
12
|
let(:car) { Car.new }
|
12
13
|
let(:person) { car.people.first }
|
13
14
|
let(:passenger) { car.passengers.first }
|
15
|
+
let(:destination) { car.destinations.first }
|
14
16
|
|
15
17
|
describe '#attributes=' do
|
16
18
|
before { car.attributes = attributes }
|
@@ -31,5 +33,18 @@ describe Entasis::Relations do
|
|
31
33
|
expect(passenger.car).to eq(car)
|
32
34
|
end
|
33
35
|
end
|
36
|
+
|
37
|
+
context 'subclasses' do
|
38
|
+
it 'creates a new instance of the relation' do
|
39
|
+
expect(destination).to be_a(Car::Destination)
|
40
|
+
expect(destination.name).to eq('Stockholm')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when belongs_to was given a custom class name' do
|
45
|
+
it 'sets the correct relation' do
|
46
|
+
expect(destination.transportation).to eq(car)
|
47
|
+
end
|
48
|
+
end
|
34
49
|
end
|
35
50
|
end
|