mtg_sdk 1.0.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.
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