typekit-client 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -1
  3. data/README.md +1 -4
  4. data/bin/typekit +0 -8
  5. data/lib/typekit.rb +3 -5
  6. data/lib/typekit/client.rb +28 -21
  7. data/lib/typekit/core.rb +23 -8
  8. data/lib/typekit/helper.rb +0 -40
  9. data/lib/typekit/processing.rb +0 -1
  10. data/lib/typekit/processing/converter.rb +2 -1
  11. data/lib/typekit/processing/converter/unknown.rb +2 -1
  12. data/lib/typekit/processing/translator.rb +6 -9
  13. data/lib/typekit/record.rb +2 -2
  14. data/lib/typekit/version.rb +1 -1
  15. data/spec/spec_helper.rb +1 -0
  16. data/spec/typekit/client_spec.rb +1 -3
  17. data/spec/typekit/helper_spec.rb +0 -88
  18. data/spec/typekit/processing/converter_spec.rb +1 -2
  19. data/spec/typekit/record/base_spec.rb +0 -1
  20. data/spec/typekit/record_spec.rb +0 -1
  21. data/typekit-client.gemspec +3 -3
  22. metadata +18 -41
  23. data/lib/typekit/configuration.rb +0 -16
  24. data/lib/typekit/configuration/base.rb +0 -21
  25. data/lib/typekit/configuration/default.rb +0 -38
  26. data/lib/typekit/connection.rb +0 -10
  27. data/lib/typekit/connection/adaptor.rb +0 -13
  28. data/lib/typekit/connection/adaptor/standard.rb +0 -32
  29. data/lib/typekit/connection/dispatcher.rb +0 -17
  30. data/lib/typekit/connection/request.rb +0 -26
  31. data/lib/typekit/connection/response.rb +0 -16
  32. data/lib/typekit/processing/parser.rb +0 -14
  33. data/lib/typekit/processing/parser/json.rb +0 -15
  34. data/lib/typekit/processing/parser/yaml.rb +0 -15
  35. data/lib/typekit/routing.rb +0 -9
  36. data/lib/typekit/routing/mapper.rb +0 -43
  37. data/lib/typekit/routing/node.rb +0 -5
  38. data/lib/typekit/routing/node/base.rb +0 -46
  39. data/lib/typekit/routing/node/collection.rb +0 -34
  40. data/lib/typekit/routing/node/operation.rb +0 -32
  41. data/lib/typekit/routing/node/root.rb +0 -8
  42. data/lib/typekit/routing/node/scope.rb +0 -19
  43. data/lib/typekit/routing/proxy.rb +0 -17
  44. data/spec/typekit/configuration_spec.rb +0 -50
  45. data/spec/typekit/connection/adaptor_spec.rb +0 -24
  46. data/spec/typekit/connection/dispatcher_spec.rb +0 -36
  47. data/spec/typekit/connection/request_spec.rb +0 -13
  48. data/spec/typekit/connection/response_spec.rb +0 -18
  49. data/spec/typekit/processing/parser_spec.rb +0 -23
  50. data/spec/typekit/routing/mapper_spec.rb +0 -177
  51. data/spec/typekit/routing/node_spec.rb +0 -61
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 88f79a82bec7c431919822610e0b780faaa7c5aa
4
- data.tar.gz: 13dff8c0ffb2cd4df92f76cb89574e11ef8644e4
3
+ metadata.gz: 2bc086a0bb50bb480f485bbef88d7bebdcc25356
4
+ data.tar.gz: f8d01ce2b825b203f8df1ec09607549800987c64
5
5
  SHA512:
