typekit-client 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +5 -3
- data/.travis.yml +4 -0
- data/.yardopts +6 -0
- data/CHANGELOG.md +12 -0
- data/Guardfile +21 -3
- data/README.md +253 -248
- data/bin/typekit-client +16 -16
- data/bin/typekit-publisher +6 -5
- data/lib/typekit.rb +6 -2
- data/lib/typekit/client.rb +66 -24
- data/lib/typekit/collection.rb +6 -11
- data/lib/typekit/collection/base.rb +40 -0
- data/lib/typekit/collection/serialization.rb +17 -0
- data/lib/typekit/converter.rb +26 -0
- data/lib/typekit/converter/boolean.rb +12 -0
- data/lib/typekit/converter/collection.rb +13 -0
- data/lib/typekit/converter/datetime.rb +12 -0
- data/lib/typekit/converter/element.rb +13 -0
- data/lib/typekit/converter/errors.rb +12 -0
- data/lib/typekit/converter/unknown.rb +13 -0
- data/lib/typekit/core.rb +8 -10
- data/lib/typekit/element.rb +27 -0
- data/lib/typekit/element/association.rb +63 -0
- data/lib/typekit/element/base.rb +61 -0
- data/lib/typekit/element/persistence.rb +61 -0
- data/lib/typekit/element/query.rb +25 -0
- data/lib/typekit/element/serialization.rb +17 -0
- data/lib/typekit/error.rb +23 -0
- data/lib/typekit/helper.rb +59 -10
- data/lib/typekit/record.rb +18 -22
- data/lib/typekit/record/family.rb +24 -1
- data/lib/typekit/record/kit.rb +29 -1
- data/lib/typekit/record/library.rb +4 -1
- data/lib/typekit/record/variation.rb +13 -1
- data/lib/typekit/version.rb +1 -1
- data/spec/feature/create_kit_spec.rb +52 -0
- data/spec/feature/delete_kit_spec.rb +33 -0
- data/spec/feature/index_kits_spec.rb +55 -0
- data/spec/feature/publish_kit_spec.rb +15 -0
- data/spec/feature/show_family_spec.rb +75 -0
- data/spec/feature/show_kit_spec.rb +56 -0
- data/spec/feature/show_library_spec.rb +29 -0
- data/spec/feature/show_variation_spec.rb +18 -0
- data/spec/feature/update_kit_spec.rb +88 -0
- data/spec/fixture/cassette/create_kits_bad.yml +16 -0
- data/spec/fixture/cassette/create_kits_ok.yml +16 -0
- data/spec/fixture/cassette/delete_kits_xxx_not_found.yml +13 -0
- data/spec/{cassettes → fixture/cassette}/delete_kits_xxx_ok.yml +0 -3
- data/spec/fixture/cassette/index_kits_show_kit_xxx_ok.yml +25 -0
- data/spec/{cassettes → fixture/cassette}/index_kits_unauthorized.yml +0 -3
- data/spec/{cassettes → fixture/cassette}/show_families_xxx_found.yml +0 -3
- data/spec/{cassettes → fixture/cassette}/show_families_xxx_ok.yml +0 -3
- data/spec/{cassettes → fixture/cassette}/show_families_xxx_yyy_ok.yml +0 -3
- data/spec/fixture/cassette/show_families_yyy_update_kits_xxx_families_ok.yml +35 -0
- data/spec/fixture/cassette/show_kits_xxx_families_yyy_show_family_yyy_ok.yml +45 -0
- data/spec/fixture/cassette/show_kits_xxx_not_found.yml +13 -0
- data/spec/fixture/cassette/show_kits_xxx_show_family_yyy_ok.yml +46 -0
- data/spec/{cassettes → fixture/cassette}/show_libraries_xxx_ok.yml +0 -3
- data/spec/fixture/cassette/update_kits_xxx_empty_families_ok.yml +16 -0
- data/spec/fixture/cassette/update_kits_xxx_families_ok.yml +18 -0
- data/spec/fixture/cassette/update_kits_xxx_families_variations_ok.yml +18 -0
- data/spec/fixture/cassette/update_kits_xxx_name_ok.yml +17 -0
- data/spec/fixture/cassette/update_kits_xxx_publish_ok.yml +16 -0
- data/spec/fixture/record/article.rb +11 -0
- data/spec/fixture/record/section.rb +10 -0
- data/spec/lib/typekit/collection_spec.rb +22 -0
- data/spec/{typekit/processing → lib/typekit}/converter_spec.rb +13 -13
- data/spec/lib/typekit/element/association_spec.rb +96 -0
- data/spec/lib/typekit/element/base_spec.rb +70 -0
- data/spec/lib/typekit/element/persistence_spec.rb +97 -0
- data/spec/lib/typekit/element/serialization_spec.rb +28 -0
- data/spec/lib/typekit/element_spec.rb +58 -0
- data/spec/{typekit → lib/typekit}/helper_spec.rb +6 -8
- data/spec/lib/typekit/record_spec.rb +57 -0
- data/spec/spec_helper.rb +10 -3
- data/spec/support/common_helper.rb +5 -0
- data/spec/support/record_helper.rb +38 -0
- data/typekit-client.gemspec +11 -4
- metadata +164 -58
- data/lib/typekit/processing.rb +0 -8
- data/lib/typekit/processing/converter.rb +0 -28
- data/lib/typekit/processing/converter/boolean.rb +0 -14
- data/lib/typekit/processing/converter/collection.rb +0 -18
- data/lib/typekit/processing/converter/datetime.rb +0 -14
- data/lib/typekit/processing/converter/errors.rb +0 -24
- data/lib/typekit/processing/converter/record.rb +0 -16
- data/lib/typekit/processing/converter/unknown.rb +0 -15
- data/lib/typekit/processing/translator.rb +0 -13
- data/lib/typekit/record/base.rb +0 -52
- data/spec/cassettes/index_kits_ok.yml +0 -16
- data/spec/cassettes/show_kits_xxx_families_yyy_ok.yml +0 -16
- data/spec/cassettes/show_kits_xxx_ok.yml +0 -17
- data/spec/features/client/delete_kit_spec.rb +0 -13
- data/spec/features/client/index_kits_spec.rb +0 -25
- data/spec/features/client/show_family_spec.rb +0 -47
- data/spec/features/client/show_kit_spec.rb +0 -18
- data/spec/features/client/show_library_spec.rb +0 -18
- data/spec/features/client/show_variation_spec.rb +0 -22
- data/spec/support/resource_helper.rb +0 -34
- data/spec/typekit/record/base_spec.rb +0 -85
- data/spec/typekit/record_spec.rb +0 -80
@@ -1,18 +0,0 @@
|
|
1
|
-
module Typekit
|
2
|
-
module Processing
|
3
|
-
module Converter
|
4
|
-
class Collection
|
5
|
-
def initialize(name)
|
6
|
-
@klass = Typekit::Record.classify(name)
|
7
|
-
raise Error, 'Unknown class' unless @klass
|
8
|
-
end
|
9
|
-
|
10
|
-
def process(response, collection_attributes)
|
11
|
-
collection_attributes.map do |attributes|
|
12
|
-
@klass.new(attributes)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module Typekit
|
2
|
-
module Processing
|
3
|
-
module Converter
|
4
|
-
class Errors
|
5
|
-
ERRORS = {
|
6
|
-
400 => 'There are errors in the data provided by your application',
|
7
|
-
401 => 'Authentication is needed to access the requested endpoint',
|
8
|
-
403 => 'Your application has been rate limited',
|
9
|
-
404 => 'You are requesting a resource that does not exist',
|
10
|
-
500 => 'The servers of Typekit are unable to process the request',
|
11
|
-
503 => 'The Typekit API is offline for maintenance'
|
12
|
-
}
|
13
|
-
ERRORS.default = 'Unknown server error'
|
14
|
-
|
15
|
-
def initialize(*_)
|
16
|
-
end
|
17
|
-
|
18
|
-
def process(response, errors)
|
19
|
-
raise Error, Array(errors || ERRORS[response.code]).join(', ')
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module Typekit
|
2
|
-
module Processing
|
3
|
-
module Converter
|
4
|
-
class Record
|
5
|
-
def initialize(name)
|
6
|
-
@klass = Typekit::Record.classify(name)
|
7
|
-
raise Error, 'Unknown class' unless @klass
|
8
|
-
end
|
9
|
-
|
10
|
-
def process(response, attributes)
|
11
|
-
@klass.new(attributes)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module Typekit
|
2
|
-
module Processing
|
3
|
-
class Translator
|
4
|
-
def process(result)
|
5
|
-
unless result.is_a?(Hash) && result.length == 1
|
6
|
-
raise Error, 'Unknown server response'
|
7
|
-
end
|
8
|
-
name, object = *result.first
|
9
|
-
Converter.build(name).process(result, object)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
data/lib/typekit/record/base.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
module Typekit
|
2
|
-
module Record
|
3
|
-
class Base
|
4
|
-
extend Forwardable
|
5
|
-
|
6
|
-
attr_reader :attributes
|
7
|
-
def_delegator :attributes, :to_json
|
8
|
-
|
9
|
-
def self.has_many(name)
|
10
|
-
possessions << name
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.possessions
|
14
|
-
@possessions ||= []
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.belongs_to(name)
|
18
|
-
owners << name
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.owners
|
22
|
-
@owners ||= []
|
23
|
-
end
|
24
|
-
|
25
|
-
def initialize(attributes = {})
|
26
|
-
attributes = { id: attributes } unless attributes.is_a?(Hash)
|
27
|
-
@attributes = Helper.symbolize_keys(attributes)
|
28
|
-
|
29
|
-
self.class.possessions.each do |name|
|
30
|
-
next unless @attributes.key?(name)
|
31
|
-
@attributes[name] = Collection.new(name, @attributes[name])
|
32
|
-
end
|
33
|
-
|
34
|
-
self.class.owners.each do |name|
|
35
|
-
next unless @attributes.key?(name)
|
36
|
-
@attributes[name] = Record.build(name, @attributes[name])
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def method_missing(name, *arguments)
|
41
|
-
if name.to_s =~ /^(?<name>.*)=$/
|
42
|
-
name = Regexp.last_match(:name).to_sym
|
43
|
-
return super unless @attributes.key?(name)
|
44
|
-
@attributes.send(:[]=, name, *arguments)
|
45
|
-
else
|
46
|
-
return super unless @attributes.key?(name)
|
47
|
-
@attributes.send(:[], name, *arguments)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
---
|
2
|
-
http_interactions:
|
3
|
-
- request:
|
4
|
-
method: get
|
5
|
-
uri: https://typekit.com/api/v1/json/kits
|
6
|
-
response:
|
7
|
-
status:
|
8
|
-
code: 200
|
9
|
-
message: OK
|
10
|
-
headers:
|
11
|
-
Status:
|
12
|
-
- 200 OK
|
13
|
-
body:
|
14
|
-
encoding: UTF-8
|
15
|
-
string: '{"kits":[{"id":"bas4cfe","link":"/api/v1/json/kits/bas4cfe"},{"id":"sfh6bkj","link":"/api/v1/json/kits/sfh6bkj"},{"id":"kof8zcn","link":"/api/v1/json/kits/kof8zcn"},{"id":"muq6mxx","link":"/api/v1/json/kits/muq6mxx"}]}'
|
16
|
-
recorded_at: Fri, 23 May 2014 00:00:00 GMT
|
@@ -1,16 +0,0 @@
|
|
1
|
-
---
|
2
|
-
http_interactions:
|
3
|
-
- request:
|
4
|
-
method: get
|
5
|
-
uri: https://typekit.com/api/v1/json/kits/xxx/families/yyy
|
6
|
-
response:
|
7
|
-
status:
|
8
|
-
code: 200
|
9
|
-
message: OK
|
10
|
-
headers:
|
11
|
-
Status:
|
12
|
-
- 200 OK
|
13
|
-
body:
|
14
|
-
encoding: UTF-8
|
15
|
-
string: '{"family":{"id":"vcsm","name":"Proxima Nova","slug":"proxima-nova","css_names":["proxima-nova"],"css_stack":"\"proxima-nova\",sans-serif","subset":"default","variations":["n1","n3","n4"]}}'
|
16
|
-
recorded_at: Fri, 06 Jun 2014 00:00:00 GMT
|
@@ -1,17 +0,0 @@
|
|
1
|
-
---
|
2
|
-
http_interactions:
|
3
|
-
- request:
|
4
|
-
method: get
|
5
|
-
uri: https://typekit.com/api/v1/json/kits/xxx
|
6
|
-
response:
|
7
|
-
status:
|
8
|
-
code: 200
|
9
|
-
message: OK
|
10
|
-
headers:
|
11
|
-
Status:
|
12
|
-
- 200 OK
|
13
|
-
body:
|
14
|
-
encoding: UTF-8
|
15
|
-
string: '{"kit":{"id":"bas4cfe","name":"Ivan Ukhov at LiU","analytics":false,"badge":false,"domains":["localhost","10.0.2.2","www.ida.liu.se/~ivauk83"],"families":[{"id":"vcsm","name":"Proxima
|
16
|
-
Nova","slug":"proxima-nova","css_names":["proxima-nova"],"css_stack":"\"proxima-nova\",sans-serif","subset":"default","variations":["n1","n3","n4"]},{"id":"vybr","name":"Calluna","slug":"calluna","css_names":["calluna"],"css_stack":"\"calluna\",serif","subset":"default","variations":["n4","i4"]}]}}'
|
17
|
-
recorded_at: Thu, 05 Jun 2014 00:00:00 GMT
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe 'Client#delete a kit' do
|
4
|
-
let(:subject) { Typekit::Client.new(token: 'arbitrary') }
|
5
|
-
|
6
|
-
options = { vcr: { cassette_name: 'delete_kits_xxx_ok' } }
|
7
|
-
|
8
|
-
let(:result) { subject.delete(:kits, 'xxx') }
|
9
|
-
|
10
|
-
it 'returns true', options do
|
11
|
-
expect(result).to be true
|
12
|
-
end
|
13
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe 'Client#index kits' do
|
4
|
-
let(:subject) { Typekit::Client.new(token: 'arbitrary') }
|
5
|
-
|
6
|
-
context 'when successful' do
|
7
|
-
options = { vcr: { cassette_name: 'index_kits_ok' } }
|
8
|
-
|
9
|
-
let(:result) { subject.index(:kits) }
|
10
|
-
|
11
|
-
it 'returns Records', options do
|
12
|
-
expect(result.map(&:class).uniq).to \
|
13
|
-
contain_exactly(Typekit::Record::Kit)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'when unauthorized' do
|
18
|
-
options = { vcr: { cassette_name: 'index_kits_unauthorized' } }
|
19
|
-
|
20
|
-
it 'raises exceptions', options do
|
21
|
-
expect { subject.index(:kits) }.to \
|
22
|
-
raise_error(Typekit::Processing::Error, /Not authorized/i)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe 'Client#show a family' do
|
4
|
-
let(:subject) { Typekit::Client.new(token: 'arbitrary') }
|
5
|
-
|
6
|
-
shared_examples 'an adequate reader' do |options|
|
7
|
-
it 'returns a Family', options do
|
8
|
-
expect(result).to be_kind_of(Typekit::Record::Family)
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'returns a Family with Variations', options do
|
12
|
-
expect(result.variations.map(&:class).uniq).to \
|
13
|
-
contain_exactly(Typekit::Record::Variation)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'when looking up directly' do
|
18
|
-
options = { vcr: { cassette_name: 'show_families_xxx_ok' } }
|
19
|
-
|
20
|
-
let(:result) { subject.show(:families, 'xxx') }
|
21
|
-
|
22
|
-
it_behaves_like 'an adequate reader', options
|
23
|
-
|
24
|
-
it 'returns a Family with Libraries', options do
|
25
|
-
expect(result.libraries.map(&:class).uniq).to \
|
26
|
-
contain_exactly(Typekit::Record::Library)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context 'when looking up through a kit' do
|
31
|
-
options = { vcr: { cassette_name: 'show_kits_xxx_families_yyy_ok' } }
|
32
|
-
|
33
|
-
let(:result) { subject.show(:kits, 'xxx', :families, 'yyy') }
|
34
|
-
|
35
|
-
it_behaves_like 'an adequate reader', options
|
36
|
-
end
|
37
|
-
|
38
|
-
context 'when looking up directly via slugs' do
|
39
|
-
options = { vcr: { cassette_name: 'show_families_xxx_found' } }
|
40
|
-
|
41
|
-
let(:result) { subject.show(:families, 'xxx') }
|
42
|
-
|
43
|
-
it 'returns a Family', options do
|
44
|
-
expect(result).to be_kind_of(Typekit::Record::Family)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe 'Client#show a kit' do
|
4
|
-
let(:subject) { Typekit::Client.new(token: 'arbitrary') }
|
5
|
-
|
6
|
-
options = { vcr: { cassette_name: 'show_kits_xxx_ok' } }
|
7
|
-
|
8
|
-
let(:result) { subject.show(:kits, 'xxx') }
|
9
|
-
|
10
|
-
it 'returns a Kit', options do
|
11
|
-
expect(result).to be_kind_of(Typekit::Record::Kit)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'returns a Kit with Families', options do
|
15
|
-
expect(result.families.map(&:class).uniq).to \
|
16
|
-
contain_exactly(Typekit::Record::Family)
|
17
|
-
end
|
18
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe 'Client#show a library' do
|
4
|
-
let(:subject) { Typekit::Client.new(token: 'arbitrary') }
|
5
|
-
|
6
|
-
options = { vcr: { cassette_name: 'show_libraries_xxx_ok' } }
|
7
|
-
|
8
|
-
let(:result) { subject.show(:libraries, 'xxx') }
|
9
|
-
|
10
|
-
it 'returns a Library', options do
|
11
|
-
expect(result).to be_kind_of(Typekit::Record::Library)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'returns a Library with Families', options do
|
15
|
-
expect(result.families.map(&:class).uniq).to \
|
16
|
-
contain_exactly(Typekit::Record::Family)
|
17
|
-
end
|
18
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe 'Client#show a variation' do
|
4
|
-
let(:subject) { Typekit::Client.new(token: 'arbitrary') }
|
5
|
-
|
6
|
-
options = { vcr: { cassette_name: 'show_families_xxx_yyy_ok' } }
|
7
|
-
|
8
|
-
let(:result) { subject.show(:families, 'xxx', 'yyy') }
|
9
|
-
|
10
|
-
it 'returns a Variation', options do
|
11
|
-
expect(result).to be_kind_of(Typekit::Record::Variation)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'returns a Variation with Libraries', options do
|
15
|
-
expect(result.libraries.map(&:class).uniq).to \
|
16
|
-
contain_exactly(Typekit::Record::Library)
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'returns a Variation with a Family', options do
|
20
|
-
expect(result.family).to be_kind_of(Typekit::Record::Family)
|
21
|
-
end
|
22
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module ResourceHelper
|
2
|
-
RECORD_NAMES = %w{family kit library variation}
|
3
|
-
COLLECTION_NAMES = %w{families kits libraries variations}
|
4
|
-
|
5
|
-
def record_names
|
6
|
-
RECORD_CLASS_NAMES
|
7
|
-
end
|
8
|
-
|
9
|
-
def record_symbols
|
10
|
-
@record_symbols ||= RECORD_NAMES.map(&:to_sym)
|
11
|
-
end
|
12
|
-
|
13
|
-
def record_classes
|
14
|
-
@record_classes ||= RECORD_NAMES.map do |name|
|
15
|
-
Typekit::Record.const_get(name.capitalize)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def collection_names
|
20
|
-
COLLECTION_NAMES
|
21
|
-
end
|
22
|
-
|
23
|
-
def collection_symbols
|
24
|
-
@collection_symbols ||= COLLECTION_NAMES.map(&:to_sym)
|
25
|
-
end
|
26
|
-
|
27
|
-
def record_mapping
|
28
|
-
@record_mapping ||= Hash[record_symbols.clone.zip(record_classes)]
|
29
|
-
end
|
30
|
-
|
31
|
-
def collection_mapping
|
32
|
-
@collection_mapping ||= Hash[collection_symbols.clone.zip(record_classes)]
|
33
|
-
end
|
34
|
-
end
|
@@ -1,85 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe Typekit::Record::Base do
|
4
|
-
let(:subject_module) { Typekit::Record }
|
5
|
-
|
6
|
-
def create_class
|
7
|
-
Class.new(subject_module::Base)
|
8
|
-
end
|
9
|
-
|
10
|
-
let(:subject_class) { create_class }
|
11
|
-
|
12
|
-
describe '.has_many' do
|
13
|
-
it 'declares one-to-many relations between Records' do
|
14
|
-
expect { subject_class.has_many(:sections) }.not_to raise_error
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe '.belongs_to' do
|
19
|
-
it 'declares one-to-one relations between Records' do
|
20
|
-
expect { subject_class.belongs_to(:article) }.not_to raise_error
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe '#new' do
|
25
|
-
it 'treats each option as an attribute' do
|
26
|
-
subject = subject_class.new(name: 'Awesome')
|
27
|
-
expect { subject.name = 'Superb' }.to \
|
28
|
-
change { subject.name }.from('Awesome').to('Superb')
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'handles attribute names given as strings' do
|
32
|
-
subject = subject_class.new('name' => 'Awesome')
|
33
|
-
expect { subject.name = 'Superb' }.to \
|
34
|
-
change { subject.name }.from('Awesome').to('Superb')
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
context 'when there are one-to-many relations defined' do
|
39
|
-
let(:another_class) { create_class }
|
40
|
-
|
41
|
-
before(:example) do
|
42
|
-
allow(subject_module).to receive(:classify).and_return(another_class)
|
43
|
-
subject_class.has_many(:sections)
|
44
|
-
end
|
45
|
-
|
46
|
-
describe '#new' do
|
47
|
-
context 'when the attributes of the relations are given' do
|
48
|
-
subject do
|
49
|
-
subject_class.new(sections: [ { title: 'First' },
|
50
|
-
{ title: 'Second' } ])
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'initializes relations as Collections' do
|
54
|
-
expect(subject.sections).to be_kind_of(Typekit::Collection)
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'initializes Collections based on the attributes' do
|
58
|
-
expect(subject.sections.map(&:title)).to \
|
59
|
-
contain_exactly('First', 'Second')
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
context 'when the attributes of the relations are missing' do
|
64
|
-
subject { subject_class.new }
|
65
|
-
|
66
|
-
it 'does not initialize Collections' do
|
67
|
-
expect { subject.sections }.to raise_error(NoMethodError)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
describe '#attributes' do
|
74
|
-
it 'returns all attributes' do
|
75
|
-
subject = subject_class.new(id: 1, name: 'Awesome')
|
76
|
-
expect(subject.attributes).to eq(id: 1, name: 'Awesome')
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'reflects attribute assignments' do
|
80
|
-
subject = subject_class.new(id: 1)
|
81
|
-
subject.id = 42
|
82
|
-
expect(subject.attributes).to eq(id: 42)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|