site_prism.vcr 0.0.1

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 (78) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +12 -0
  5. data/Gemfile +17 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +381 -0
  8. data/Rakefile +1 -0
  9. data/TODO.md +71 -0
  10. data/lib/site_prism.vcr.rb +1 -0
  11. data/lib/site_prism_vcr/applier.rb +54 -0
  12. data/lib/site_prism_vcr/dsl/adjuster.rb +82 -0
  13. data/lib/site_prism_vcr/dsl/initial_adjuster.rb +97 -0
  14. data/lib/site_prism_vcr/element.rb +18 -0
  15. data/lib/site_prism_vcr/fixture.rb +29 -0
  16. data/lib/site_prism_vcr/fixtures/converter.rb +17 -0
  17. data/lib/site_prism_vcr/fixtures/handler.rb +31 -0
  18. data/lib/site_prism_vcr/fixtures/manager.rb +38 -0
  19. data/lib/site_prism_vcr/fixtures/modifiers/home_path.rb +27 -0
  20. data/lib/site_prism_vcr/fixtures/modifiers/path.rb +30 -0
  21. data/lib/site_prism_vcr/fixtures/tmp_keeper.rb +21 -0
  22. data/lib/site_prism_vcr/fixtures.rb +41 -0
  23. data/lib/site_prism_vcr/options.rb +22 -0
  24. data/lib/site_prism_vcr/options_with_path.rb +7 -0
  25. data/lib/site_prism_vcr/patches/element_container.rb +15 -0
  26. data/lib/site_prism_vcr/patches/page.rb +41 -0
  27. data/lib/site_prism_vcr/vcr_helpers.rb +18 -0
  28. data/lib/site_prism_vcr/version.rb +3 -0
  29. data/lib/site_prism_vcr/waiter.rb +23 -0
  30. data/lib/site_prism_vcr.rb +24 -0
  31. data/site_prism.vcr.gemspec +24 -0
  32. data/spec/fixtures/arya_stark.yml +44 -0
  33. data/spec/fixtures/custom/blank.yml +44 -0
  34. data/spec/fixtures/custom/bran_stark.yml +44 -0
  35. data/spec/fixtures/custom/daenerys_targaryen.yml +44 -0
  36. data/spec/fixtures/jon_snow.yml +44 -0
  37. data/spec/fixtures/ned_stark.yml +44 -0
  38. data/spec/fixtures/robb_stark.yml +44 -0
  39. data/spec/integration/http_interactions_on_even/click_spec.rb +75 -0
  40. data/spec/integration/immediate_http_interactions/page_load_on_click_spec.rb +18 -0
  41. data/spec/integration/immediate_http_interactions/page_load_spec.rb +56 -0
  42. data/spec/spec_helper.rb +18 -0
  43. data/spec/spec_integration_helper.rb +27 -0
  44. data/spec/support/shared/integration/custom_fixtures.rb +32 -0
  45. data/spec/support/shared/integration/exchange.rb +42 -0
  46. data/spec/support/shared/integration/home_path.rb +49 -0
  47. data/spec/support/shared/integration/waiter.rb +75 -0
  48. data/spec/support/site_prism/pages/base.rb +18 -0
  49. data/spec/support/site_prism/pages/home.rb +44 -0
  50. data/spec/support/site_prism/pages/immediate_http_interactions/home_path.rb +15 -0
  51. data/spec/support/site_prism/pages/immediate_http_interactions/one_request.rb +13 -0
  52. data/spec/support/site_prism/pages/immediate_http_interactions/subpage.rb +7 -0
  53. data/spec/support/site_prism/pages/immediate_http_interactions/two_requests.rb +12 -0
  54. data/spec/support/site_prism/pages/immediate_http_interactions/waiter_without_fixtures_ejection.rb +12 -0
  55. data/spec/support/site_prism/sections/console_block.rb +8 -0
  56. data/spec/support/test_app/public/jquery.min.js +5 -0
  57. data/spec/support/test_app/public/test.js +44 -0
  58. data/spec/support/test_app/test_app.rb +46 -0
  59. data/spec/support/test_app/views/index.erb +26 -0
  60. data/spec/unit/applier_spec.rb +134 -0
  61. data/spec/unit/dsl/adjuster_spec.rb +141 -0
  62. data/spec/unit/dsl/initial_adjuster_spec.rb +166 -0
  63. data/spec/unit/element_container_spec.rb +48 -0
  64. data/spec/unit/element_spec.rb +47 -0
  65. data/spec/unit/fixture_spec.rb +45 -0
  66. data/spec/unit/fixtures/converter_spec.rb +36 -0
  67. data/spec/unit/fixtures/handler_spec.rb +72 -0
  68. data/spec/unit/fixtures/manager_spec.rb +58 -0
  69. data/spec/unit/fixtures/modifiers/home_path_spec.rb +47 -0
  70. data/spec/unit/fixtures/modifiers/path_spec.rb +45 -0
  71. data/spec/unit/fixtures/tmp_keeper_spec.rb +17 -0
  72. data/spec/unit/fixtures_spec.rb +76 -0
  73. data/spec/unit/options_spec.rb +41 -0
  74. data/spec/unit/patches/element_container_spec.rb +48 -0
  75. data/spec/unit/patches/page_spec.rb +57 -0
  76. data/spec/unit/vcr_helpers_spec.rb +18 -0
  77. data/spec/unit/waiter_spec.rb +67 -0
  78. metadata +213 -0
