gems 0.8.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.md +3 -3
  3. data/README.md +11 -23
  4. data/gems.gemspec +12 -16
  5. data/lib/gems.rb +7 -3
  6. data/lib/gems/client.rb +47 -60
  7. data/lib/gems/configuration.rb +7 -7
  8. data/lib/gems/request.rb +26 -22
  9. data/lib/gems/version.rb +3 -3
  10. metadata +28 -105
  11. data.tar.gz.sig +0 -2
  12. data/Rakefile +0 -11
  13. data/spec/fixtures/add_owner +0 -1
  14. data/spec/fixtures/add_web_hook +0 -1
  15. data/spec/fixtures/api_key +0 -1
  16. data/spec/fixtures/dependencies +0 -0
  17. data/spec/fixtures/downloads.yaml +0 -91
  18. data/spec/fixtures/fire_web_hook +0 -1
  19. data/spec/fixtures/gems-0.0.8.gem +0 -0
  20. data/spec/fixtures/gems.yaml +0 -1072
  21. data/spec/fixtures/just_updated.yaml +0 -1376
  22. data/spec/fixtures/latest.yaml +0 -1098
  23. data/spec/fixtures/most_downloaded.yaml +0 -20
  24. data/spec/fixtures/most_downloaded_today.yaml +0 -1053
  25. data/spec/fixtures/owners.yaml +0 -2
  26. data/spec/fixtures/push +0 -1
  27. data/spec/fixtures/rails.yaml +0 -33
  28. data/spec/fixtures/rails_admin-0.0.0.yaml +0 -3
  29. data/spec/fixtures/remove_owner +0 -1
  30. data/spec/fixtures/remove_web_hook +0 -1
  31. data/spec/fixtures/reverse_dependencies_short.yaml +0 -70
  32. data/spec/fixtures/script_helpers.yaml +0 -17
  33. data/spec/fixtures/search.yaml +0 -898
  34. data/spec/fixtures/total_downloads.yaml +0 -2
  35. data/spec/fixtures/unyank +0 -1
  36. data/spec/fixtures/web_hooks.yaml +0 -4
  37. data/spec/fixtures/yank +0 -1
  38. data/spec/gems/client_spec.rb +0 -432
  39. data/spec/gems/request_spec.rb +0 -31
  40. data/spec/gems_spec.rb +0 -73
  41. data/spec/helper.rb +0 -64
  42. metadata.gz.sig +0 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 27bd2da368ca93d2b8ac32fd25465987368be2b0
4
+ data.tar.gz: c53afd6178dfab27ca122e9b144b441e71f69a47
5
+ SHA512:
6
+ metadata.gz: 2bd0758a749c07093478dea04fe356f39e4be8158892b9a97f7b4e7bdd965cfd4b4cd28bdc422d5a2471acb88663cdc56883286f541032e9c639cbe6e15d65d9
7
+ data.tar.gz: 8a60367eec5ed9cd320909e8cc706091b0e4aaed76f19b9f95f9673f9b2d4fa2161638af876390bbb0d2bbf4c91ddb10c5b3537d1d93608130a00ab0ec761cf5
@@ -28,12 +28,12 @@ Ideally, a bug report should include a pull request with failing specs.
28
28
  3. Add specs for your unimplemented feature or bug fix.
29
29
  4. Run `bundle exec rake spec`. If your specs pass, return to step 3.
30
30
  5. Implement your feature or bug fix.
31
- 6. Run `bundle exec rake spec`. If your specs fail, return to step 5.
31
+ 6. Run `bundle exec rake`. If your specs fail, return to step 5.
32
32
  7. Run `open coverage/index.html`. If your changes are not completely covered
33
33
  by your tests, return to step 3.
34
34
  8. Add documentation for your feature or bug fix.
35
- 9. Run `bundle exec rake yard`. If your changes are not 100% documented, go
36
- back to step 8.
35
+ 9. Run `bundle exec rake verify_measurements`. If your changes are not 100%
36
+ documented, go back to step 8.
37
37
  10. Add, commit, and push your changes.
38
38
  11. [Submit a pull request.][pr]
