saddle 0.0.53 → 0.1.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.
@@ -1,3 +1,6 @@
1
+ # 0.0.54
2
+ * Work with faraday ~> 0.9.0. With these changes, Saddle no longer works with faraday < 0.9.
3
+
1
4
  # 0.0.49
2
5
  * Support `extra_env` as a client option to load more into the env pre-adapter.
3
6
 
data/README.md CHANGED
@@ -41,16 +41,16 @@ Saddle enables you to create beautifully stable and functionaly API clients, in
41
41
  [saddle-example](https://github.com/mLewisLogic/saddle-example)
42
42
 
43
43
  ### client construction
44
- 0. For the sake of cleanliness, pick a namespace that everything related to your client should live in. For this example, we'll use __SaddleExample__
45
- 1. Inherit your client class, __SaddleExample::Client__, from __Saddle::Client__
46
- 2. Create an _endpoints_ directory at the same level as your client class file
47
- 3. Create endpoint classes in the _endpoints_ directory that inherit from __Saddle::TraversalEndpoint__ and are under the __SaddleExample::Endpoints__ namespace module
48
- 1. Give these endpoints methods that call _get_ or _post_ to perform the actual request
49
- 2. Their module/class namespace determines how they are accessed in the client's call tree. For example, the get\_all() in __SaddleExample::Endpoints::Fish::Guppy__ would be accessed by:
44
+ 0. For the sake of cleanliness, pick a namespace that everything related to your client should live in. For this example, we'll use __SaddleExample__.
45
+ 1. Inherit your client class, __SaddleExample::Client__, from __Saddle::Client__.
46
+ 2. Create an _endpoints_ directory at the same level as your client class file.
47
+ 3. Create endpoint classes in the _endpoints_ directory that inherit from __Saddle::TraversalEndpoint__ and are under the __SaddleExample::Endpoints__ namespace module.
48
+ 1. Give these endpoints methods that call `get` or `post` to perform the actual request
49
+ 2. Their module/class namespace determines how they are accessed in the client's call tree. For example, the `get_all` in __SaddleExample::Endpoints::Fish::Guppy__ would be accessed by:
50
50
 
51
- client.fish.guppy.get_all()
51
+ client.fish.guppy.get_all
52
52
 
53
- 3. If you need REST style endpoints like client.fish('guppy').catch() then check out __Saddle::ResourceEndpoint__ and how it's used in [saddle-example](https://github.com/mLewisLogic/saddle-example/blob/master/lib/endpoints/kitten.rb)
53
+ 3. If you need REST style endpoints like `client.kitten.by_id('Whiskers').info` then check out __Saddle::ResourceEndpoint__ and how it's used in [saddle-example](https://github.com/mLewisLogic/saddle-example/blob/master/lib/saddle-example/endpoints/kitten.rb)
54
54
 
55
55
  4. Initialize an instance of your client. ex:
56
56
 
@@ -62,6 +62,12 @@ Saddle enables you to create beautifully stable and functionaly API clients, in
62
62
  * xml posting/parsing
63
63
 
64
64
 
65
+ ## version notes
66
+
67
+ * Saddle versions 0.1.x are compatible with Faraday versions ~> 0.9.0
68
+ * Saddle versions 0.0.x are compatible with Faraday versions ~> 0.8.7
69
+
70
+
65
71
  ## Code Status
66
72
 
67
73
  * [![Build Status](https://travis-ci.org/mLewisLogic/saddle.png?branch=master)](https://travis-ci.org/mLewisLogic/saddle)
@@ -17,18 +17,15 @@ module Saddle
17
17
  def initialize(requester, relative_path_override=nil, parent=nil)
18
18
  @requester = requester
19
19
  @parent = parent
20
- @relative_path = relative_path_override || _relative_path()
20
+ @relative_path = relative_path_override || _relative_path
21
21
  end
22
22
 
23
23
 
24
24
  # Generic request wrapper
25
25
  def request(method, action, params={}, options={})
26
26
  # Augment in interesting options
27
- options[:saddle] ||= {}
28
- options[:saddle] = {
29
- :call_chain => _path_array(),
30
- :action => action,
31
- }
27
+ options[:call_chain] = _path_array
28
+ options[:action] = action
32
29
  @requester.send(method, _path(action), params, options)
33
30
  end
34
31
 
@@ -87,7 +84,7 @@ module Saddle
87
84
  if defined?(self.class::ABSOLUTE_PATH)
88
85
  [self.class::ABSOLUTE_PATH]
89
86
  else
90
- _path_array()
87
+ _path_array
91
88
  end
92
89
  # Join it with the action
93
90
  paths = pre_action_paths + [action]
@@ -97,7 +94,7 @@ module Saddle
97
94
  end
98
95
 
99
96
  def _path_array
100
- _endpoint_chain().map(&:relative_path).compact
97
+ _endpoint_chain.map(&:relative_path).compact
101
98
  end
102
99
 
103
100
  # Get the parent chain that led to this endpoint
@@ -108,7 +105,7 @@ module Saddle
108
105
  chain << node
109
106
  node = node.parent
110
107
  end
111
- chain.reverse()
108
+ chain.reverse
112
109
  end
113
110
 
114
111
  # If the parent is not an endpoint, it is a root node
@@ -0,0 +1,15 @@
1
+ module Saddle
2
+ # Same as the standard Faraday::RackBuilder, but also allows passing saddle options to the env.
3
+ class RackBuilder < ::Faraday::RackBuilder
4
+ def saddle_options
5
+ @saddle_options ||= {}
6
+ end
7
+
8
+ def build_env(connection, request)
9
+ env = super
10
+ env[:saddle] = saddle_options.deep_merge(request.saddle_options)
11
+ env
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ # Allow saddle options to be accessible through Faraday::Request.
2
+ Faraday::Request.instance_eval do
3
+ attr_accessor :saddle_options
4
+ end
@@ -14,17 +14,17 @@ module Saddle
14
14
  TYPE_URLENCODED = 'application/x-www-form-urlencoded'.freeze
15
15
 
16
16
  def call(env)
17
- if env[:request][:client_options][:oauth1] &&
18
- env[:request][:client_options][:oauth1][:consumer_key] &&
19
- env[:request][:client_options][:oauth1][:consumer_secret] &&
20
- env[:request][:client_options][:oauth1][:token] &&
21
- env[:request][:client_options][:oauth1][:token_secret]
17
+ if env[:saddle][:client_options][:oauth1] &&
18
+ env[:saddle][:client_options][:oauth1][:consumer_key] &&
19
+ env[:saddle][:client_options][:oauth1][:consumer_secret] &&
20
+ env[:saddle][:client_options][:oauth1][:token] &&
21
+ env[:saddle][:client_options][:oauth1][:token_secret]
22
22
 
23
23
  env[:request_headers]['Authorization'] ||= SimpleOAuth::Header.new(
24
24
  env[:method],
25
25
  env[:url].to_s,
26
26
  filtered_body_params(env),
27
- env[:request][:client_options][:oauth1]
27
+ env[:saddle][:client_options][:oauth1]
28
28
  ).to_s
29
29
  end
30
30
 
@@ -16,10 +16,10 @@ module Saddle
16
16
  end
17
17
 
18
18
  def call(env)
19
- if env[:request][:client_options][@key_name.to_sym]
19
+ if env[:saddle][:client_options][@key_name.to_sym]
20
20
  new_query = []
21
21
  new_query << env[:url].query if env[:url].query
22
- new_query << "#{@key_name}=#{CGI.escape(env[:request][:client_options][@key_name.to_sym].to_s)}"
22
+ new_query << "#{@key_name}=#{CGI.escape(env[:saddle][:client_options][@key_name.to_sym].to_s)}"
23
23
  env[:url].query = new_query.join('&')
24
24
  end
25
25
 
@@ -9,8 +9,8 @@ module Saddle
9
9
 
10
10
  class ExtraEnv < Faraday::Middleware
11
11
  def call(env)
12
- if env[:request][:client_options][:extra_env]
13
- env.merge!(env[:request][:client_options][:extra_env])
12
+ if env[:saddle][:client_options][:extra_env]
13
+ env.merge!(env[:saddle][:client_options][:extra_env])
14
14
  end
15
15
 
16
16
  @app.call env
@@ -15,7 +15,7 @@ module Saddle
15
15
  @app.call(env)
16
16
  rescue => e
17
17
  if defined?(Rails.logger)
18
- Rails.logger.error("#{env[:request][:saddle][:client].name} error: #{e}")
18
+ Rails.logger.error("#{env[:saddle][:client].name} error: #{e}")
19
19
  end
20
20
  # Re-raise the error
21
21
  raise
@@ -33,16 +33,16 @@ module Saddle
33
33
 
34
34
  def call(env)
35
35
  # Try to build up a path for the STATSD logging
36
- if env[:request][:statsd_path]
37
- statsd_path = env[:request][:statsd_path]
38
- elsif env[:request][:saddle]
36
+ if env[:saddle][:statsd_path]
37
+ statsd_path = env[:saddle][:statsd_path]
38
+ elsif env[:saddle][:client]
39
39
  statsd_path_components = [
40
40
  'saddle',
41
- env[:request][:saddle][:client].name.underscore,
41
+ env[:saddle][:client].name.underscore,
42
42
  ]
43
- if env[:request][:saddle][:call_chain] && env[:request][:saddle][:action]
44
- statsd_path_components += env[:request][:saddle][:call_chain]
45
- statsd_path_components << env[:request][:saddle][:action]
43
+ if env[:saddle][:call_chain] && env[:saddle][:action]
44
+ statsd_path_components += env[:saddle][:call_chain]
45
+ statsd_path_components << env[:saddle][:action]
46
46
  else
47
47
  statsd_path_components << 'raw'
48
48
  statsd_path_components << "#{env[:url].host}#{env[:url].path}"
@@ -20,7 +20,7 @@ module Saddle
20
20
  end
21
21
 
22
22
  def call(env)
23
- if env[:request][:request_style] == :json
23
+ if env[:saddle][:request_style] == :json
24
24
  # Make sure we're working with a valid body that's not a String
25
25
  if env[:body] and !env[:body].respond_to?(:to_str)
26
26
  env[:request_headers][CONTENT_TYPE] ||= MIME_TYPE
@@ -10,8 +10,8 @@ module Saddle
10
10
 
11
11
  class PathPrefix < Faraday::Middleware
12
12
  def call(env)
13
- if env[:request][:client_options][:path_prefix]
14
- env[:url].path = "/#{env[:request][:client_options][:path_prefix]}#{env[:url].path}"
13
+ if env[:saddle][:client_options][:path_prefix]
14
+ env[:url].path = "/#{env[:saddle][:client_options][:path_prefix]}#{env[:url].path}"
15
15
  end
16
16
 
17
17
  @app.call env
@@ -17,13 +17,13 @@ module Saddle
17
17
  end
18
18
 
19
19
  def call(env)
20
- retries = env[:request][:num_retries] || 0
21
- backoff = env[:request][:retry_backoff] || 0.050 # in seconds
20
+ retries = env[:saddle][:num_retries] || 0
21
+ backoff = env[:saddle][:retry_backoff] || 0.050 # in seconds
22
22
  begin
23
23
  @app.call(self.class.deep_copy(env))
24
24
  rescue => e
25
25
  # Only retry for GET or if the request is marked as idempotent
26
- if env[:method] == :get || env[:request][:idempotent]
26
+ if env[:method] == :get || env[:saddle][:idempotent]
27
27
  unless @ignored_exceptions.include?(e.class)
28
28
  # Retry a limited number of times
29
29
  if retries > 0
@@ -40,7 +40,11 @@ module Saddle
40
40
  end
41
41
 
42
42
  def self.deep_copy(value)
43
- if value.is_a?(Hash)
43
+ if value.is_a?(Struct)
44
+ result = value.clone
45
+ value.each{|k, v| result.send("#{k}=", deep_copy(v))}
46
+ result
47
+ elsif value.is_a?(Hash)
44
48
  result = value.clone
45
49
  value.each{|k, v| result[k] = deep_copy(v)}
46
50
  result
@@ -24,7 +24,7 @@ module Saddle
24
24
 
25
25
 
26
26
  def call(env)
27
- if env[:request][:request_style] == :urlencoded
27
+ if env[:saddle][:request_style] == :urlencoded
28
28
  # Make sure we're working with a valid body that's not a String
29
29
  if env[:body] and !env[:body].respond_to?(:to_str)
30
30
  if has_multipart?(env[:body])
@@ -13,7 +13,7 @@ module Saddle
13
13
  user_agent = nil
14
14
  # Build a user agent that looks like 'SaddleExample 0.0.1'
15
15
  begin
16
- user_agent = client_name = env[:request][:saddle][:client].name
16
+ user_agent = client_name = env[:saddle][:client].name
17
17
  parent_module = client_name.split('::')[0..-2].join('::').constantize
18
18
  if parent_module
19
19
  if defined?(parent_module::VERSION)
@@ -13,7 +13,7 @@ module Saddle
13
13
  begin
14
14
  @app.call(env)
15
15
  rescue
16
- if res = env[:request][:default_response]
16
+ if res = env[:saddle][:default_response]
17
17
  return ::Faraday::Response.new(:body => res)
18
18
  else
19
19
  raise
@@ -13,7 +13,7 @@ module Saddle
13
13
  class RubyTimeout < Faraday::Middleware
14
14
 
15
15
  def call(env)
16
- timeout = env[:request][:hard_timeout] # nil or 0 means no timeout
16
+ timeout = env[:saddle][:hard_timeout] # nil or 0 means no timeout
17
17
  Timeout.timeout(timeout, Saddle::TimeoutError) do
18
18
  @app.call(env)
19
19
  end
@@ -2,7 +2,8 @@ require 'active_support/core_ext/hash'
2
2
 
3
3
  require 'faraday'
4
4
  require 'faraday_middleware'
5
-
5
+ require 'saddle/faraday/request'
6
+ require 'saddle/faraday/rack_builder'
6
7
 
7
8
  require 'saddle/middleware/request/encode_json'
8
9
  require 'saddle/middleware/request/path_prefix'
@@ -79,7 +80,7 @@ module Saddle
79
80
  # Make a GET request
80
81
  def get(url, params={}, options={})
81
82
  response = connection.get do |req|
82
- req.options.deep_merge!(options)
83
+ req.saddle_options = options
83
84
  req.body = options[:body] if options.has_key?(:body)
84
85
  req.url(url, params)
85
86
  end
@@ -89,7 +90,7 @@ module Saddle
89
90
  # Make a POST request
90
91
  def post(url, data={}, options={})
91
92
  response = connection.post do |req|
92
- req.options.deep_merge!(options)
93
+ req.saddle_options = options
93
94
  req.url(url)
94
95
  req.body = data
95
96
  end
@@ -99,7 +100,7 @@ module Saddle
99
100
  # Make a PUT request
100
101
  def put(url, data={}, options={})
101
102
  response = connection.put do |req|
102
- req.options.deep_merge!(options)
103
+ req.saddle_options = options
103
104
  req.url(url)
104
105
  req.body = data
105
106
  end
@@ -109,7 +110,7 @@ module Saddle
109
110
  # Make a DELETE request
110
111
  def delete(url, params={}, options={})
111
112
  response = connection.delete do |req|
112
- req.options.deep_merge!(options)
113
+ req.saddle_options = options
113
114
  req.url(url, params)
114
115
  end
115
116
  handle_response(response)
@@ -131,61 +132,59 @@ module Saddle
131
132
 
132
133
  # Build a connection instance, wrapped in the middleware that we want
133
134
  def connection
134
- @connection ||= Faraday.new(base_url) do |builder|
135
+ @connection ||= Faraday.new(base_url, :builder_class => Saddle::RackBuilder) do |connection|
135
136
  # Include the requester level options
136
- builder.options[:client_options] = @options
137
+ connection.builder.saddle_options[:client_options] = @options
137
138
 
138
139
  # Config options
139
- builder.options[:timeout] = @timeout
140
- builder.options[:request_style] = @request_style
141
- builder.options[:num_retries] = @num_retries
142
- builder.options[:saddle] = {
143
- :client => @parent_client,
144
- }
140
+ connection.options[:timeout] = @timeout
141
+ connection.builder.saddle_options[:request_style] = @request_style
142
+ connection.builder.saddle_options[:num_retries] = @num_retries
143
+ connection.builder.saddle_options[:client] = @parent_client
145
144
 
146
145
  # Support default return values upon exception
147
- builder.use(Saddle::Middleware::Response::DefaultResponse)
146
+ connection.use(Saddle::Middleware::Response::DefaultResponse)
148
147
 
149
148
  # Hard timeout on the entire request
150
- builder.use(Saddle::Middleware::RubyTimeout)
149
+ connection.use(Saddle::Middleware::RubyTimeout)
151
150
 
152
151
  # Set up a user agent
153
- builder.use(Saddle::Middleware::Request::UserAgent)
152
+ connection.use(Saddle::Middleware::Request::UserAgent)
154
153
 
155
154
  # Set up the path prefix if needed
156
- builder.use(Saddle::Middleware::Request::PathPrefix)
155
+ connection.use(Saddle::Middleware::Request::PathPrefix)
157
156
 
158
157
  # Apply additional implementation-specific middlewares
159
158
  @additional_middlewares.each do |m|
160
- m[:args] ? builder.use(m[:klass], *m[:args]) : builder.use(m[:klass])
159
+ m[:args] ? connection.use(m[:klass], *m[:args]) : connection.use(m[:klass])
161
160
  end
162
161
 
163
162
  # Request encoding
164
- builder.use(Saddle::Middleware::Request::JsonEncoded)
165
- builder.use(Saddle::Middleware::Request::UrlEncoded)
163
+ connection.use(Saddle::Middleware::Request::JsonEncoded)
164
+ connection.use(Saddle::Middleware::Request::UrlEncoded)
166
165
 
167
166
  # Automatic retries
168
- builder.use(Saddle::Middleware::Request::Retry)
167
+ connection.use(Saddle::Middleware::Request::Retry)
169
168
 
170
169
  # Raise exceptions on 4xx and 5xx errors
171
- builder.use(Saddle::Middleware::Response::RaiseError)
170
+ connection.use(Saddle::Middleware::Response::RaiseError)
172
171
 
173
172
  # Handle parsing out the response if it's JSON
174
- builder.use(Saddle::Middleware::Response::ParseJson)
173
+ connection.use(Saddle::Middleware::Response::ParseJson)
175
174
 
176
175
  # Set up instrumentation around the adapter for extensibility
177
- builder.use(FaradayMiddleware::Instrumentation)
176
+ connection.use(FaradayMiddleware::Instrumentation)
178
177
 
179
178
  # Add in extra env data if needed
180
- builder.use(Saddle::Middleware::ExtraEnv)
179
+ connection.use(Saddle::Middleware::ExtraEnv)
181
180
 
182
181
  # Set up our adapter
183
182
  if @stubs.nil?
184
183
  # Use the default adapter
185
- builder.adapter(@http_adapter[:key], *@http_adapter[:args])
184
+ connection.adapter(@http_adapter[:key], *@http_adapter[:args])
186
185
  else
187
186
  # Use the test adapter
188
- builder.adapter(:test, @stubs)
187
+ connection.adapter(:test, @stubs)
189
188
  end
190
189
  end
191
190
  end
@@ -1,3 +1,3 @@
1
1
  module Saddle
2
- VERSION = '0.0.53'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -28,6 +28,6 @@ Gem::Specification.new do |s|
28
28
  s.add_dependency 'activesupport', '>= 3.0'
29
29
  end
30
30
 
31
- s.add_dependency 'faraday', '~> 0.8.7'
31
+ s.add_dependency 'faraday', '~> 0.9.0'
32
32
  s.add_dependency 'faraday_middleware', '~> 0.9.0'
33
33
  end
@@ -26,7 +26,7 @@ describe Saddle::Client do
26
26
  end
27
27
 
28
28
  it "should request properly with params in the body" do
29
- @stubs.send(:new_stub, :get, '/test', "body data") {
29
+ @stubs.send(:new_stub, :get, '/test', {}, "body data") {
30
30
  [
31
31
  200,
32
32
  {},
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saddle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.53
4
+ version: 0.1.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Mike Lewis
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-05-13 00:00:00.000000000 Z
12
+ date: 2015-07-02 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: activesupport
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ! '>='
18
20
  - !ruby/object:Gem::Version
@@ -20,6 +22,7 @@ dependencies:
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ! '>='
25
28
  - !ruby/object:Gem::Version
@@ -27,20 +30,23 @@ dependencies:
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: faraday
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
35
  - - ~>
32
36
  - !ruby/object:Gem::Version
33
- version: 0.8.7
37
+ version: 0.9.0
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
43
  - - ~>
39
44
  - !ruby/object:Gem::Version
40
- version: 0.8.7
45
+ version: 0.9.0
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: faraday_middleware
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
51
  - - ~>
46
52
  - !ruby/object:Gem::Version
@@ -48,6 +54,7 @@ dependencies:
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
59
  - - ~>
53
60
  - !ruby/object:Gem::Version
@@ -87,6 +94,8 @@ files:
87
94
  - lib/saddle/client_attributes.rb
88
95
  - lib/saddle/endpoint.rb
89
96
  - lib/saddle/errors.rb
97
+ - lib/saddle/faraday/rack_builder.rb
98
+ - lib/saddle/faraday/request.rb
90
99
  - lib/saddle/method_tree_builder.rb
91
100
  - lib/saddle/middleware/authentication/oauth1.rb
92
101
  - lib/saddle/middleware/authentication/oauth2.rb
@@ -123,26 +132,27 @@ files:
123
132
  homepage: https://github.com/mLewisLogic/saddle
124
133
  licenses:
125
134
  - MIT
126
- metadata: {}
127
135
  post_install_message:
128
136
  rdoc_options: []
129
137
  require_paths:
130
138
  - lib
131
139
  required_ruby_version: !ruby/object:Gem::Requirement
140
+ none: false
132
141
  requirements:
133
142
  - - ! '>='
134
143
  - !ruby/object:Gem::Version
135
144
  version: '0'
136
145
  required_rubygems_version: !ruby/object:Gem::Requirement
146
+ none: false
137
147
  requirements:
138
148
  - - ! '>='
139
149
  - !ruby/object:Gem::Version
140
150
  version: '0'
141
151
  requirements: []
142
152
  rubyforge_project:
143
- rubygems_version: 2.2.2
153
+ rubygems_version: 1.8.23.2
144
154
  signing_key:
145
- specification_version: 4
155
+ specification_version: 3
146
156
  summary: A full-featured, generic consumer layer for you to build API client implementations
147
157
  with.
148
158
  test_files:
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ODQ4YmI4OGJiZDRjMjBhNmFkOWI1NGEzZWIyNDA0NWM3NGJjZTdlMQ==
5
- data.tar.gz: !binary |-
6
- NGI3MWM5MDgzZWIyYjVkM2RhYzk1YmRjMGY5YjU3MmE2N2MxNGYyMQ==
7
- SHA512:
8
- metadata.gz: !binary |-
9
- M2JkMWY0YTljNmFmOGI3MjA0NjY0MDRkZmU0ODc4MDNlYmYzMTNmNjVkMmJl
10
- YmI4ZjBkMzhiOWJhMmFlYjg1MGE1YTJjZDg4MmY5Mjc0N2RmNDBkZjFjZmMy
11
- ZjYxZWVjYzZiZjI1MzMwYWJmMjdiYWY3NDJmODNmMDk5ZGY0M2I=
12
- data.tar.gz: !binary |-
13
- M2Q3NWU4ODRkZGRkOWI5MDY2NmFkZWY3NDViNmZmYjE2NWJlMjEyYTBhY2Qx
14
- ZGY3M2VmYzIwMmFkMjc2M2VlZTRhNTQwZjU1Yjg1MGRlNzMyMTQ0Mzg0NDRj
15
- NGViYjZjY2EwMWIwN2VkYzgzNGU0MGI2NjJiODVkNGY5M2ZjZDU=