billogram 0.2.0 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 413126d96eb6392012e781f51b6e55ee2aa96caa
4
- data.tar.gz: 4b6ade05a3d41a5f93d3e6fb117b1e6bf02b1a3e
3
+ metadata.gz: 7ea9d6bb4bcbf0fc5d3b772fdaa8711ffc71c53c
4
+ data.tar.gz: 3e08419d6355f7d66b6e96d90ae2864d085cc764
5
5
  SHA512:
6
- metadata.gz: cd39f9925577645dce7f92eadb6e6fdc37cd30b07df889fb9f1fd4b777d6372954ab0a9f9d9c33a430c3bb2347ea12ff9f119b6556d1c63ff3bd21f87938e0d8
7
- data.tar.gz: ca621f3971aa723a343c3188576bbdbdabffbc126d2dd0d01e987c60990acd0711373c616089de46d4eddf93777c798aa3a0a4bba875b90655bbaa1cb72bbe10
6
+ metadata.gz: 0d1f0e740c9a15aa09f086831848ec1ef8bdce74662182461506acff9b76af757e4118e34a4ab6c49349336e14cb996fc46048979194407923d6a6cee168e388
7
+ data.tar.gz: 46176d7024013032388fd55f9fb98b61d354aca18ce16ea9560de4f65560eb48a0569c14daa0fa547b1e17b41a2d15ce8dc1506fa977755b37ddb87fbb6bc11d
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ *.gem
@@ -20,6 +20,6 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.10"
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
- spec.add_development_dependency "rspec"
24
- spec.add_dependency "httparty"
23
+ spec.add_development_dependency "rspec", "~> 3.0"
24
+ spec.add_dependency "httparty", "~> 0.13"
25
25
  end
@@ -1,5 +1,6 @@
1
1
  require "httparty"
2
2
  require "billogram/client"
3
+ require "billogram/error"
3
4
  require "billogram/relation_builder"
4
5
  require "billogram/resource"
5
6
  require 'billogram/resources/address'
@@ -0,0 +1,27 @@
1
+ module Billogram
2
+ class Error < StandardError
3
+
4
+ class BadRequest < Error; end
5
+ class Unauthorized < Error; end
6
+ class Forbidden < Error; end
7
+ class NotFound < Error; end
8
+ class InternalServerError < Error; end
9
+
10
+ def self.from_response(response)
11
+ status = response.response.code.to_i
12
+ body = response.body.to_s
13
+ headers = response.headers
14
+
15
+ if klass = case status
16
+ when 400 then Billogram::BadRequest
17
+ when 401 then Billogram::Unauthorized
18
+ when 403 then Billogram::Forbidden
19
+ when 404 then Billogram::NotFound
20
+ when 500 then Billogram::InternalServerError
21
+ else Billogram::Error
22
+ end
23
+ klass.new(response)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -29,27 +29,16 @@ module Billogram
29
29
 
30
30
  def build_relation(type, relation_names)
31
31
  relation_names.each do |name|
32
- if type == :one
33
- build_one_relation(name)
34
- elsif type == :many
35
- build_many_relation(name)
32
+ if attrs = relation_attributes(name)
33
+ if type == :one
34
+ value = relation_class(name).new(attrs)
35
+ elsif type == :many
36
+ value = attrs.map{|item| relation_class(name[0..-2]).new(item) }
37
+ end
38
+
39
+ resource.public_send("#{name}=", value)
36
40
  end
37
41
  end
38
42
  end
39
-
40
- def build_one_relation(name)
41
- if attrs = relation_attributes(name)
42
- value = relation_class(name).new attrs
43
- resource.instance_variable_set("@#{name}", value)
44
- end
45
- end
46
-
47
- def build_many_relation(name)
48
- if attrs = relation_attributes(name)
49
- singular = name[0..name.length-2]
50
- value = attrs.map{|item| relation_class(singular).new(item) }
51
- resource.instance_variable_set("@#{name}", value)
52
- end
53
- end
54
43
  end
55
44
  end
@@ -1,8 +1,6 @@
1
1
  module Billogram
2
2
  class Resource
3
- attr_reader :data
4
-
5
- DEFAULT_OPTIONS = { page: 1, page_size: 2 }
3
+ DEFAULT_OPTIONS = { page: 1, page_size: 50 }
6
4
 
7
5
  class << self
8
6
  def relations
@@ -11,39 +9,45 @@ module Billogram
11
9
 
12
10
  def endpoint(value = nil)
13
11
  @endpoint = value if value
14
- @endpoint || name.demodulize.underscore.pluralize
12
+ @endpoint || "#{name.sub('Billogram::', '').downcase}s"
15
13
  end
16
14
 
17
15
  def search(options = {})
18
16
  query = DEFAULT_OPTIONS.merge(options)
19
17
  response = Billogram.client.get("#{endpoint}", {query: query})
20
- parse_response(response.parsed_response["data"])
18
+ parse_response(response)
21
19
  end
22
20
 
23
21
  def fetch(id)
24
22
  response = Billogram.client.get("#{endpoint}/#{id}")
25
- parse_response(response.parsed_response["data"])
23
+ parse_response(response)
24
+ end
25
+
26
+ def parse_response(response)
27
+ response.code == 200 ? build_objects(response.parsed_response['data']) : process_error(response)
26
28
  end
27
29
 
28
- def parse_response(data)
29
- # TODO: refactor, error handling
30
+ def relation(relation_name, relation_type = :one)
31
+ relations[relation_type] << relation_name
32
+ attr_accessor relation_name
33
+ end
34
+
35
+ def build_objects(data)
30
36
  case data
31
37
  when Hash then new(data)
32
- when Array then data.map{|item| parse_response(item) }
33
- when nil
38
+ when Array then data.map{|item| build_objects(item) }
34
39
  else data
35
40
  end
36
41
  end
37
42
 
38
- def relation(relation_name, relation_type = :one)
39
- relations[relation_type] << relation_name
40
- attr_reader relation_name
43
+ def process_error(response)
44
+ raise Billogram::Error.from_response(response)
41
45
  end
42
46
  end
43
47
 
44
48
  def initialize(attributes = {})
45
49
  Hash(attributes).each do |key, value|
46
- instance_variable_set("@#{key}", value) if respond_to?(key)
50
+ public_send("#{key}=", value) if respond_to?(key)
47
51
  end
48
52
 
49
53
  RelationBuilder.new(self, attributes).call
@@ -1,3 +1,3 @@
1
1
  module Billogram
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: billogram
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Birman
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-08-16 00:00:00.000000000 Z
11
+ date: 2015-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -42,30 +42,30 @@ dependencies:
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '3.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '3.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: httparty
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '0.13'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: '0.13'
69
69
  description:
70
70
  email:
71
71
  - birmanmark@gmail.com
@@ -85,6 +85,7 @@ files:
85
85
  - bin/setup
86
86
  - lib/billogram.rb
87
87
  - lib/billogram/client.rb
88
+ - lib/billogram/error.rb
88
89
  - lib/billogram/relation_builder.rb
89
90
  - lib/billogram/resource.rb
90
91
  - lib/billogram/resources/address.rb