typekit-client 0.0.4 → 0.0.5
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/CHANGELOG.md +6 -0
- data/Guardfile +18 -4
- data/README.md +62 -39
- data/bin/{typekit → typekit-client} +14 -1
- data/bin/typekit-publisher +89 -0
- data/lib/typekit/client.rb +6 -10
- data/lib/typekit/collection.rb +15 -0
- data/lib/typekit/core.rb +3 -3
- data/lib/typekit/helper.rb +4 -0
- data/lib/typekit/processing/converter/boolean.rb +3 -0
- data/lib/typekit/processing/converter/collection.rb +18 -0
- data/lib/typekit/processing/converter/datetime.rb +3 -0
- data/lib/typekit/processing/converter/errors.rb +3 -1
- data/lib/typekit/processing/converter/record.rb +2 -1
- data/lib/typekit/processing/converter.rb +8 -13
- data/lib/typekit/record/base.rb +30 -8
- data/lib/typekit/record/family.rb +2 -1
- data/lib/typekit/record/kit.rb +1 -1
- data/lib/typekit/record/library.rb +1 -1
- data/lib/typekit/record/variation.rb +2 -2
- data/lib/typekit/record.rb +18 -18
- data/lib/typekit/version.rb +1 -1
- data/lib/typekit.rb +2 -0
- data/spec/cassettes/{show_families_calluna_found.yml → show_families_xxx_found.yml} +1 -1
- data/spec/cassettes/show_families_xxx_ok.yml +31 -0
- data/spec/cassettes/show_families_xxx_yyy_ok.yml +20 -0
- data/spec/cassettes/show_kits_xxx_families_yyy_ok.yml +16 -0
- data/spec/cassettes/show_kits_xxx_ok.yml +17 -0
- data/spec/cassettes/show_libraries_xxx_ok.yml +31 -0
- data/spec/features/client/delete_kit_spec.rb +13 -0
- data/spec/features/client/index_kits_spec.rb +25 -0
- data/spec/features/client/show_family_spec.rb +47 -0
- data/spec/features/client/show_kit_spec.rb +18 -0
- data/spec/features/client/show_library_spec.rb +18 -0
- data/spec/features/client/show_variation_spec.rb +22 -0
- data/spec/spec_helper.rb +3 -5
- data/spec/support/resource_helper.rb +34 -0
- data/spec/typekit/helper_spec.rb +12 -5
- data/spec/typekit/processing/converter_spec.rb +1 -1
- data/spec/typekit/record/base_spec.rb +56 -3
- data/spec/typekit/record_spec.rb +57 -24
- data/typekit-client.gemspec +1 -1
- metadata +36 -13
- data/lib/typekit/processing/converter/records.rb +0 -18
- data/spec/support/rest_helper.rb +0 -22
- data/spec/typekit/client_spec.rb +0 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2d0603ce4ff30ecb04ccf846ba94cf71b0e8d54
|
4
|
+
data.tar.gz: a85ce05a15a5aa3b0cea5b1e0122ccd0b8db6eb8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a661e632bae645066c291a078fdd60ce727d137e3bd5edf4778dbe5dad1554f18e1f88d99c4dbbea0bc92e09d042c7486c64c30fa77e3984ac3b0145e40d6f38
|
7
|
+
data.tar.gz: 60bfc3980c3128be77545fb6be4e8d88edd436b773f30a09cc930868f666b001ea1227e2c6e5bcbb17e7790273fa48f0df0e3c644b8426b8f140ca469e890404
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## Typekit Client 0.0.5 (June 10, 2014)
|
2
|
+
* New name for the general CLI: `typekit-client` instead of `typekit`.
|
3
|
+
* New CLI for the sole purpose of publishing kits: `typekit-publisher`.
|
4
|
+
* Relations between resources (a kit has families, a family has variations,
|
5
|
+
a variation belongs to a family, etc.).
|
6
|
+
|
1
7
|
## Typekit Client 0.0.4 (June 1, 2014)
|
2
8
|
* Extraction of the RESTful API logic into a separate gem called
|
3
9
|
[Apitizer](https://github.com/IvanUkhov/apitizer).
|
data/Guardfile
CHANGED
@@ -1,7 +1,21 @@
|
|
1
1
|
guard :rspec do
|
2
2
|
watch(%r{^spec/.+_spec\.rb$})
|
3
|
-
watch(
|
4
|
-
watch(%r{^
|
5
|
-
|
6
|
-
|
3
|
+
watch(%r{^spec/.+_helper\.rb$}) { 'spec' }
|
4
|
+
watch(%r{^lib/(.+)\.rb$}) do |match|
|
5
|
+
result = "spec/#{ match[1] }_spec.rb"
|
6
|
+
begin
|
7
|
+
break if File.exist?(result)
|
8
|
+
result = File.dirname(result)
|
9
|
+
end until result.empty?
|
10
|
+
result
|
11
|
+
end
|
12
|
+
watch(%r{^lib/[^/]+/(.+)\.rb$}) do |match|
|
13
|
+
result = "spec/features/#{ match[1] }"
|
14
|
+
begin
|
15
|
+
break if File.exist?(result)
|
16
|
+
result = File.dirname(result)
|
17
|
+
end until result.empty?
|
18
|
+
result
|
19
|
+
end
|
7
20
|
end
|
21
|
+
# vim: ft=ruby
|
data/README.md
CHANGED
@@ -2,24 +2,24 @@
|
|
2
2
|
A Ruby library for accessing the [Typekit API](https://typekit.com/docs/api).
|
3
3
|
|
4
4
|
## Installation
|
5
|
-
|
5
|
+
The minimal supported version of Ruby is `2.1`. The simplest way to install
|
6
|
+
Ruby is via [rvm](https://rvm.io/):
|
6
7
|
```bash
|
7
|
-
$
|
8
|
-
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
|
8
|
+
$ curl -sSL https://get.rvm.io | bash -s stable --ruby=2.1
|
9
9
|
```
|
10
10
|
|
11
|
-
|
11
|
+
Now you can install the library itself:
|
12
12
|
```bash
|
13
|
-
$
|
14
|
-
$ rvm install 2.1
|
13
|
+
$ gem install typekit-client
|
15
14
|
```
|
16
15
|
|
17
|
-
|
16
|
+
If you are planning to use the gem as a part of your project, add the
|
17
|
+
following line into your `Gemfile`:
|
18
18
|
```ruby
|
19
19
|
gem 'typekit-client', require: 'typekit'
|
20
20
|
```
|
21
21
|
|
22
|
-
Then
|
22
|
+
Then execute:
|
23
23
|
```bash
|
24
24
|
$ bundle
|
25
25
|
```
|
@@ -39,26 +39,17 @@ require 'typekit'
|
|
39
39
|
client = Typekit::Client.new(token: ENV['tk_token'])
|
40
40
|
```
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
```
|
46
|
-
|
47
|
-
The main method of `client` is `perform(action, *path, parameters = {})`.
|
48
|
-
The arguments are as follows:
|
49
|
-
* `action` is the action that you would like to perform on a resource, and
|
50
|
-
it can be one of `:index`, `:show`, `:create`, `:update`, or `:delete`;
|
42
|
+
`client` has five methods: `index`, `show`, `create`, `update`, and `delete`.
|
43
|
+
The signature of each method is `action(*path, parameters = {})`. The
|
44
|
+
arguments are as follows:
|
51
45
|
* `*path` refers to an arbitrary number of arguments needed to identify
|
52
|
-
the
|
53
|
-
|
54
|
-
* `parameters` is a hash of parameters needed to perform the action.
|
46
|
+
the endpoint of interest (a plenty of examples are given below);
|
47
|
+
* `parameters` is a hash of parameters (optional).
|
55
48
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
`action` can be performed on that resource. So, if you receive an exception,
|
61
|
-
check the [API reference](https://typekit.com/docs/api/).
|
49
|
+
Before sending the actual request to the Typekit API, the library checks
|
50
|
+
whether the endpoint given by `*path` exists and, if it does, whether
|
51
|
+
the desired action (`index`, `show`, _etc._) is permitted. So, if you
|
52
|
+
receive an exception, check the [API reference](https://typekit.com/docs/api/).
|
62
53
|
|
63
54
|
Now, let us have a look at some typical use cases. For clarity, the code
|
64
55
|
below makes use of the following auxiliary function:
|
@@ -70,7 +61,7 @@ rescue JSON::GeneratorError
|
|
70
61
|
end
|
71
62
|
```
|
72
63
|
|
73
|
-
###
|
64
|
+
### List all kits
|
74
65
|
Code:
|
75
66
|
```ruby
|
76
67
|
p kits = client.index(:kits)
|
@@ -107,7 +98,7 @@ Output:
|
|
107
98
|
"/api/v1/json/kits/bas4cfe"
|
108
99
|
```
|
109
100
|
|
110
|
-
### Show the description of a
|
101
|
+
### Show the description of a variation of a font family
|
111
102
|
Code:
|
112
103
|
```ruby
|
113
104
|
p client.show(:families, 'vcsm', 'i9')
|
@@ -299,14 +290,14 @@ Output:
|
|
299
290
|
true
|
300
291
|
```
|
301
292
|
|
302
|
-
## Command-line Interface
|
303
|
-
There is a simple
|
293
|
+
## General Command-line Interface
|
294
|
+
There is a simple tool provided in order to demonstrate the usage of the
|
304
295
|
library and to give the ability to perform basic operations without writing
|
305
|
-
any code. The tool is called `typekit`, and it should get installed
|
306
|
-
with the gem. Try running:
|
296
|
+
any code. The tool is called `typekit-client`, and it should get installed
|
297
|
+
along with the gem. Try running:
|
307
298
|
```
|
308
|
-
$ typekit -h
|
309
|
-
Usage: typekit [options] [command]
|
299
|
+
$ typekit-client -h
|
300
|
+
Usage: typekit-client [options] [command]
|
310
301
|
|
311
302
|
Required options:
|
312
303
|
-t, --token TOKEN Set the API token
|
@@ -315,16 +306,16 @@ Other options:
|
|
315
306
|
-h, --help Show this message
|
316
307
|
```
|
317
308
|
|
318
|
-
Alternatively, you can install `typekit` in the `bin` directory of
|
319
|
-
project using the following command:
|
309
|
+
Alternatively, you can install `typekit-client` in the `bin` directory of
|
310
|
+
your project using the following command:
|
320
311
|
```bash
|
321
|
-
$ bundle binstubs typekit
|
312
|
+
$ bundle binstubs typekit-client
|
322
313
|
```
|
323
314
|
|
324
315
|
The tool has two modes: normal and interactive. If `command` is provided,
|
325
316
|
the tool executes only that particular command and terminates:
|
326
317
|
```
|
327
|
-
$ typekit -t $tk_token index kits
|
318
|
+
$ typekit-client -t $tk_token index kits
|
328
319
|
[
|
329
320
|
{
|
330
321
|
"id": "bas4cfe",
|
@@ -338,7 +329,7 @@ $
|
|
338
329
|
If `command` is not provided, the tool gives a command prompt wherein one
|
339
330
|
can enter multiple commands:
|
340
331
|
```
|
341
|
-
$ typekit -t $tk_token
|
332
|
+
$ typekit-client -t $tk_token
|
342
333
|
Type 'help' for help and 'exit' to exit.
|
343
334
|
> help
|
344
335
|
Usage: <action> <resource> [parameters]
|
@@ -368,6 +359,38 @@ Bye.
|
|
368
359
|
$
|
369
360
|
```
|
370
361
|
|
362
|
+
## Publishing Command-line Interface
|
363
|
+
There is another utility with the sole purpose of publishing kits. The tool
|
364
|
+
is called `typekit-publisher`:
|
365
|
+
|
366
|
+
```
|
367
|
+
$ typekit-publisher -h
|
368
|
+
Usage: typekit-publisher [options]
|
369
|
+
|
370
|
+
Required options:
|
371
|
+
-t, --token TOKEN Set the API token
|
372
|
+
|
373
|
+
Other options:
|
374
|
+
-h, --help Show this message
|
375
|
+
```
|
376
|
+
|
377
|
+
Using `typekit-publisher`, you can publish all your kits at once. Here is
|
378
|
+
an example:
|
379
|
+
|
380
|
+
```
|
381
|
+
$ typekit-publisher -t $tk_token
|
382
|
+
Which kit would you like to publish?
|
383
|
+
1. bas4cfe
|
384
|
+
2. sfh6bkj
|
385
|
+
3. kof8zcn
|
386
|
+
4. all
|
387
|
+
> 4
|
388
|
+
Publishing bas4cfe... Done.
|
389
|
+
Publishing sfh6bkj... Done.
|
390
|
+
Publishing kof8zcn... Done.
|
391
|
+
Bye.
|
392
|
+
```
|
393
|
+
|
371
394
|
## Contributing
|
372
395
|
1. Fork it ( https://github.com/IvanUkhov/typekit-client/fork )
|
373
396
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
@@ -79,7 +79,7 @@ end
|
|
79
79
|
options = {}
|
80
80
|
|
81
81
|
parser = OptionParser.new do |o|
|
82
|
-
o.banner = 'Usage: typekit [options] [command]'
|
82
|
+
o.banner = 'Usage: typekit-client [options] [command]'
|
83
83
|
|
84
84
|
o.separator ''
|
85
85
|
o.separator 'Required options:'
|
@@ -103,6 +103,19 @@ rescue
|
|
103
103
|
exit
|
104
104
|
end
|
105
105
|
|
106
|
+
unless options[:token]
|
107
|
+
puts <<-MESSAGE
|
108
|
+
You have not specified your API token. Try generating one here:
|
109
|
+
|
110
|
+
https://typekit.com/account/tokens
|
111
|
+
|
112
|
+
Then run:
|
113
|
+
|
114
|
+
$ typekit-client -t YOUR_TOKEN_GOES_HERE
|
115
|
+
MESSAGE
|
116
|
+
exit
|
117
|
+
end
|
118
|
+
|
106
119
|
begin
|
107
120
|
controller = Controller.new(options)
|
108
121
|
rescue Exception => e
|
@@ -0,0 +1,89 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
|
4
|
+
|
5
|
+
require 'typekit'
|
6
|
+
require 'readline'
|
7
|
+
require 'optparse'
|
8
|
+
|
9
|
+
options = {}
|
10
|
+
|
11
|
+
parser = OptionParser.new do |o|
|
12
|
+
o.banner = 'Usage: typekit-publisher [options]'
|
13
|
+
|
14
|
+
o.separator ''
|
15
|
+
o.separator 'Required options:'
|
16
|
+
|
17
|
+
o.on('-t', '--token TOKEN', 'Set the API token') do |value|
|
18
|
+
options[:token] = value
|
19
|
+
end
|
20
|
+
|
21
|
+
o.separator ''
|
22
|
+
o.separator 'Other options:'
|
23
|
+
|
24
|
+
o.on_tail('-h', '--help', 'Show this message') do
|
25
|
+
raise
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
begin
|
30
|
+
parser.parse!
|
31
|
+
rescue
|
32
|
+
puts parser
|
33
|
+
exit
|
34
|
+
end
|
35
|
+
|
36
|
+
unless options[:token]
|
37
|
+
puts <<-MESSAGE
|
38
|
+
You have not specified your API token. Try generating one here:
|
39
|
+
|
40
|
+
https://typekit.com/account/tokens
|
41
|
+
|
42
|
+
Then run:
|
43
|
+
|
44
|
+
$ typekit-publisher -t YOUR_TOKEN_GOES_HERE
|
45
|
+
MESSAGE
|
46
|
+
exit
|
47
|
+
end
|
48
|
+
|
49
|
+
$client = Typekit::Client.new(token: options[:token])
|
50
|
+
|
51
|
+
def process(*arguments)
|
52
|
+
$client.process(*arguments)
|
53
|
+
rescue Typekit::Error => e
|
54
|
+
puts e
|
55
|
+
exit
|
56
|
+
end
|
57
|
+
|
58
|
+
kits = process(:index, :kits)
|
59
|
+
|
60
|
+
puts 'Which kit would you like to publish?'
|
61
|
+
kits.each_with_index do |kit, i|
|
62
|
+
puts "%4d. %s" % [ i + 1, kit.id ]
|
63
|
+
end
|
64
|
+
puts "%4d. all" % [ kits.length + 1 ]
|
65
|
+
|
66
|
+
k = Readline.readline('> ')
|
67
|
+
if k.nil? || k.empty?
|
68
|
+
puts 'None? OK.'
|
69
|
+
exit
|
70
|
+
end
|
71
|
+
|
72
|
+
k = k.to_i
|
73
|
+
|
74
|
+
if k < 1 || k > kits.length + 1
|
75
|
+
puts 'Invalid option. Try again.'
|
76
|
+
exit
|
77
|
+
end
|
78
|
+
|
79
|
+
range = k == kits.length + 1 ? 0...kits.length : [ k - 1 ]
|
80
|
+
|
81
|
+
range.each do |i|
|
82
|
+
print "Publishing #{ kits[i].id }..."
|
83
|
+
process(:update, :kits, kits[i].id, :publish)
|
84
|
+
puts ' Done.'
|
85
|
+
end
|
86
|
+
|
87
|
+
puts 'Bye.'
|
88
|
+
|
89
|
+
# vim: set ft=ruby
|
data/lib/typekit/client.rb
CHANGED
@@ -18,12 +18,12 @@ module Typekit
|
|
18
18
|
|
19
19
|
private
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
def engine
|
22
|
+
@engine ||= build_engine
|
23
|
+
end
|
24
|
+
|
25
|
+
def translator
|
26
|
+
@translator ||= Processing::Translator.new
|
27
27
|
end
|
28
28
|
|
29
29
|
def build_engine
|
@@ -37,9 +37,5 @@ module Typekit
|
|
37
37
|
instance_exec(version, format, &Typekit.schema)
|
38
38
|
end
|
39
39
|
end
|
40
|
-
|
41
|
-
def build_translator
|
42
|
-
Processing::Translator.new
|
43
|
-
end
|
44
40
|
end
|
45
41
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Typekit
|
2
|
+
class Collection
|
3
|
+
extend Forwardable
|
4
|
+
|
5
|
+
def_delegator :@records, :to_json
|
6
|
+
def_delegators :@records, :each, :map, :[], :size, :length
|
7
|
+
|
8
|
+
def initialize(name, collection_attributes = nil)
|
9
|
+
@klass = Record.classify(name)
|
10
|
+
@records = collection_attributes.map do |attributes|
|
11
|
+
@klass.new(attributes)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/typekit/core.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
module Typekit
|
2
2
|
Error = Class.new(StandardError)
|
3
3
|
|
4
|
-
@defaults = { version: 1, format: :json }
|
4
|
+
@defaults = { version: 1, format: :json }
|
5
5
|
|
6
6
|
@schema = Proc.new do |version, format|
|
7
7
|
address "https://typekit.com/api/v#{ version }/#{ format }"
|
8
8
|
|
9
9
|
resources :families, only: :show do
|
10
|
-
show ':
|
10
|
+
show ':variation', on: :member
|
11
11
|
end
|
12
12
|
|
13
13
|
resources :kits do
|
@@ -19,7 +19,7 @@ module Typekit
|
|
19
19
|
resources :libraries, only: [ :index, :show ]
|
20
20
|
end
|
21
21
|
|
22
|
-
@dictionary = { :update => :post }
|
22
|
+
@dictionary = { :update => :post } # not PUT
|
23
23
|
|
24
24
|
@headers = Proc.new do |token|
|
25
25
|
{ 'X-Typekit-Token' => token }
|
data/lib/typekit/helper.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
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
|
@@ -11,7 +11,9 @@ module Typekit
|
|
11
11
|
503 => 'The Typekit API is offline for maintenance'
|
12
12
|
}
|
13
13
|
ERRORS.default = 'Unknown server error'
|
14
|
-
|
14
|
+
|
15
|
+
def initialize(*_)
|
16
|
+
end
|
15
17
|
|
16
18
|
def process(response, errors)
|
17
19
|
raise Error, Array(errors || ERRORS[response.code]).join(', ')
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require_relative 'converter/record'
|
2
|
-
require_relative 'converter/
|
2
|
+
require_relative 'converter/collection'
|
3
3
|
require_relative 'converter/boolean'
|
4
4
|
require_relative 'converter/datetime'
|
5
5
|
require_relative 'converter/errors'
|
@@ -9,24 +9,19 @@ module Typekit
|
|
9
9
|
module Processing
|
10
10
|
module Converter
|
11
11
|
MAPPING = {
|
12
|
+
:record => Record,
|
13
|
+
:collection => Collection,
|
14
|
+
|
12
15
|
'ok' => Boolean,
|
13
16
|
'errors' => Errors,
|
14
17
|
'published' => DateTime,
|
18
|
+
|
15
19
|
nil => Errors
|
16
|
-
}
|
20
|
+
}
|
21
|
+
MAPPING.default = Unknown
|
17
22
|
|
18
23
|
def self.build(name)
|
19
|
-
|
20
|
-
MAPPING[name].new
|
21
|
-
elsif Typekit::Record.collection?(name)
|
22
|
-
Records.new(name)
|
23
|
-
elsif Typekit::Record.member?(name)
|
24
|
-
Record.new(name)
|
25
|
-
else
|
26
|
-
Unknown.new(name)
|
27
|
-
end
|
28
|
-
rescue NameError
|
29
|
-
raise Error, 'Unknown converter'
|
24
|
+
MAPPING[Typekit::Record.identify(name) || name].new(name)
|
30
25
|
end
|
31
26
|
end
|
32
27
|
end
|
data/lib/typekit/record/base.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
|
3
1
|
module Typekit
|
4
2
|
module Record
|
5
3
|
class Base
|
@@ -8,23 +6,47 @@ module Typekit
|
|
8
6
|
attr_reader :attributes
|
9
7
|
def_delegator :attributes, :to_json
|
10
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
|
+
|
11
25
|
def initialize(attributes = {})
|
12
|
-
|
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
|
13
38
|
end
|
14
39
|
|
15
40
|
def method_missing(name, *arguments)
|
16
41
|
if name.to_s =~ /^(?<name>.*)=$/
|
17
42
|
name = Regexp.last_match(:name).to_sym
|
18
|
-
return super unless arguments.length == 1
|
19
43
|
return super unless @attributes.key?(name)
|
20
|
-
@attributes[
|
44
|
+
@attributes.send(:[]=, name, *arguments)
|
21
45
|
else
|
22
|
-
return super unless arguments.length.zero?
|
23
46
|
return super unless @attributes.key?(name)
|
24
|
-
@attributes[name
|
47
|
+
@attributes.send(:[], name, *arguments)
|
25
48
|
end
|
26
49
|
end
|
27
50
|
end
|
28
51
|
end
|
29
52
|
end
|
30
|
-
|
data/lib/typekit/record/kit.rb
CHANGED