@@ -0,0 +1,97 @@
1
+ module SPV
2
+ module DSL
3
+ # This class provides DSL which is used while defining fixtures
4
+ # and applying them.
5
+ class InitialAdjuster
6
+ def initialize(options)
7
+ @options = options
8
+ @tmp_keeper = Fixtures::TmpKeeper.new(@options)
9
+ @fixtures_handler = Fixtures::Handler.new(@options)
10
+ end
11
+
12
+ # Defines fixtures which will be inserted into VCR.
13
+ #
14
+ # @param list [Array<String>] List of fixtures.
15
+ #
16
+ # @return [void]
17
+ #
18
+ # @api public
19
+ def fixtures(list)
20
+ prepared_fixtures = @fixtures_handler.handle_raw(
21
+ list,
22
+ [Fixtures::Modifiers::HomePath.new(@options)]
23
+ )
24
+
25
+ @tmp_keeper.add_fixtures(prepared_fixtures)
26
+ end
27
+
28
+ # Defines path to fixtures. Later this path
29
+ # can be used for defining fixtures. It is especially
30
+ # useful when you use deep subdirectories structure for storing fixtures.
31
+ #
32
+ # @param path [String] Path to fixtures.
33
+ #
34
+ # @return [void]
35
+ #
36
+ # @api public
37
+ def home_path(path)
38
+ @options.home_path = path
39
+ end
40
+
41
+ # Applies a given path to list of fixtures and defines
42
+ # those fixtures to be inserted into VCR.
43
+ #
44
+ # @param path [String] Path to fixtures.
45
+ # @param fixture_names [Array<String>] List of fixtures.
46
+ #
47
+ # @return [void]
48
+ #
49
+ # @raise [ArgumentError] If any of fixture names has path to a home directory.
50
+ #
51
+ # @api public
52
+ def path(path, fixture_names)
53
+ options_with_path = OptionsWithPath.new(@options)
54
+ options_with_path.path = path
55
+
56
+ path_modifier = Fixtures::Modifiers::Path.new(options_with_path)
57
+ home_path_modifier = Fixtures::Modifiers::HomePath.new(options_with_path)
58
+
59
+ prepared_fixtures = @fixtures_handler.handle_raw(
60
+ fixture_names,
61
+ [
62
+ path_modifier,
63
+ home_path_modifier
64
+ ]
65
+ )
66
+
67
+ @tmp_keeper.add_fixtures(prepared_fixtures)
68
+ end
69
+
70
+ # Defines a waiter which will be used for waiting until all HTTP
71
+ # interactions have finished.
72
+ #
73
+ # @param options [Hash, nil] Options which allows to change behavior of a waiter.
74
+ # @option options :eject_cassettes [Boolean] Whether or not to eject
75
+ # all cassettes from VCR once a waiter meets an expectation.
76
+ #
77
+ # @yield Block to be used as a waiter.
78
+ #
79
+ # @return [void]
80
+ #
81
+ # @api public
82
+ def waiter(waiter_options = nil, &block)
83
+ @options.waiter = block
84
+ @options.waiter_options = waiter_options
85
+ end
86
+
87
+ # Returns set of prepared fixtures.
88
+ #
89
+ # @return [SPV::Fixtures] A set of prepared fixtures.
90
+ #
91
+ # @api public
92
+ def prepared_fixtures
93
+ Fixtures.new(@tmp_keeper.fixtures)
94
+ end
95
+ end # class InitialAdjuster
96
+ end # module DSL
97
+ end # module SPV
@@ -0,0 +1,18 @@
1
+ require 'delegate'
2
+
3
+ module SPV
4
+ # Extends a native Capybara element with new methods.
5
+ class Element < SimpleDelegator
6
+ def initialize(element, parent, &block)
7
+ super element
8
+
9
+ @applier = Applier.new(parent, &block)
10
+ end
11
+
12
+ def click_and_apply_vcr(&adjusting_block)
13
+ @applier.apply(adjusting_block) do
14
+ click
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ module SPV
2
+ # Keeps a path to fixture and options which should be
3
+ # passed to Vcr while inserting a cassette
4
+ class Fixture
5
+ attr_accessor :name, :options
6
+
7
+ # TODO: may be it makes sense to separately keep path from the name of a fixture?
8
+ def initialize(name, vcr_options = {})
9
+ @name, @options = name, vcr_options
10
+ end
11
+
12
+ def add_path(path)
13
+ self.name = path + name
14
+ end
15
+
16
+ def set_home_path(home_path)
17
+ self.name = self.name.gsub(/\A\~\//, home_path)
18
+ end
19
+
20
+ def has_link_to_home_path?
21
+ self.name[0..1] == '~/'
22
+ end
23
+
24
+ # Returns a name without a link to a home path
25
+ def clean_name
26
+ self.name[2..-1]
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ module SPV
2
+ # Converts raw fixtures into list of
3
+ # SPV::Fixture objects.
4
+ class Fixtures
5
+ class Converter
6
+ def self.convert_raw(raw_list)
7
+ raw_list.map do |item|
8
+ if item.kind_of?(String)
9
+ Fixture.new(item)
10
+ else
11
+ Fixture.new(item[:fixture], item[:options])
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,31 @@
1
+ module SPV
2
+ class Fixtures
3
+ # Prepares incoming raw fixtures to be used for inserting
4
+ # into VCR
5
+ class Handler
6
+ def initialize(options, convertor = Converter)
7
+ @options = options
8
+
9
+ @converter = convertor
10
+ end
11
+
12
+ def handle_raw(raw_fixtures, modifiers)
13
+ converted_fixtures = @converter.convert_raw(raw_fixtures)
14
+
15
+ modifiers.map do |modifier|
16
+ converted_fixtures.each do |converted_fixture|
17
+ modifier.modify(converted_fixture)
18
+ end
19
+ end
20
+
21
+ converted_fixtures
22
+ end
23
+
24
+ def handle_set_raws(*fixtures_set, modifiers)
25
+ fixtures_set.map do |fixtures_raw|
26
+ handle_raw fixtures_raw, modifiers
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,38 @@
1
+ module SPV
2
+ class Fixtures
3
+ # Takes cares about inserting and ejecting fixtures
4
+ # from Vcr.
5
+ class Manager
6
+ def initialize(options)
7
+ @options = options
8
+ end
9
+
10
+ # Injects given fixtures to Vcr.
11
+ #
12
+ # @param fixtures [Array<SPV::Fixture>] List of fixtures.
13
+ #
14
+ # @return [void]
15
+ #
16
+ # @raise [ArgumentError] If a list of fixtures is empty.
17
+ def inject(fixtures)
18
+ raise ArgumentError.new(
19
+ 'No fixtures were specified to insert them into VCR'
20
+ ) if fixtures.size == 0
21
+
22
+ fixtures.each do |fixture|
23
+ VCR.insert_cassette fixture.name, fixture.options
24
+ end
25
+ end
26
+
27
+ # Ejects all fixtures from Vcr.
28
+ # Now it doesn't care which fixtures were inserted by
29
+ # an instance of this class. After calling this method
30
+ # Vcr will have no inserted fixtures at all.
31
+ #
32
+ # @return [void]
33
+ def eject
34
+ SPV::Helpers.eject_all_cassettes
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,27 @@
1
+ module SPV
2
+ class Fixtures
3
+ module Modifiers
4
+ # It takes a fixture and replaces "~/" with
5
+ # a defined home path
6
+ class HomePath
7
+ def initialize(options)
8
+ @options = options
9
+ end
10
+
11
+ def modify(fixture)
12
+ if fixture.has_link_to_home_path?
13
+ if @options.home_path
14
+ fixture.set_home_path(@options.home_path)
15
+ else
16
+ raise ArgumentError.new(
17
+ "You are trying to use a home path for #{fixture.name} fixture. " \
18
+ "Home path cannot be used since it is not defined, please refer to the documentation " \
19
+ "to make sure you define the home path properly."
20
+ )
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ module SPV
2
+ class Fixtures
3
+ module Modifiers
4
+ # It takes a fixture and adds a path to it
5
+ class Path
6
+ def initialize(options)
7
+ @options = options
8
+ end
9
+
10
+ def modify(fixture)
11
+ if fixture.has_link_to_home_path?
12
+ raise HomePathError.new(
13
+ "You cannot use the home path while listing fixtures in the 'path' method. " <<
14
+ "Please, use 'fixtures' method for '#{fixture.clean_name}' fixture or " <<
15
+ "you can additionally use the 'path' method where you will specify a home path as a path name." <<
16
+ "Example: path('~/', ['#{fixture.clean_name}'])"
17
+ )
18
+ else
19
+ path = @options.path
20
+ path = path + '/' unless path[-1, 1] == '/'
21
+
22
+ fixture.add_path(path)
23
+ end
24
+ end
25
+
26
+ class HomePathError < ArgumentError; end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,21 @@
1
+ module SPV
2
+ class Fixtures
3
+ # This class is responsible for keeping a list
4
+ # of prepared fixtures which will be inserted to Vcr.
5
+ class TmpKeeper
6
+ attr_reader :fixtures
7
+
8
+ def initialize(options)
9
+ @fixtures, @options = [], options
10
+ end
11
+
12
+ def clean_fixtures
13
+ @fixtures = []
14
+ end
15
+
16
+ def add_fixtures(new_fixtures)
17
+ @fixtures.concat(new_fixtures)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,41 @@
1
+ module SPV
2
+ # This class is a container for keeping all prepared fixtures for inserting
3
+ # into VCR.
4
+ class Fixtures
5
+ include Enumerable
6
+
7
+ def initialize(vals)
8
+ @container = vals.each_with_object({}) do |fixture, memo|
9
+ memo[fixture.name] = fixture
10
+ end
11
+ end
12
+
13
+ def exchange(old_vals, new_vals)
14
+ new_list = self.each_with_object([]) do |item, memo|
15
+ memo << item unless old_vals.any? {|old_item| item.name == old_item.name }
16
+ end
17
+
18
+ self.class.new(new_list.concat(new_vals))
19
+ end
20
+
21
+ def replace(vals)
22
+ if vals.length > 0
23
+ self.class.new(vals)
24
+ else
25
+ self
26
+ end
27
+ end
28
+
29
+ def union(vals)
30
+ self.class.new(@container.values.concat(vals))
31
+ end
32
+
33
+ def each(&block)
34
+ @container.values.each &block
35
+ end
36
+
37
+ def size
38
+ @container.values
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,22 @@
1
+ # TODO: should be this class immutable?
2
+ module SPV
3
+ class Options
4
+ attr_accessor :waiter, :waiter_options, :home_path
5
+
6
+ def initialize(options = {})
7
+ options.each do |key, val|
8
+ public_send("#{key}=", val)
9
+ end
10
+ end
11
+
12
+ def home_path=(val)
13
+ val << '/' unless val[-1, 1] == '/'
14
+
15
+ @home_path = val
16
+ end
17
+
18
+ def clone_options
19
+ dup
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,7 @@
1
+ require 'delegate'
2
+
3
+ module SPV
4
+ class OptionsWithPath < SimpleDelegator
5
+ attr_accessor :path
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ module SitePrism::ElementContainer
2
+ def element_with_vcr(element_name, *args, &block)
3
+ element element_name, *args
4
+
5
+ origin_element_name = "origin_#{element_name}"
6
+
7
+ alias_method origin_element_name, element_name
8
+
9
+ define_method element_name.to_s do
10
+ elem = public_send(origin_element_name)
11
+
12
+ SPV::Element.new(elem, self, &block)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,41 @@
1
+ module SitePrism
2
+ class Page
3
+ # TODO: it should make sure this method does not a native method of SitePrism::Page class
4
+ def self.inherited(subclass)
5
+ # This code is required to allow subpages to inherit
6
+ # a defined adjuster block. Otherwise, that block should be
7
+ # duplicated in a subpage as well.
8
+ subclass.instance_variable_set(:@vcr_adjuster, @vcr_adjuster)
9
+ end
10
+
11
+ def self.vcr_options_for_load(&block)
12
+ @vcr_adjuster = block
13
+ end
14
+
15
+ def self.vcr_adjuster
16
+ @vcr_adjuster
17
+ end
18
+
19
+ def apply_vcr(*args, action_block, &adjusting_block)
20
+ applier = SPV::Applier.new(
21
+ self,
22
+ &self.class.vcr_adjuster
23
+ )
24
+
25
+ applier.apply(
26
+ adjusting_block
27
+ ) do
28
+ action_block.call
29
+ end
30
+ end
31
+
32
+ def load_and_apply_vcr(*args, &adjusting_block)
33
+ action_block = proc { load(*args) }
34
+
35
+ apply_vcr(
36
+ action_block,
37
+ &adjusting_block
38
+ )
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,18 @@
1
+ module SPV
2
+ module Helpers
3
+ # Ejects all cassettes from Vcr.
4
+ #
5
+ # It can be useful when you don't define a waiter while describing
6
+ # cassettes which will be applied on an action (click,
7
+ # page loading actions or any other). If you don't define a waiter
8
+ # this method should be used to avoid data mixing which can lead you to wrong
9
+ # behavior in your acceptance tests.
10
+ #
11
+ # @return [void]
12
+ # @api public
13
+ def self.eject_all_cassettes
14
+ while VCR.eject_cassette
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module SPV
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,23 @@
1
+ module SPV
2
+ class Waiter
3
+ def initialize(node, fixtures_manager, options)
4
+ @node, @waiter_method = node, options.waiter
5
+ @fixtures_manager = fixtures_manager
6
+ @options = options.waiter_options || {}
7
+ end
8
+
9
+ def wait
10
+ if @waiter_method
11
+ @node.instance_eval &@waiter_method
12
+
13
+ if @options.fetch(:eject_cassettes, true)
14
+ @fixtures_manager.eject
15
+ end
16
+ end
17
+ end
18
+
19
+ def with_new_options(options)
20
+ self.class.new(@node, @fixtures_manager, options)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ require 'vcr'
2
+ require 'capybara'
3
+ require 'site_prism'
4
+ require 'webmock'
5
+
6
+ require 'site_prism_vcr/version'
7
+ require 'site_prism_vcr/element'
8
+ require 'site_prism_vcr/applier'
9
+ require 'site_prism_vcr/fixture'
10
+ require 'site_prism_vcr/fixtures'
11
+ require 'site_prism_vcr/fixtures/tmp_keeper'
12
+ require 'site_prism_vcr/fixtures/converter'
13
+ require 'site_prism_vcr/fixtures/manager'
14
+ require 'site_prism_vcr/fixtures/handler'
15
+ require 'site_prism_vcr/fixtures/modifiers/path'
16
+ require 'site_prism_vcr/fixtures/modifiers/home_path'
17
+ require 'site_prism_vcr/options'
18
+ require 'site_prism_vcr/options_with_path'
19
+ require 'site_prism_vcr/dsl/initial_adjuster'
20
+ require 'site_prism_vcr/dsl/adjuster'
21
+ require 'site_prism_vcr/waiter'
22
+ require 'site_prism_vcr/vcr_helpers'
23
+ require 'site_prism_vcr/patches/page'
24
+ require 'site_prism_vcr/patches/element_container'
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'site_prism_vcr/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'site_prism.vcr'
8
+ spec.version = SPV::VERSION
9
+ spec.authors = ['Dmitriy Nesteryuk']
10
+ spec.email = ['nesterukd@gmail.com']
11
+ spec.description = 'This gem integrates VCR library into SitePrism'
12
+ spec.summary = 'VCR and SitePrism are awesome libraries. But, it is a bit difficult to work with them without some bridge between them. This gem combines these 2 libraries to provide a better way for stubbing external API request which your application is doing. This gem will be very helpful for developers which have an application working with an external API.'
13
+ spec.homepage = 'https://github.com/nestd/site_prism.vcr'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
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_dependency 'site_prism', '~> 2.4'
22
+ spec.add_dependency 'vcr', '~> 2.6.0'
23
+ spec.add_dependency 'webmock'
24
+ end
@@ -0,0 +1,44 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.github.com/users/max/orgs
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ Server:
16
+ - GitHub.com
17
+ Date:
18
+ - Mon, 18 Mar 2013 21:29:04 GMT
19
+ Content-Type:
20
+ - application/json; charset=utf-8
21
+ Connection:
22
+ - keep-alive
23
+ Status:
24
+ - 200 OK
25
+ X-Ratelimit-Limit:
26
+ - '60'
27
+ X-Ratelimit-Remaining:
28
+ - '54'
29
+ X-Github-Media-Type:
30
+ - github.beta
31
+ X-Content-Type-Options:
32
+ - nosniff
33
+ Content-Length:
34
+ - '2'
35
+ Etag:
36
+ - '"d751713988987e9331980363e24189ce"'
37
+ Cache-Control:
38
+ - max-age=0, private, must-revalidate
39
+ body:
40
+ encoding: ASCII-8BIT
41
+ string: '{"cat_owner":"Arya Stark","cat_name":"Max"}'
42
+ http_version:
43
+ recorded_at: Thu, 23 May 2013 19:43:53 GMT
44
+ recorded_with: VCR 2.5.0
@@ -0,0 +1,44 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.github.com/users/max/orgs
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ Server:
16
+ - GitHub.com
17
+ Date:
18
+ - Mon, 18 Mar 2013 21:29:04 GMT
19
+ Content-Type:
20
+ - application/json; charset=utf-8
21
+ Connection:
22
+ - keep-alive
23
+ Status:
24
+ - 200 OK
25
+ X-Ratelimit-Limit:
26
+ - "60"
27
+ X-Ratelimit-Remaining:
28
+ - "54"
29
+ X-Github-Media-Type:
30
+ - github.beta
31
+ X-Content-Type-Options:
32
+ - nosniff
33
+ Content-Length:
34
+ - '2'
35
+ Etag:
36
+ - '"d751713988987e9331980363e24189ce"'
37
+ Cache-Control:
38
+ - max-age=0, private, must-revalidate
39
+ body:
40
+ encoding: ASCII-8BIT
41
+ string: '{"cat_owner":"<%= cat_owner %>","cat_name":"Max"}'
42
+ http_version:
43
+ recorded_at: Mon, 18 Mar 2013 21:29:05 GMT
44
+ recorded_with: VCR 2.4.0
@@ -0,0 +1,44 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.github.com/users/max/orgs
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ Server:
16
+ - GitHub.com
17
+ Date:
18
+ - Mon, 18 Mar 2013 21:29:04 GMT
19
+ Content-Type:
20
+ - application/json; charset=utf-8
21
+ Connection:
22
+ - keep-alive
23
+ Status:
24
+ - 200 OK
25
+ X-Ratelimit-Limit:
26
+ - "60"
27
+ X-Ratelimit-Remaining:
28
+ - "54"
29
+ X-Github-Media-Type:
30
+ - github.beta
31
+ X-Content-Type-Options:
32
+ - nosniff
33
+ Content-Length:
34
+ - '2'
35
+ Etag:
36
+ - '"d751713988987e9331980363e24189ce"'
37
+ Cache-Control:
38
+ - max-age=0, private, must-revalidate
39
+ body:
40
+ encoding: ASCII-8BIT
41
+ string: '{"cat_owner":"Bran Stark","cat_name":"Max"}'
42
+ http_version:
43
+ recorded_at: Tue, 18 May 2013 23:31:55 GMT
44
+ recorded_with: VCR 2.4.0