mtg_sdk 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +155 -0
  6. data/Rakefile +16 -0
  7. data/lib/mtg_sdk.rb +32 -0
  8. data/lib/mtg_sdk/card.rb +48 -0
  9. data/lib/mtg_sdk/changelog.rb +29 -0
  10. data/lib/mtg_sdk/configuration.rb +9 -0
  11. data/lib/mtg_sdk/foreign_name.rb +10 -0
  12. data/lib/mtg_sdk/legality.rb +10 -0
  13. data/lib/mtg_sdk/representers/card_representer.rb +54 -0
  14. data/lib/mtg_sdk/representers/changelog_representer.rb +13 -0
  15. data/lib/mtg_sdk/representers/foreign_name_representer.rb +11 -0
  16. data/lib/mtg_sdk/representers/legality_representer.rb +10 -0
  17. data/lib/mtg_sdk/representers/ruling_representer.rb +12 -0
  18. data/lib/mtg_sdk/representers/set_representer.rb +21 -0
  19. data/lib/mtg_sdk/resource.rb +21 -0
  20. data/lib/mtg_sdk/rest_client.rb +31 -0
  21. data/lib/mtg_sdk/ruling.rb +10 -0
  22. data/lib/mtg_sdk/set.rb +64 -0
  23. data/lib/mtg_sdk/subtype.rb +15 -0
  24. data/lib/mtg_sdk/supertype.rb +15 -0
  25. data/lib/mtg_sdk/type.rb +15 -0
  26. data/lib/mtg_sdk/version.rb +3 -0
  27. data/mtg_sdk.gemspec +33 -0
  28. data/test/card_test.rb +62 -0
  29. data/test/changelog_test.rb +12 -0
  30. data/test/configuration_test.rb +10 -0
  31. data/test/fixtures/all_changelogs.yml +129 -0
  32. data/test/fixtures/all_subtypes.yml +129 -0
  33. data/test/fixtures/all_supertypes.yml +59 -0
  34. data/test/fixtures/all_types.yml +59 -0
  35. data/test/fixtures/booster.yml +974 -0
  36. data/test/fixtures/invalid_code.yml +49 -0
  37. data/test/fixtures/invalid_id.yml +49 -0
  38. data/test/fixtures/one_card.yml +111 -0
  39. data/test/fixtures/one_set.yml +60 -0
  40. data/test/fixtures/query_cards_pageSize.yml +356 -0
  41. data/test/fixtures/query_zurgo.yml +336 -0
  42. data/test/set_test.rb +34 -0
  43. data/test/subtype_test.rb +12 -0
  44. data/test/supertype_test.rb +12 -0
  45. data/test/test_helper.rb +10 -0
  46. data/test/type_test.rb +12 -0
  47. metadata +263 -0