39
39
 
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Gems
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/gems.png)][gem]
4
- [![Build Status](https://secure.travis-ci.org/rubygems/gems.png?branch=master)][travis]
5
- [![Dependency Status](https://gemnasium.com/rubygems/gems.png?travis)][gemnasium]
6
- [![Code Climate](https://codeclimate.com/github/rubygems/gems.png)][codeclimate]
7
- [![Coverage Status](https://coveralls.io/repos/rubygems/gems/badge.png?branch=master)][coveralls]
3
+ [![Gem Version](http://img.shields.io/gem/v/gems.svg)][gem]
4
+ [![Build Status](http://img.shields.io/travis/rubygems/gems.svg)][travis]
5
+ [![Dependency Status](http://img.shields.io/gemnasium/rubygems/gems.svg)][gemnasium]
6
+ [![Code Climate](http://img.shields.io/codeclimate/github/rubygems/gems.svg)][codeclimate]
7
+ [![Coverage Status](http://img.shields.io/coveralls/rubygems/gems.svg)][coveralls]
8
8
 
9
9
  [gem]: https://rubygems.org/gems/gems
10
10
  [travis]: http://travis-ci.org/rubygems/gems
@@ -17,16 +17,6 @@ Ruby wrapper for the RubyGems.org API.
17
17
  ## Installation
18
18
  gem install gems
19
19
 
20
- To ensure the code you're installing hasn't been tampered with, it's
21
- recommended that you verify the signature. To do this, you need to add my
22
- public key as a trusted certificate (you only need to do this once):
23
-
24
- gem cert --add <(curl -Ls https://raw.github.com/rubygems/gems/master/certs/sferik.pem)
25
-
26
- Then, install the gem with the high security trust policy:
27
-
28
- gem install gems -P HighSecurity
29
-
30
20
  ## Documentation
31
21
  [http://rdoc.info/gems/gems](http://rdoc.info/gems/gems)
32
22
 
@@ -119,25 +109,23 @@ Then, install the gem with the high security trust policy:
119
109
  Gems.dependencies ['rails', 'thor']
120
110
 
121
111
  # The following methods require authentication.
122
- # By default, we load your API key from ~/.gem/credentails
112
+ # By default, we load your API key from ~/.gem/credentials
123
113
  # You can override this default by specifying a custom API key.
124
114
  Gems.configure do |config|
125
- config.key '701243f217cdf23b1370c7b66b65ca97'
115
+ config.key = '701243f217cdf23b1370c7b66b65ca97'
126
116
  end
127
117
 
128
118
  ## Supported Ruby Versions
129
119
  This library aims to support and is [tested against][travis] the following Ruby
130
120
  implementations:
131
121
 
132
- * Ruby 1.8.7
133
- * Ruby 1.9.2
134
- * Ruby 1.9.3
135
- * Ruby 2.0.0
122
+ * Ruby 2.1
123
+ * Ruby 2.2
124
+ * Ruby 2.3
125
+ * Ruby 2.4
136
126
  * [JRuby][]
137
- * [Rubinius][]
138
127
 
139
128
  [jruby]: http://www.jruby.org/
140
- [rubinius]: http://rubini.us/
141
129
 
142
130
  If something doesn't work on one of these interpreters, it's a bug.
143
131
 
@@ -4,21 +4,17 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'gems/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
+ spec.add_dependency 'json'
7
8
  spec.add_development_dependency 'bundler', '~> 1.0'
8
- spec.authors = ["Erik Michaels-Ober"]
9
- spec.cert_chain = ['certs/sferik.pem']
10
- spec.description = %q{Ruby wrapper for the RubyGems.org API}
11
- spec.email = ['sferik@gmail.com']
12
- spec.files = `git ls-files`.split("\n")
13
- spec.files = %w(.yardopts CONTRIBUTING.md LICENSE.md README.md Rakefile gems.gemspec)
14
- spec.files += Dir.glob("lib/**/*.rb")
15
- spec.files += Dir.glob("spec/**/*")
16
- spec.homepage = 'https://github.com/rubygems/gems'
17
- spec.licenses = ['MIT']
18
- spec.name = 'gems'
19
- spec.require_paths = ['lib']
20
- spec.signing_key = File.expand_path("~/.gem/private_key.pem") if $0 =~ /gem\z/
21
- spec.summary = spec.description
22
- spec.test_files = Dir.glob("spec/**/*")
23
- spec.version = Gems::VERSION
9
+ spec.authors = ['Erik Michaels-Ober']
10
+ spec.description = 'Ruby wrapper for the RubyGems.org API'
11
+ spec.email = ['sferik@gmail.com']
12
+ spec.files = %w(.yardopts CONTRIBUTING.md LICENSE.md README.md gems.gemspec) + Dir['lib/**/*.rb']
13
+ spec.homepage = 'https://github.com/rubygems/gems'
14
+ spec.licenses = %w(MIT)
15
+ spec.name = 'gems'
16
+ spec.require_paths = %w(lib)
17
+ spec.required_ruby_version = '>= 2.1.9'
18
+ spec.summary = spec.description
19
+ spec.version = Gems::VERSION
24
20
  end
@@ -7,7 +7,7 @@ module Gems
7
7
  # Alias for Gems::Client.new
8
8
  #
9
9
  # @return [Gems::Client]
10
- def new(options={})
10
+ def new(options = {})
11
11
  Gems::Client.new(options)
12
12
  end
13
13
 
@@ -17,8 +17,12 @@ module Gems
17
17
  new.send(method, *args, &block)
18
18
  end
19
19
 
20
- def respond_to?(method, include_private=false)
21
- new.respond_to?(method, include_private) || super(method, include_private)
20
+ def respond_to?(method_name, include_private = false)
21
+ new.respond_to?(method_name, include_private) || super(method_name, include_private)
22
+ end
23
+
24
+ def respond_to_missing?(method_name, include_private = false)
25
+ new.respond_to?(method_name, include_private) || super(method_name, include_private)
22
26
  end
23
27
  end
24
28
  end
@@ -1,14 +1,14 @@
1
1
  require 'date'
2
2
  require 'gems/configuration'
3
3
  require 'gems/request'
4
- require 'yaml'
4
+ require 'json'
5
5
 
6
6
  module Gems
7
7
  class Client
8
8
  include Gems::Request
9
- attr_accessor *Configuration::VALID_OPTIONS_KEYS
9
+ attr_accessor(*Configuration::VALID_OPTIONS_KEYS)
10
10
 
11
- def initialize(options={})
11
+ def initialize(options = {})
12
12
  options = Gems.options.merge(options)
13
13
  Configuration::VALID_OPTIONS_KEYS.each do |key|
14
14
  send("#{key}=", options[key])
@@ -23,8 +23,8 @@ module Gems
23
23
  # @example
24
24
  # Gems.info 'rails'
25
25
  def info(gem_name)
26
- response = get("/api/v1/gems/#{gem_name}.yaml")
27
- YAML.load(response)
26
+ response = get("/api/v1/gems/#{gem_name}.json")
27
+ JSON.parse(response)
28
28
  end
29
29
 
30
30
  # Returns an array of active gems that match the query
@@ -35,8 +35,8 @@ module Gems
35
35
  # @example
36
36
  # Gems.search 'cucumber'
37
37
  def search(query)
38
- response = get("/api/v1/search.yaml", {:query => query})
39
- YAML.load(response)
38
+ response = get('/api/v1/search.json', :query => query)
39
+ JSON.parse(response)
40
40
  end
41
41
 
42
42
  # List all gems that you own
@@ -46,13 +46,9 @@ module Gems
46
46
  # @return [Array]
47
47
  # @example
48
48
  # Gems.gems
49
- def gems(user_handle=nil)
50
- response = if user_handle
51
- get("/api/v1/owners/#{user_handle}/gems.yaml")
52
- else
53
- get("/api/v1/gems.yaml")
54
- end
55
- YAML.load(response)
49
+ def gems(user_handle = nil)
50
+ response = user_handle ? get("/api/v1/owners/#{user_handle}/gems.json") : get('/api/v1/gems.json')
51
+ JSON.parse(response)
56
52
  end
57
53
 
58
54
  # Submit a gem to RubyGems.org or another host
@@ -63,8 +59,8 @@ module Gems
63
59
  # @return [String]
64
60
  # @example
65
61
  # Gems.push File.new 'pkg/gemcutter-0.2.1.gem'
66
- def push(gem, host=Configuration::DEFAULT_HOST)
67
- post("/api/v1/gems", gem.read, 'application/octet-stream', host)
62
+ def push(gem, host = Configuration::DEFAULT_HOST)
63
+ post('/api/v1/gems', gem.read, 'application/octet-stream', host)
68
64
  end
69
65
 
70
66
  # Remove a gem from RubyGems.org's index
@@ -77,9 +73,9 @@ module Gems
77
73
  # @return [String]
78
74
  # @example
79
75
  # Gems.yank "gemcutter", "0.2.1", {:platform => "x86-darwin-10"}
80
- def yank(gem_name, gem_version=nil, options={})
76
+ def yank(gem_name, gem_version = nil, options = {})
81
77
  gem_version ||= info(gem_name)['version']
82
- delete("/api/v1/gems/yank", options.merge(:gem_name => gem_name, :version => gem_version))
78
+ delete('/api/v1/gems/yank', options.merge(:gem_name => gem_name, :version => gem_version))
83
79
  end
84
80
 
85
81
  # Update a previously yanked gem back into RubyGems.org's index
@@ -92,9 +88,9 @@ module Gems
92
88
  # @return [String]
93
89
  # @example
94
90
  # Gems.unyank "gemcutter", "0.2.1", {:platform => "x86-darwin-10"}
95
- def unyank(gem_name, gem_version=nil, options={})
91
+ def unyank(gem_name, gem_version = nil, options = {})
96
92
  gem_version ||= info(gem_name)['version']
97
- put("/api/v1/gems/unyank", options.merge(:gem_name => gem_name, :version => gem_version))
93
+ put('/api/v1/gems/unyank', options.merge(:gem_name => gem_name, :version => gem_version))
98
94
  end
99
95
 
100
96
  # Returns an array of gem version details
@@ -105,8 +101,8 @@ module Gems
105
101
  # @example
106
102
  # Gems.versions 'coulda'
107
103
  def versions(gem_name)
108
- response = get("/api/v1/versions/#{gem_name}.yaml")
109
- YAML.load(response)
104
+ response = get("/api/v1/versions/#{gem_name}.json")
105
+ JSON.parse(response)
110
106
  end
111
107
 
112
108
  # Returns the total number of downloads for a particular gem
@@ -117,14 +113,9 @@ module Gems
117
113
  # @return [Hash]
118
114
  # @example
119
115
  # Gems.total_downloads 'rails_admin', '0.0.1'
120
- def total_downloads(gem_name=nil, gem_version=nil)
121
- response = if gem_name
122
- gem_version ||= info(gem_name)['version']
123
- get("/api/v1/downloads/#{gem_name}-#{gem_version}.yaml")
124
- else
125
- get("/api/v1/downloads.yaml")
126
- end
127
- YAML.load(response)
116
+ def total_downloads(gem_name = nil, gem_version = nil)
117
+ response = gem_name ? get("/api/v1/downloads/#{gem_name}-#{gem_version || info(gem_name)['version']}.json") : get('/api/v1/downloads.json')
118
+ JSON.parse(response, :symbolize_names => true)
128
119
  end
129
120
 
130
121
  # Returns an array containing the top 50 downloaded gem versions for today
@@ -134,8 +125,8 @@ module Gems
134
125
  # @example
135
126
  # Gems.most_downloaded_today
136
127
  def most_downloaded_today
137
- response = get("/api/v1/downloads/top.yaml")
138
- YAML.load(response)[:gems]
128
+ response = get('/api/v1/downloads/top.json')
129
+ JSON.parse(response)['gems']
139
130
  end
140
131
 
141
132
  # Returns an array containing the top 50 downloaded gem versions of all time
@@ -145,8 +136,8 @@ module Gems
145
136
  # @example
146
137
  # Gems.most_downloaded
147
138
  def most_downloaded
148
- response = get("/api/v1/downloads/all.yaml")
149
- YAML.load(response)[:gems]
139
+ response = get('/api/v1/downloads/all.json')
140
+ JSON.parse(response)['gems']
150
141
  end
151
142
 
152
143
  # Returns the number of downloads by day for a particular gem version
@@ -159,14 +150,10 @@ module Gems
159
150
  # @return [Hash]
160
151
  # @example
161
152
  # Gems.downloads 'coulda', '0.6.3', Date.today - 30, Date.today
162
- def downloads(gem_name, gem_version=nil, from=nil, to=Date.today)
153
+ def downloads(gem_name, gem_version = nil, from = nil, to = Date.today)
163
154
  gem_version ||= info(gem_name)['version']
164
- response = if from
165
- get("/api/v1/versions/#{gem_name}-#{gem_version}/downloads/search.yaml", {:from => from.to_s, :to => to.to_s})
166
- else
167
- get("/api/v1/versions/#{gem_name}-#{gem_version}/downloads.yaml")
168
- end
169
- YAML.load(response)
155
+ response = from ? get("/api/v1/versions/#{gem_name}-#{gem_version}/downloads/search.json", :from => from.to_s, :to => to.to_s) : get("/api/v1/versions/#{gem_name}-#{gem_version}/downloads.json")
156
+ JSON.parse(response)
170
157
  end
171
158
 
172
159
  # View all owners of a gem that you own
@@ -177,8 +164,8 @@ module Gems
177
164
  # @example
178
165
  # Gems.owners 'gemcutter'
179
166
  def owners(gem_name)
180
- response = get("/api/v1/gems/#{gem_name}/owners.yaml")
181
- YAML.load(response)
167
+ response = get("/api/v1/gems/#{gem_name}/owners.json")
168
+ JSON.parse(response)
182
169
  end
183
170
 
184
171
  # Add an owner to a RubyGem you own, giving that user permission to manage it
@@ -190,7 +177,7 @@ module Gems
190
177
  # @example
191
178
  # Gems.add_owner 'gemcutter', 'josh@technicalpickles.com'
192
179
  def add_owner(gem_name, owner)
193
- post("/api/v1/gems/#{gem_name}/owners", {:email => owner})
180
+ post("/api/v1/gems/#{gem_name}/owners", :email => owner)
194
181
  end
195
182
 
196
183
  # Remove a user's permission to manage a RubyGem you own
@@ -202,7 +189,7 @@ module Gems
202
189
  # @example
203
190
  # Gems.remove_owner 'gemcutter', 'josh@technicalpickles.com'
204
191
  def remove_owner(gem_name, owner)
205
- delete("/api/v1/gems/#{gem_name}/owners", {:email => owner})
192
+ delete("/api/v1/gems/#{gem_name}/owners", :email => owner)
206
193
  end
207
194
 
208
195
  # List the webhooks registered under your account
@@ -212,8 +199,8 @@ module Gems
212
199
  # @example
213
200
  # Gems.web_hooks
214
201
  def web_hooks
215
- response = get("/api/v1/web_hooks.yaml")
216
- YAML.load(response)
202
+ response = get('/api/v1/web_hooks.json')
203
+ JSON.parse(response)
217
204
  end
218
205
 
219
206
  # Create a webhook
@@ -225,7 +212,7 @@ module Gems
225
212
  # @example
226
213
  # Gems.add_web_hook 'rails', 'http://example.com'
227
214
  def add_web_hook(gem_name, url)
228
- post("/api/v1/web_hooks", {:gem_name => gem_name, :url => url})
215
+ post('/api/v1/web_hooks', :gem_name => gem_name, :url => url)
229
216
  end
230
217
 
231
218
  # Remove a webhook
@@ -237,7 +224,7 @@ module Gems
237
224
  # @example
238
225
  # Gems.remove_web_hook 'rails', 'http://example.com'
239
226
  def remove_web_hook(gem_name, url)
240
- delete("/api/v1/web_hooks/remove", {:gem_name => gem_name, :url => url})
227
+ delete('/api/v1/web_hooks/remove', :gem_name => gem_name, :url => url)
241
228
  end
242
229
 
243
230
  # Test fire a webhook
@@ -249,7 +236,7 @@ module Gems
249
236
  # @example
250
237
  # Gems.fire_web_hook 'rails', 'http://example.com'
251
238
  def fire_web_hook(gem_name, url)
252
- post("/api/v1/web_hooks/fire", {:gem_name => gem_name, :url => url})
239
+ post('/api/v1/web_hooks/fire', :gem_name => gem_name, :url => url)
253
240
  end
254
241
 
255
242
  # Returns the 50 gems most recently added to RubyGems.org (for the first time)
@@ -259,9 +246,9 @@ module Gems
259
246
  # @return [Array]
260
247
  # @example
261
248
  # Gem.latest
262
- def latest(options={})
263
- response = get("/api/v1/activity/latest.yaml", options)
264
- YAML.load(response)
249
+ def latest(options = {})
250
+ response = get('/api/v1/activity/latest.json', options)
251
+ JSON.parse(response)
265
252
  end
266
253
 
267
254
  # Returns the 50 most recently updated gems
@@ -271,9 +258,9 @@ module Gems
271
258
  # @return [Array]
272
259
  # @example
273
260
  # Gem.just_updated
274
- def just_updated(options={})
275
- response = get("/api/v1/activity/just_updated.yaml", options)
276
- YAML.load(response)
261
+ def just_updated(options = {})
262
+ response = get('/api/v1/activity/just_updated.json', options)
263
+ JSON.parse(response)
277
264
  end
278
265
 
279
266
  # Retrieve your API key using HTTP basic auth
@@ -298,7 +285,7 @@ module Gems
298
285
  # @example
299
286
  # Gems.dependencies 'rails', 'thor'
300
287
  def dependencies(*gems)
301
- response = get('/api/v1/dependencies', {:gems => gems.join(',')})
288
+ response = get('/api/v1/dependencies', :gems => gems.join(','))
302
289
  Marshal.load(response)
303
290
  end
304
291
 
@@ -310,9 +297,9 @@ module Gems
310
297
  # @return [Array]
311
298
  # @example
312
299
  # Gems.reverse_dependencies 'money'
313
- def reverse_dependencies(gem_name, options={})
314
- response = get("/api/v1/gems/#{gem_name}/reverse_dependencies.yaml", options)
315
- YAML.load(response)
300
+ def reverse_dependencies(gem_name, options = {})
301
+ response = get("/api/v1/gems/#{gem_name}/reverse_dependencies.json", options)
302
+ JSON.parse(response)
316
303
  end
317
304
  end
318
305
  end
@@ -11,18 +11,18 @@ module Gems
11
11
  :password,
12
12
  :user_agent,
13
13
  :username,
14
- ]
14
+ ].freeze
15
15
 
16
16
  # Set the default API endpoint
17
- DEFAULT_HOST = ENV['RUBYGEMS_HOST'] ? ENV['RUBYGEMS_HOST'] : "https://rubygems.org"
17
+ DEFAULT_HOST = ENV['RUBYGEMS_HOST'] ? ENV['RUBYGEMS_HOST'] : 'https://rubygems.org'
18
18
 
19
19
  # Set the default credentials
20
20
  DEFAULT_KEY = Gem.configuration.rubygems_api_key
21
21
 
22
22
  # Set the default 'User-Agent' HTTP header
23
- DEFAULT_USER_AGENT = "Gems #{Gems::VERSION}"
23
+ DEFAULT_USER_AGENT = "Gems #{Gems::VERSION}".freeze
24
24
 
25
- attr_accessor *VALID_OPTIONS_KEYS
25
+ attr_accessor(*VALID_OPTIONS_KEYS)
26
26
 
27
27
  # When this module is extended, set all configuration options to their default values
28
28
  def self.extended(base)
@@ -37,17 +37,17 @@ module Gems
37
37
  # Create a hash of options and their values
38
38
  def options
39
39
  options = {}
40
- VALID_OPTIONS_KEYS.each{|k| options[k] = send(k)}
40
+ VALID_OPTIONS_KEYS.each { |k| options[k] = send(k) }
41
41
  options
42
42
  end
43
43
 
44
44
  # Reset all configuration options to defaults
45
45
  def reset
46
+ self.username = nil
47
+ self.password = nil
46
48
  self.host = DEFAULT_HOST
47
49
  self.key = DEFAULT_KEY
48
- self.password = nil
49
50
  self.user_agent = DEFAULT_USER_AGENT
50
- self.username = nil
51
51
  self
52
52
  end
53
53
  end