File: serializers.rb

package info (click to toggle)
ruby-vcr 6.0.0%2Breally5.0.0-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,320 kB
  • sloc: ruby: 8,456; sh: 177; makefile: 7
file content (59 lines) | stat: -rw-r--r-- 2,006 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
module VCR
  class Cassette
    # Keeps track of the cassette serializers in a hash-like object.
    class Serializers
      autoload :YAML,       'vcr/cassette/serializers/yaml'
      autoload :Syck,       'vcr/cassette/serializers/syck'
      autoload :Psych,      'vcr/cassette/serializers/psych'
      autoload :JSON,       'vcr/cassette/serializers/json'
      autoload :Compressed, 'vcr/cassette/serializers/compressed'

      # @private
      def initialize
        @serializers = {}
      end

      # Gets the named serializer.
      #
      # @param name [Symbol] the name of the serializer
      # @return the named serializer
      # @raise [ArgumentError] if there is not a serializer for the given name
      def [](name)
        @serializers.fetch(name) do |_|
          @serializers[name] = case name
            when :yaml        then YAML
            when :syck        then Syck
            when :psych       then Psych
            when :json        then JSON
            when :compressed  then Compressed
            else raise ArgumentError.new("The requested VCR cassette serializer (#{name.inspect}) is not registered.")
          end
        end
      end

      # Registers a serializer.
      #
      # @param name [Symbol] the name of the serializer
      # @param value [#file_extension, #serialize, #deserialize] the serializer object. It must implement
      #  `file_extension()`, `serialize(Hash)` and `deserialize(String)`.
      def []=(name, value)
        if @serializers.has_key?(name)
          warn "WARNING: There is already a VCR cassette serializer registered for #{name.inspect}. Overriding it."
        end

        @serializers[name] = value
      end
    end

    # @private
    module EncodingErrorHandling
      def handle_encoding_errors
        yield
      rescue *self::ENCODING_ERRORS => e
        e.message << "\nNote: Using VCR's `:preserve_exact_body_bytes` option may help prevent this error in the future."
        raise
      end
    end
  end
end