@@ -0,0 +1,11 @@
1
+ require 'roar/json'
2
+
3
+ module MTG
4
+ module ForeignNameRepresenter
5
+ include Roar::JSON
6
+
7
+ property :name
8
+ property :language
9
+ property :multiverse_id, as: :multiverseid
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ require 'roar/json'
2
+
3
+ module MTG
4
+ module LegalityRepresenter
5
+ include Roar::JSON
6
+
7
+ property :format
8
+ property :legality
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ require 'roar/json'
2
+ require 'roar/coercion'
3
+
4
+ module MTG
5
+ module RulingRepresenter
6
+ include Roar::JSON
7
+ include Roar::Coercion
8
+
9
+ property :date, type: Date
10
+ property :text
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ require 'roar/json'
2
+
3
+ module MTG
4
+ module SetRepresenter
5
+ include Roar::JSON
6
+
7
+ property :code
8
+ property :name
9
+ property :type
10
+ property :border
11
+ property :mkm_id
12
+ property :mkm_name
13
+ property :old_code, as: :oldCode
14
+ property :online_only, as: :onlineOnly
15
+ property :release_date, as: :releaseDate
16
+ property :gatherer_code, as: :gatherCode
17
+ property :magic_cards_info_code, as: :magicCardsInfoCode
18
+
19
+ collection :booster
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module MTG
2
+ class Resource
3
+
4
+ # Get the hash of query parameters
5
+ #
6
+ # @return [Hash] query parameters
7
+ def self.query
8
+ @query ||= {:parameters => {}}
9
+ end
10
+
11
+ # Adds a parameter to the hash of query parameters
12
+ #
13
+ # @param args [Hash] the query parameter
14
+ # @return [Resource] the Resource
15
+ def self.where(args)
16
+ query[:parameters].merge!(args)
17
+ self
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ require 'faraday'
2
+ require 'faraday_middleware'
3
+
4
+ module MTG
5
+ module RestClient
6
+
7
+ def self.get(endpoint, params=nil)
8
+ if params.nil?
9
+ query = endpoint
10
+ else
11
+ query = "#{endpoint}?#{params_to_query(params)}"
12
+ end
13
+
14
+ client.get(query)
15
+ end
16
+
17
+ protected
18
+
19
+ def self.client
20
+ @client = Faraday.new "#{API_URL}/v#{MTG.configuration.api_version}" do |conn|
21
+ conn.response :xml, :content_type => /\bxml$/
22
+ conn.response :json, :content_type => /\bjson$/
23
+ conn.adapter Faraday.default_adapter
24
+ end
25
+ end
26
+
27
+ def self.params_to_query(params)
28
+ params.map {|p, v| "#{p}=#{URI.escape(v.to_s)}"}.join('&')
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,10 @@
1
+ require_relative 'representers/ruling_representer'
2
+
3
+ module MTG
4
+ class Ruling
5
+ include Roar::JSON
6
+ include RulingRepresenter
7
+
8
+ attr_accessor :date, :text
9
+ end
10
+ end
@@ -0,0 +1,64 @@
1
+ require_relative 'representers/set_representer'
2
+ require_relative 'card'
3
+ require_relative 'rest_client'
4
+ require_relative 'resource'
5
+
6
+ module MTG
7
+ class Set < Resource
8
+ include Roar::JSON
9
+ include SetRepresenter
10
+ include RestClient
11
+
12
+ attr_accessor :code, :name, :type, :border, :mkm_id, :mkm_name,
13
+ :release_date, :gatherer_code, :magic_cards_info_code, :booster,
14
+ :old_code, :block, :online_only
15
+
16
+ # Find a single set by the set code
17
+ #
18
+ # @param code [String] the Set code
19
+ # @return [Set] a Set object
20
+ def self.find(code)
21
+ response = RestClient.get("sets/#{code}")
22
+
23
+ if response.body['set'].nil?
24
+ raise ArgumentError, 'Set not found'
25
+ end
26
+
27
+ new.from_json(response.body['set'].to_json)
28
+ end
29
+
30
+ # Generate a booster pack for a specific set
31
+ #
32
+ # @param code [String] the Set code
33
+ # @return [Array<Card>] Array of Card objects
34
+ def self.generate_booster(code)
35
+ cards = []
36
+ response = RestClient.get("sets/#{code}/booster")
37
+ data = response.body['cards']
38
+
39
+ data.each do |card|
40
+ cards << Card.new.from_json(card.to_json)
41
+ end
42
+
43
+ @query = nil
44
+ cards
45
+ end
46
+
47
+ # Execute a query and convert the response
48
+ # into a list of Set objects
49
+ #
50
+ # @return [Array<Set>] Array of Set objects
51
+ def self.get
52
+ sets = []
53
+ response = RestClient.get('sets', query[:parameters])
54
+ data = response.body['sets']
55
+
56
+ data.each do |set|
57
+ sets << new.from_json(set.to_json)
58
+ end
59
+
60
+ @query = nil
61
+ sets
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'rest_client'
2
+ require_relative 'resource'
3
+
4
+ module MTG
5
+ class Subtype < Resource
6
+ include RestClient
7
+
8
+ # Get all subtypes
9
+ #
10
+ # @return [Array<String>] All subtypes
11
+ def self.all
12
+ RestClient.get('subtypes').body['subtypes']
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'rest_client'
2
+ require_relative 'resource'
3
+
4
+ module MTG
5
+ class Supertype < Resource
6
+ include RestClient
7
+
8
+ # Get all supertypes
9
+ #
10
+ # @return [Array<String>] All supertypes
11
+ def self.all
12
+ RestClient.get('supertypes').body['supertypes']
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'rest_client'
2
+ require_relative 'resource'
3
+
4
+ module MTG
5
+ class Type < Resource
6
+ include RestClient
7
+
8
+ # Get all types
9
+ #
10
+ # @return [Array<String>] All types
11
+ def self.all
12
+ RestClient.get('types').body['types']
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ module MTG
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mtg_sdk/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "mtg_sdk"
8
+ spec.version = MTG::VERSION
9
+ spec.authors = ["Andrew Backes"]
10
+ spec.email = ["backes.andrew@gmail.com"]
11
+ spec.summary = "Magic: The Gathering SDK for magicthegathering.io"
12
+ spec.description = "Magic: The Gathering SDK is a wrapper around the MTG API located at magicthegathering.io"
13
+ spec.homepage = "https://magicthegathering.io"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "minitest"
24
+ spec.add_development_dependency "vcr"
25
+ spec.add_development_dependency "webmock"
26
+
27
+ spec.add_dependency "faraday"
28
+ spec.add_dependency "faraday_middleware"
29
+ spec.add_dependency "json"
30
+ spec.add_dependency "multi_json"
31
+ spec.add_dependency "roar"
32
+ spec.add_dependency "virtus"
33
+ end
@@ -0,0 +1,62 @@
1
+ require_relative 'test_helper'
2
+
3
+ class CardTest < Minitest::Test
4
+ def test_find_returns_one_card
5
+ VCR.use_cassette('one_card') do
6
+ card = MTG::Card.find(88803)
7
+
8
+ assert_equal 'Choice of Damnations', card.name
9
+ assert_equal '{5}{B}', card.mana_cost
10
+ assert_equal 6, card.cmc
11
+ assert_equal 'Sorcery — Arcane', card.type
12
+ assert card.colors.any?{|color| color == 'Black'}
13
+ assert card.types.any?{|type| type == 'Sorcery'}
14
+ assert card.subtypes.any?{|subtype| subtype == 'Arcane'}
15
+ assert_equal 'Rare', card.rarity
16
+ assert_equal 'SOK', card.set
17
+ assert_equal "Target opponent chooses a number. You may have that player lose that much life. If you don't, that player sacrifices all but that many permanents.", card.text
18
+ assert_equal "\"Life is a series of choices between bad and worse.\"\n—Toshiro Umezawa", card.flavor
19
+ assert_equal 'Tim Hildebrandt', card.artist
20
+ assert_equal '62', card.number
21
+ assert_equal 'normal', card.layout
22
+ assert_equal 88803, card.multiverse_id
23
+ assert_equal 'http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=88803&type=card', card.image_url
24
+ assert card.rulings.any?{|ruling| ruling.date == Date.parse('2005-06-01')}
25
+ assert card.foreign_names.any?{|foreign_name| foreign_name.name == '破灭抉择'}
26
+ assert card.printings.any?{|printing| printing == 'SOK'}
27
+ assert_equal "Target opponent chooses a number. You may have that player lose that much life. If you don't, that player sacrifices all but that many permanents.", card.original_text
28
+ assert_equal 'Sorcery — Arcane', card.original_type
29
+ assert card.legalities.any?{|legality| legality.format == 'Commander' && legality.legality == 'Legal'}
30
+ assert_equal '1c4aab072d52d283e902f2302afa255b39e0794b', card.id
31
+ end
32
+ end
33
+
34
+ def test_find_with_invalid_id_throws_exception
35
+ VCR.use_cassette('invalid_id') do
36
+ assert_raises ArgumentError do
37
+ MTG::Card.find(3239482932)
38
+ end
39
+ end
40
+ end
41
+
42
+ def test_where_and_get_returns_cards
43
+ VCR.use_cassette('query_cards_pageSize') do
44
+ cards = MTG::Card.where(pageSize: 10).get
45
+
46
+ # make sure we got a ton of cards
47
+ assert cards.length == 10
48
+ assert cards.kind_of?(Array)
49
+ assert cards.first.kind_of?(MTG::Card)
50
+ end
51
+ end
52
+
53
+ def test_where_appends_to_query
54
+ VCR.use_cassette('query_zurgo') do
55
+ name = 'zurgo'
56
+ query = MTG::Card.where(name: name).query
57
+ parameters = query[:parameters]
58
+ MTG::Card.get
59
+ assert_equal name, parameters[:name]
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'test_helper'
2
+
3
+ class ChangelogTest < Minitest::Test
4
+ def test_all_returns_all_changelogs
5
+ VCR.use_cassette('all_changelogs') do
6
+ changelogs = MTG::Changelog.all
7
+
8
+ assert changelogs.length > 1
9
+ assert changelogs.any? {|changelog| changelog.version == '1.0.0'}
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ #test/client_test.rb
2
+ require_relative 'test_helper'
3
+
4
+ class ConfigurationTest < Minitest::Test
5
+ def test_defaults
6
+ config = MTG::Configuration.new
7
+
8
+ assert_equal 1, config.api_version
9
+ end
10
+ end
@@ -0,0 +1,129 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.magicthegathering.io/v1/changelogs
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.2
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: 'OK '
20
+ headers:
21
+ Server:
22
+ - cloudflare-nginx
23
+ Date:
24
+ - Thu, 21 Jan 2016 01:58:53 GMT
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Set-Cookie:
32
+ - __cfduid=d91b83f8e592fa9004064ce3a8922ce161453341533; expires=Fri, 20-Jan-17
33
+ 01:58:53 GMT; path=/; domain=.magicthegathering.io; HttpOnly
34
+ X-Frame-Options:
35
+ - SAMEORIGIN
36
+ X-Xss-Protection:
37
+ - 1; mode=block
38
+ X-Content-Type-Options:
39
+ - nosniff
40
+ Etag:
41
+ - W/"a0ed610acb768054f18d15a50e1288ca"
42
+ Cache-Control:
43
+ - max-age=0, private, must-revalidate
44
+ X-Request-Id:
45
+ - 8c653097-b501-466e-a2bd-e2f11891fea3
46
+ X-Runtime:
47
+ - '0.010917'
48
+ Vary:
49
+ - Origin
50
+ Via:
51
+ - 1.1 vegur
52
+ Cf-Ray:
53
+ - 267f6aaad35910e1-ORD
54
+ body:
55
+ encoding: ASCII-8BIT
56
+ string: !binary |-
57
+ eyJjaGFuZ2Vsb2dzIjpbeyJpZCI6MTUsInZlcnNpb24iOiIxLjguMCIsImRl
58
+ dGFpbHMiOiJUbyBxdWVyeSBmb3IgYSBjYXJkIG5hbWUgYnkgbWF0Y2hpbmcg
59
+ dGhlIHBhcmFtZXRlciBleGFjdGx5LCB5b3Ugd2lsbCBub3cgdXNlIHF1b3Rl
60
+ cyBpbnN0ZWFkIG9mIHBhcmVudGhlc2Vlcy4gRXhhbXBsZTogL2NhcmRzP25h
61
+ bWU9XCJ6dXJnbyBoZWxtc21hc2hlclwiIiwicmVsZWFzZURhdGUiOiIyMDE2
62
+ LTAxLTE4In0seyJpZCI6MTQsInZlcnNpb24iOiIxLjcuMCIsImRldGFpbHMi
63
+ OiJBZGRlZCBzZXQ6IE9hdGggb2YgdGhlIEdhdGV3YXRjaCAoT0dXKSIsInJl
64
+ bGVhc2VEYXRlIjoiMjAxNi0wMS0xMiJ9LHsiaWQiOjEzLCJ2ZXJzaW9uIjoi
65
+ MS42LjAiLCJkZXRhaWxzIjoiQ2FuIG5vdyBxdWVyeSBjYXJkIG5hbWVzIGJ5
66
+ IHRoZWlyIGZvcmVpZ24gbmFtZXMgdmlhIHRoZSAnbGFuZ3VhZ2UnIHVybCBw
67
+ YXJhbWV0ZXIuIEV4YW1wbGU6ICAvY2FyZHM/bGFuZ3VhZ2U9c3BhbmlzaCZu
68
+ YW1lPVBlcnNwaWNhY2lhIGRlIFVnaW48L2JyPjwvYnI+Q29sb3JzLCB0eXBl
69
+ cywgc3VidHlwZXMsIGFuZCBzdXBlcnR5cGVzIGRlZmF1bHQgdG8gYSBsb2dp
70
+ Y2FsIGFuZCBvcGVyYXRvciB3aGVuIHF1ZXJ5aW5nLCB1bmxlc3Mgd3JhcHBl
71
+ ZCBpbiBzcXVhcmUgYnJhY2tldHMsIHdoaWNoIHdpbGwgdXNlIGEgbG9naWNh
72
+ bCBvci4gU2VlIHRoZSBkb2NzIGZvciBleGFtcGxlcy4iLCJyZWxlYXNlRGF0
73
+ ZSI6IjIwMTUtMTItMDEifSx7ImlkIjoxMiwidmVyc2lvbiI6IjEuNS4wIiwi
74
+ ZGV0YWlscyI6IkFkZGVkIHNldDogQ29tbWFuZGVyIDIwMTUgKEMxNSkiLCJy
75
+ ZWxlYXNlRGF0ZSI6IjIwMTUtMTEtMTcifSx7ImlkIjoxMSwidmVyc2lvbiI6
76
+ IjEuNC4wIiwiZGV0YWlscyI6IlVwZGF0ZWQgcnVsaW5ncyBhbmQgb3JhY2xl
77
+ IHRleHQgZm9yIGFsbCBjYXJkcyBpbiBhbGwgc2V0cy48L2JyPkFkZGVkIHNl
78
+ dDogQmF0dGxlIGZvciBaZW5kaWthciAoQkZaKTwvYnI+QWRkZWQgc2V0OiBa
79
+ ZW5kaWthciBFeHBlZGl0aW9uIChFWFApPC9icj5ERFA6IEZpeGVkIHRoZSAn
80
+ Y29sb3JzJyBmaWVsZCBmb3IgdGhlIGNhcmRzIHdpdGggJ0Rldm9pZCcuPC9i
81
+ cj5VR0w6IFRoZSBjYXJkICdEZW5pZWQhJyBub3cgaGFzIGEgdHlwZSBvZiAn
82
+ SW5zdGFudCcgaW5zdGVhZCBvZiAnSW50ZXJydXB0Jy4gVGhlIG9yaWdpbmFs
83
+ VHlwZSBpcyBzdGlsbCAnSW50ZXJydXB0Jy4iLCJyZWxlYXNlRGF0ZSI6IjIw
84
+ MTUtMTAtMDEifSx7ImlkIjoxMCwidmVyc2lvbiI6IjEuMy4yIiwiZGV0YWls
85
+ cyI6IldoZW4gcXVlcnlpbmcgYSBjYXJkIGJ5IG5hbWUsIHBhcmVudGhlc2Vl
86
+ cyBjYW4gbm93IGJlIHBsYWNlcyBhcm91bmQgdGhlIGNhcmQgbmFtZSB0byB0
87
+ cnkgdG8gbWF0Y2ggdGhlIG5hbWUgZXhhY3RseS4gRXhhbXBsZTogL2NhcmRz
88
+ P25hbWU9KHRpbmtlcikiLCJyZWxlYXNlRGF0ZSI6IjIwMTUtMDktMTUifSx7
89
+ ImlkIjo5LCJ2ZXJzaW9uIjoiMS4zLjEiLCJkZXRhaWxzIjoiVGhlICdmb3Jl
90
+ aWduTmFtZXMnICdtdWx0aXZlcnNlaWQnIGZpZWxkIGlzIG5vdyBjb3JyZWN0
91
+ bHkgYW4gaW50ZWdlciByYXRoZXIgdGhhbiBhIHN0cmluZy48L2JyPlBMUzog
92
+ VGhlIDMgZm9pbCB2ZXJzaW9uIGNhcmRzIG5vdyBjb3JyZWN0bHkgaGF2ZSBh
93
+ IOKYhSBwcmVmaXggaW4gdGhlICdudW1iZXInIGZpZWxkIHRvIG1hdGNoIHdo
94
+ YXQgaXMgcHJpbnRlZCBvbiB0aGUgcGh5c2ljYWwgY2FyZC4iLCJyZWxlYXNl
95
+ RGF0ZSI6IjIwMTUtMDktMTQifSx7ImlkIjo4LCJ2ZXJzaW9uIjoiMS4zLjAi
96
+ LCJkZXRhaWxzIjoiQWRkZWQgc2V0OiBEdWVsIERlY2tzOiBaZW5kaWthciB2
97
+ cy4gRWxkcmF6aSAoRERQKTwvYnI+QWRkZWQgc2V0OiBGcm9tIHRoZSBWYXVs
98
+ dDogQW5nZWxzIChWMTUpPC9icj5FdmVyeSBjYXJkIG5vdyBoYXMgYSB1bmlx
99
+ dWUgJ2lkJyBmaWVsZDwvYnI+QWRkZWQgYSAnbXVsdGl2ZXJzZWlkJyBmaWVs
100
+ ZCB0byB0aGUgY2FyZCAnZm9yZWlnbk5hbWVzJyBvYmplY3QgICIsInJlbGVh
101
+ c2VEYXRlIjoiMjAxNS0wOS0wNSJ9LHsiaWQiOjcsInZlcnNpb24iOiIxLjIu
102
+ MSIsImRldGFpbHMiOiJTT006IEFkZGVkIG1pc3NpbmcgJ3dhdGVybWFyaycg
103
+ ZmllbGQgZm9yICdSYXpvcmZpZWxkIFRocmVzaGVyJyBjYXJkPC9icj5IT1A6
104
+ IEZpeGVkICd0ZXh0JyBmaWVsZCBmb3IgJ01pbmFtbycgY2FyZCB0byB1c2Ug
105
+ Q0hBT1MgaW5zdGVhZCBvZiB7Q30gdG8gYWxpZ24gd2l0aCBvdGhlciB1cGRh
106
+ dGVkIG9yYWNsZSAndGV4dCcgZmllbGRzIG9uIHNpbWlsYXIgY2FyZHMiLCJy
107
+ ZWxlYXNlRGF0ZSI6IjIwMTUtMDgtMTQifSx7ImlkIjo2LCJ2ZXJzaW9uIjoi
108
+ MS4yLjAiLCJkZXRhaWxzIjoiQWRkZWQgc2V0OiBNYWdpYyBPcmlnaW5zIChP
109
+ UkkpPGJyLz5BZGRlZCBzZXQ6IENsYXNoIFBhY2sgKENQSyk8L2JyPkFkZGVk
110
+ IHNldDogQ29sbGVjdG9yJ3MgRWRpdGlvbiAoQ0VEKTwvYnI+QWRkZWQgc2V0
111
+ OiBJbnRlcm5hdGlvbmFsIENvbGxlY3RvcidzIEVkaXRpb24gKENFSSkiLCJy
112
+ ZWxlYXNlRGF0ZSI6IjIwMTUtMDctMTYifSx7ImlkIjo1LCJ2ZXJzaW9uIjoi
113
+ MS4xLjMiLCJkZXRhaWxzIjoiQWRkZWQgc2V0IGNvZGUgdG8gdGhlIENhcmRz
114
+ IHJlc291cmNlLiIsInJlbGVhc2VEYXRlIjoiMjAxNS0wNi0wNyJ9LHsiaWQi
115
+ OjQsInZlcnNpb24iOiIxLjEuMiIsImRldGFpbHMiOiJSZW1vdmVkICdJbWFn
116
+ ZU5hbWUnIGZyb20gdGhlIEpTT04gYXMgaXQgaXMgbm8gbG9uZ2VyIGFwcGxp
117
+ Y2FibGUuPC9icj5BZGRlZCAnaW1hZ2VVcmwnIHRvIHRoZSBjYXJkcyByZXNv
118
+ dXJjZS48L2JyPkZpeGVkIG1pc3NpbmcgZG9jdW1lbnRhdGlvbiBmb3IgYSBm
119
+ ZXcgZmllbGRzLiIsInJlbGVhc2VEYXRlIjoiMjAxNS0wNi0wMyJ9LHsiaWQi
120
+ OjMsInZlcnNpb24iOiIxLjEuMSIsImRldGFpbHMiOiJDYW4gbm93IHF1ZXJ5
121
+ IHNldHMgYnkgc2V0IG5hbWVDYW4gbm93IHF1ZXJ5IHNldHMgYnkgc2V0IG5h
122
+ bWUiLCJyZWxlYXNlRGF0ZSI6IjIwMTUtMDYtMDIifSx7ImlkIjoyLCJ2ZXJz
123
+ aW9uIjoiMS4xLjAiLCJkZXRhaWxzIjoiQWRkZWQgc2V0OiBNb2Rlcm4gTWFz
124
+ dGVycyAyMDE1IEVkaXRpb24gKE1NMikiLCJyZWxlYXNlRGF0ZSI6IjIwMTUt
125
+ MDUtMzAifSx7ImlkIjoxLCJ2ZXJzaW9uIjoiMS4wLjAiLCJkZXRhaWxzIjoi
126
+ Rmlyc3QgUmVsZWFzZSIsInJlbGVhc2VEYXRlIjoiMjAxNS0wNS0yOSJ9XX0=
127
+ http_version:
128
+ recorded_at: Thu, 21 Jan 2016 01:58:53 GMT
129
+ recorded_with: VCR 3.0.1