typekit-client 0.0.5 → 0.0.6
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.
- 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
|