saddle 0.0.53 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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=