6
- metadata.gz: 568ade996d80ad36f2af3d374f4ef71cc0cebf6d56b7c2be718277967def5b82fd65fded286d5d21fde117f7251439809c809a05b25db6441ec092a7fca55b91
7
- data.tar.gz: f0644585301a5fe1b8ee6384f6076c603c4265747e0dc390330c201d5d3d0c003a4d7f5c53da2a4c78f01bfb807a4f66b109df6674084890ac1b33bdf3d66a34
6
+ metadata.gz: 632b2218c382aac4717d5aebbb612ccf670c83f36ca0b12ac7b1d1a83018f4d2714893638d39dc10f6c032b6ec473a06a683e7a70e50227cb9ae512c5f2b9997
7
+ data.tar.gz: 6a55fc36b622cb55a54512abbe3b8648efcae9b4f207928e40191b094781a50c18d225dedc7db5fdc48e3f7d961ed60c0952528acde0824fdc7d3844babdc736
data/CHANGELOG.md CHANGED
@@ -1,4 +1,9 @@
1
- ## Typekit Client (master)
1
+ ## Typekit Client 0.0.4 (June 1, 2014)
2
+ * Extraction of the RESTful API logic into a separate gem called
3
+ [Apitizer](https://github.com/IvanUkhov/apitizer).
4
+ * Elimination of the `--version` and `--format` options of the CLI.
5
+
6
+ ## Typekit Client 0.0.3 (May 31, 2014)
2
7
  * Object-restful mapping (families, kits, etc. got proper classes).
3
8
  * Command history and tab completion in the CLI.
4
9
 
data/README.md CHANGED
@@ -272,7 +272,7 @@ p client.show(:kits, kit.id, :published)
272
272
  ```
273
273
 
274
274
  Output:
275
- ```
275
+ ```json
276
276
  {
277
277
  "id": "vzt4lrg",
278
278
  "name": "Megakit",
@@ -312,8 +312,6 @@ Required options:
312
312
  -t, --token TOKEN Set the API token
313
313
 
314
314
  Other options:
315
- -v, --version VERSION Set the API version
316
- -f, --format FORMAT Set the data format
317
315
  -h, --help Show this message
318
316
  ```
319
317
 
@@ -371,7 +369,6 @@ $
371
369
  ```
372
370
 
373
371
  ## Contributing
374
-
375
372
  1. Fork it ( https://github.com/IvanUkhov/typekit-client/fork )
376
373
  2. Create your feature branch (`git checkout -b my-new-feature`)
377
374
  3. Commit your changes (`git commit -am 'Add some feature'`)
data/bin/typekit CHANGED
@@ -91,14 +91,6 @@ parser = OptionParser.new do |o|
91
91
  o.separator ''
92
92
  o.separator 'Other options:'
93
93
 
94
- o.on('-v', '--version VERSION', 'Set the API version') do |value|
95
- options[:version] = value
96
- end
97
-
98
- o.on('-f', '--format FORMAT', 'Set the data format') do |value|
99
- options[:format] = value
100
- end
101
-
102
94
  o.on_tail('-h', '--help', 'Show this message') do
103
95
  raise
104
96
  end
data/lib/typekit.rb CHANGED
@@ -1,13 +1,11 @@
1
- require_relative 'typekit/version'
1
+ require 'apitizer'
2
2
 
3
3
  require_relative 'typekit/core'
4
4
  require_relative 'typekit/helper'
5
- require_relative 'typekit/configuration'
6
5
 
7
- require_relative 'typekit/routing'
8
- require_relative 'typekit/connection'
9
6
  require_relative 'typekit/processing'
10
7
 
11
8
  require_relative 'typekit/record'
12
-
13
9
  require_relative 'typekit/client'
10
+
11
+ require_relative 'typekit/version'
@@ -1,38 +1,45 @@
1
- require 'forwardable'
2
-
3
1
  module Typekit
4
2
  class Client
5
3
  extend Forwardable
6
4
 
7
- def_delegators :@config, :mapper, :dispatcher, :translator
8
- private def_delegator :dispatcher, :process, :dispatch
9
- private def_delegator :translator, :process, :translate
10
-
11
- def initialize(config: :default, **options)
12
- @config = Configuration.build(config, **options)
13
- end
5
+ def_delegator :translator, :process, :translate
14
6
 
15
- def perform(*arguments)
16
- translate(dispatch(trace(*arguments)))
7
+ def initialize(**options)
8
+ @options = Typekit.defaults.merge(options)
9
+ raise Error, 'Token is missing' unless @options.key?(:token)
17
10
  end
18
11
 
19
- Typekit.actions.each do |action|
20
- define_method(action) do |*arguments|
21
- perform(action, *arguments)
12
+ [ :process, :index, :show, :create, :update, :delete ].each do |method|
13
+ define_method(method) do |*arguments|
14
+ translate(engine.send(method, *arguments))
22
15
  end
23
16
  end
17
+ alias_method :perform, :process
24
18
 
25
19
  private
26
20
 
27
- def prepare(action, *path)
28
- parameters = path.last.is_a?(Hash) ? path.pop : {}
29
- [ action.to_sym, path.flatten.map(&:to_sym), parameters ]
21
+ [ :engine, :translator ].each do |component|
22
+ class_eval <<-METHOD, __FILE__, __LINE__ + 1
23
+ def #{ component }
24
+ @#{ component } ||= build_#{ component }
25
+ end
26
+ METHOD
27
+ end
28
+
29
+ def build_engine
30
+ version = @options[:version]
31
+ format = @options[:format]
32
+
33
+ options = @options.merge(dictionary: Typekit.dictionary,
34
+ headers: Typekit.headers.call(@options[:token]))
35
+
36
+ Apitizer::Base.new(**options) do
37
+ instance_exec(version, format, &Typekit.schema)
38
+ end
30
39
  end
31
40
 
32
- def trace(*arguments)
33
- action, path, parameters = prepare(*arguments)
34
- request = Connection::Request.new(action: action, parameters: parameters)
35
- mapper.trace(request, path)
41
+ def build_translator
42
+ Processing::Translator.new
36
43
  end
37
44
  end
38
45
  end
data/lib/typekit/core.rb CHANGED
@@ -1,16 +1,31 @@
1
1
  module Typekit
2
2
  Error = Class.new(StandardError)
3
3
 
4
- @address = 'https://typekit.com/api'.freeze
4
+ @defaults = { version: 1, format: :json }.freeze
5
5
 
6
- @actions = [ :index, :show, :create, :update, :delete ].freeze
7
- @collection_actions = [ :index, :create ].freeze
8
- @member_actions = [ :show, :update, :delete ].freeze
9
- @action_dictionary = { :index => :get, :show => :get,
10
- :create => :post, :update => :post, :delete => :delete }.freeze
6
+ @schema = Proc.new do |version, format|
7
+ address "https://typekit.com/api/v#{ version }/#{ format }"
8
+
9
+ resources :families, only: :show do
10
+ show ':variant', on: :member
11
+ end
12
+
13
+ resources :kits do
14
+ resources :families, only: [ :show, :update, :delete ]
15
+ show :published, on: :member
16
+ update :publish, on: :member
17
+ end
18
+
19
+ resources :libraries, only: [ :index, :show ]
20
+ end
21
+
22
+ @dictionary = { :update => :post }.freeze # not PUT, Typekit’s exception
23
+
24
+ @headers = Proc.new do |token|
25
+ { 'X-Typekit-Token' => token }
26
+ end
11
27
 
12
28
  singleton_class.class_eval do
13
- attr_reader :address, :actions, :collection_actions,
14
- :member_actions, :action_dictionary
29
+ attr_reader :defaults, :schema, :dictionary, :headers
15
30
  end
16
31
  end
@@ -1,27 +1,5 @@
1
- require 'rack/utils'
2
-
3
1
  module Typekit
4
2
  module Helper
5
- Error = Class.new(Typekit::Error)
6
-
7
- def self.member_action?(action)
8
- if Typekit.member_actions.include?(action)
9
- true
10
- elsif Typekit.collection_actions.include?(action)
11
- false
12
- else
13
- raise Error, 'Unknown action'
14
- end
15
- end
16
-
17
- def self.translate_action(action)
18
- Typekit.action_dictionary[action] or raise Error, 'Unknown action'
19
- end
20
-
21
- def self.build_query(parameters)
22
- Rack::Utils.build_nested_query(prepare_parameters(parameters))
23
- end
24
-
25
3
  def self.pluralize(name)
26
4
  case name
27
5
  when /^.*s$/
@@ -43,23 +21,5 @@ module Typekit
43
21
  name
44
22
  end
45
23
  end
46
-
47
- private
48
-
49
- def self.prepare_parameters(parameters)
50
- # PATCH: https://github.com/rack/rack/issues/557
51
- Hash[
52
- parameters.map do |key, value|
53
- case value
54
- when Integer, TrueClass, FalseClass
55
- [ key, value.to_s ]
56
- when Hash
57
- [ key, prepare_parameters(value) ]
58
- else
59
- [ key, value ]
60
- end
61
- end
62
- ]
63
- end
64
24
  end
65
25
  end
@@ -1,4 +1,3 @@
1
- require_relative 'processing/parser'
2
1
  require_relative 'processing/converter'
3
2
  require_relative 'processing/translator'
4
3
 
@@ -11,7 +11,8 @@ module Typekit
11
11
  MAPPING = {
12
12
  'ok' => Boolean,
13
13
  'errors' => Errors,
14
- 'published' => DateTime
14
+ 'published' => DateTime,
15
+ nil => Errors
15
16
  }.freeze
16
17
 
17
18
  def self.build(name)
@@ -3,10 +3,11 @@ module Typekit
3
3
  module Converter
4
4
  class Unknown
5
5
  def initialize(name)
6
+ @name = name
6
7
  end
7
8
 
8
9
  def process(response, object)
9
- object
10
+ { @name => object }
10
11
  end
11
12
  end
12
13
  end
@@ -1,15 +1,12 @@
1
1
  module Typekit
2
2
  module Processing
3
3
  class Translator
4
- def initialize(format:)
5
- @parser = Parser.build(format)
6
- end
7
-
8
- def process(response)
9
- data = @parser.process(response.body) rescue nil
10
- data = { nil => nil } unless data.is_a?(Hash) && data.length == 1
11
- name, object = *data.first
12
- Converter.build(name).process(response, object)
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)
13
10
  end
14
11
  end
15
12
  end
@@ -25,11 +25,11 @@ module Typekit
25
25
  end
26
26
 
27
27
  def self.collection?(name)
28
- collections.include?(name.to_sym)
28
+ collections.include?(name.to_s.to_sym)
29
29
  end
30
30
 
31
31
  def self.member?(name)
32
- members.include?(name.to_sym)
32
+ members.include?(name.to_s.to_sym)
33
33
  end
34
34
  end
35
35
  end
@@ -1,3 +1,3 @@
1
1
  module Typekit
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require_relative 'support/rest_helper'
2
2
  require 'webmock/rspec'
3
3
  require 'vcr'
4
+ require 'typekit'
4
5
 
5
6
  RSpec.configure do |config|
6
7
  config.treat_symbols_as_metadata_keys_with_true_values = true
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'typekit'
3
2
 
4
3
  describe Typekit::Client do
5
4
  let(:token) { 'arbitrary' }
@@ -28,8 +27,7 @@ describe Typekit::Client do
28
27
  options = { vcr: { cassette_name: 'show_families_calluna_found' } }
29
28
 
30
29
  it 'returns the Response as is', options do
31
- expect { subject.show(:families, 'calluna') }.not_to \
32
- raise_error
30
+ expect { subject.show(:families, 'calluna') }.not_to raise_error
33
31
  end
34
32
  end
35
33
  end
@@ -1,43 +1,8 @@
1
1
  require 'spec_helper'
2
- require 'typekit'
3
2
 
4
3
  describe Typekit::Helper do
5
- extend RESTHelper
6
-
7
4
  let(:subject_module) { Typekit::Helper }
8
5
 
9
- describe '.member_action?' do
10
- restful_member_actions.each do |action|
11
- it "returns true for the #{ action } member action" do
12
- expect(subject_module.member_action?(action)).to be_true
13
- end
14
- end
15
-
16
- restful_collection_actions.each do |action|
17
- it "returns false for the #{ action } collection action" do
18
- expect(subject_module.member_action?(action)).to be_false
19
- end
20
- end
21
-
22
- it 'raises exceptions when encounters unknown actions' do
23
- expect { subject_module.member_action?(:rock) }.to \
24
- raise_error(Typekit::Helper::Error, /Unknown action/i)
25
- end
26
- end
27
-
28
- describe '.translate_action' do
29
- rest_http_dictionary.each do |action, method|
30
- it "returns the #{ method } verb for the #{ action } action" do
31
- expect(subject_module.translate_action(action)).to eq(method)
32
- end
33
- end
34
-
35
- it 'raises exceptions when encounters unknown actions' do
36
- expect { subject_module.translate_action(:rock) }.to \
37
- raise_error(Typekit::Helper::Error, /Unknown action/i)
38
- end
39
- end
40
-
41
6
  describe '.pluralize' do
42
7
  {
43
8
  'kit' => 'kits',
@@ -71,57 +36,4 @@ describe Typekit::Helper do
71
36
  end
72
37
  end
73
38
  end
74
-
75
- describe '.build_query' do
76
- it 'handels ordinary parameters' do
77
- queries = [
78
- 'name=Megakit&domains=localhost',
79
- 'domains=localhost&name=Megakit'
80
- ]
81
- query = subject_module.build_query(
82
- name: 'Megakit', domains: 'localhost')
83
- expect(queries).to include(query)
84
- end
85
-
86
- it 'handles parameters whose values are ordinary lists' do
87
- query = subject_module.build_query(
88
- domains: [ 'example.com', 'example.net' ])
89
- expect(query).to eq('domains[]=example.com&domains[]=example.net')
90
- end
91
-
92
- it 'handles parameters whose values are object lists' do
93
- queries = [
94
- 'families[0][id]=gkmg&families[1][id]=asdf',
95
- 'families[1][id]=asdf&families[0][id]=gkmg'
96
- ]
97
- query = subject_module.build_query(
98
- families: { 0 => { id: 'gkmg' }, 1 => { id: 'asdf' } })
99
- expect(queries).to include(query)
100
- end
101
-
102
- it 'converts integers to decimal strings' do
103
- query = subject_module.build_query(page: 42)
104
- expect(query).to eq('page=42')
105
- end
106
-
107
- it 'converts integers in object lists to decimal strings' do
108
- queries = [
109
- 'primes[0][value]=2&primes[1][value]=3',
110
- 'primes[1][value]=3&primes[0][value]=2'
111
- ]
112
- query = subject_module.build_query(
113
- primes: { 0 => { value: 2 }, 1 => { value: 3 } })
114
- expect(queries).to include(query)
115
- end
116
-
117
- it 'converts the logical true to the string true' do
118
- query = subject_module.build_query(badge: true)
119
- expect(query).to eq('badge=true')
120
- end
121
-
122
- it 'converts the logical false to the string false' do
123
- query = subject_module.build_query(badge: false)
124
- expect(query).to eq('badge=false')
125
- end
126
- end
127
39
  end