lsst-git-lfs-s3 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5161e54903d6e7da6c0f0c8475932d8bcc31c4f8
4
- data.tar.gz: 2624d100c5546788369dc4af299f1c0acead497f
3
+ metadata.gz: 71878bf6966f50b7f5f3000dd16f4c309f885ff6
4
+ data.tar.gz: 4b73e19c8cbccc032efa5f8b845fd0eb733345c2
5
5
  SHA512:
6
- metadata.gz: e55c51b0549723e4d3e0954ada1ff5797d8ef2faae88b96d7e9419c65b419cd4c509617a5faf411b3c5e32d11de0ed0493dd56a2b102d66bd6987500fc8a68c7
7
- data.tar.gz: a0f6567ca9203e337d5f1122ee8eef1be1f333936a7c39979527f2a355b9ad797f249f58993ac6206b56d15be3a60d7e5d3f38a34600371031b85d506225980b
6
+ metadata.gz: 83b172cb17cc167133baa0dd04169c8266a294026b45faa49aeb46fa3c9839f0d9518f6635e20a727f7d09478571adef8175a174b4c4a6c59e7cb29c3816c1b8
7
+ data.tar.gz: a2293c788540582f2a2015b4b93e3eed7656659174b91fe45085ecf6e7dbb8f5f991db824fe08b800a678ed3fae65007b93f84d5d2e676c1c79e38dbac82a56a
data/.rubocop.yml ADDED
@@ -0,0 +1,44 @@
1
+ AllCops:
2
+ TargetRubyVersion: '2.4'
3
+
4
+ Metrics/BlockLength:
5
+ Enabled: false
6
+
7
+ Style/TrailingCommaInArguments:
8
+ Enabled: false
9
+
10
+ Style/BracesAroundHashParameters:
11
+ Enabled: false
12
+
13
+ # trailing commas after last item in array/hash
14
+ Style/TrailingCommaInArrayLiteral:
15
+ Enabled: false
16
+ Style/TrailingCommaInHashLiteral:
17
+ Enabled: false
18
+
19
+ # no, I really don't want to put //'s around %r{}s
20
+ Style/RegexpLiteral:
21
+ Enabled: false
22
+
23
+ Metrics/MethodLength:
24
+ Enabled: false
25
+
26
+ Style/Documentation:
27
+ Enabled: false
28
+
29
+ Metrics/AbcSize:
30
+ Enabled: false
31
+
32
+ Style/DateTime:
33
+ Enabled: false
34
+
35
+ Metrics/ClassLength:
36
+ Enabled: false
37
+
38
+ Naming/FileName:
39
+ Enabled: false
40
+
41
+ Lint/HandleExceptions:
42
+ Enabled: false
43
+ Lint/RescueException:
44
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ ---
2
+ language: ruby
3
+ script: bundle install && bundle exec rubocop
4
+ notifications:
5
+ email: false
data/Gemfile CHANGED
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
  gemspec
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # LSST's Git LFS S3
2
2
 
3
+ [![Build Status](https://travis-ci.org/lsst-sqre/git-lfs-s3.svg?branch=master)](https://travis-ci.org/lsst-sqre/git-lfs-s3)
4
+
5
+
3
6
  A [Git LFS](https://git-lfs.github.com/) server that stores your large Git files on S3.
4
7
 
5
8
  It works by generating a presigned URL that the Git LFS client can use to upload directly to S3. It also provides download URLs that allow Git clients to download directly from S3. No data is proxied through the Git LFS server.
data/Rakefile CHANGED
@@ -1 +1,3 @@
1
- require "bundler/gem_tasks"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
data/bin/git-lfs-s3 CHANGED
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "rubygems"
4
- require "logger"
5
- require "git-lfs-s3"
4
+ require 'rubygems'
5
+ require 'logger'
6
+ require 'git-lfs-s3'
6
7
 
7
8
  GitLfsS3::Application.set :aws_region, ENV['AWS_REGION']
8
9
  GitLfsS3::Application.set :aws_access_key_id, ENV['AWS_ACCESS_KEY_ID']
@@ -21,7 +22,8 @@ if GitLfsS3::Application.settings.ceph_s3
21
22
  secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
22
23
  force_path_style: true,
23
24
  region: 'us-east-1',
24
- # ssl_ca_bundle: '/usr/local/etc/openssl/cert.pem' # Required for brew install on a mac.
25
+ # ssl_ca_bundle: '/usr/local/etc/openssl/cert.pem' # Required for brew
26
+ # install on a mac.
25
27
  )
26
28
  end
27
29
 
data/git-lfs-s3.gemspec CHANGED
@@ -1,26 +1,29 @@
1
- # -*- encoding: utf-8 -*-
2
- lib = File.expand_path('../lib', __FILE__)
1
+
2
+ # frozen_string_literal: true
3
+
4
+ lib = File.expand_path('lib', __dir__)
3
5
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
6
  require 'git-lfs-s3/version'
5
7
 
6
8
  Gem::Specification.new do |gem|
7
- gem.name = "lsst-git-lfs-s3"
9
+ gem.name = 'lsst-git-lfs-s3'
8
10
  gem.version = GitLfsS3::VERSION
9
- gem.authors = ["Ryan LeFevre", "J. Matt Peterson"]
10
- gem.email = ["meltingice8917@gmail.com", "jmatt@lsst.org"]
11
- gem.description = %q{LSST's Git LFS server that uses S3 for the storage backend.}
12
- gem.summary = %q{LSST's Git LFS server that uses S3 for the storage backend by providing presigned S3 URLs.}
13
- gem.homepage = "https://github.com/lsst-sqre/git-lfs-s3"
11
+ gem.authors = ['Ryan LeFevre', 'J. Matt Peterson']
12
+ gem.email = ['meltingice8917@gmail.com', 'jmatt@lsst.org']
13
+ gem.description = "LSST's Git LFS server"
14
+ gem.summary = "LSST's Git LFS server"
15
+ gem.homepage = 'https://github.com/lsst-sqre/git-lfs-s3'
14
16
  gem.license = 'MIT'
15
17
 
16
- gem.files = `git ls-files`.split($/)
17
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
+ gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
19
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
18
20
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
- gem.require_paths = ["lib"]
21
+ gem.require_paths = ['lib']
20
22
 
21
23
  gem.add_dependency 'aws-sdk', '~> 2'
22
- gem.add_dependency 'sinatra', '~> 2'
23
24
  gem.add_dependency 'multi_json', '~> 1'
25
+ gem.add_dependency 'sinatra', '~> 2'
24
26
 
25
27
  gem.add_development_dependency 'rake', '~> 10'
28
+ gem.add_development_dependency 'rubocop', '~> 0.53.0'
26
29
  end
data/lib/git-lfs-s3.rb CHANGED
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sinatra/base'
2
4
  require 'aws-sdk'
3
5
  require 'multi_json'
4
6
 
5
- require "git-lfs-s3/aws"
6
- require "git-lfs-s3/services/upload"
7
- require "git-lfs-s3/application"
7
+ require 'git-lfs-s3/aws'
8
+ require 'git-lfs-s3/services/upload'
9
+ require 'git-lfs-s3/application'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'date'
2
4
 
3
5
  module GitLfsS3
@@ -32,34 +34,35 @@ module GitLfsS3
32
34
  end
33
35
 
34
36
  def authorized?
35
- @auth ||= Rack::Auth::Basic::Request.new(request.env)
36
- @auth.provided? && @auth.basic? && @auth.credentials && self.class.auth_callback.call(
37
- @auth.credentials[0], @auth.credentials[1], request.safe?
38
- )
37
+ @auth ||= Rack::Auth::Basic::Request.new(request.env)
38
+ @auth.provided? &&
39
+ @auth.basic? &&
40
+ @auth.credentials &&
41
+ self.class.auth_callback.call(
42
+ @auth.credentials[0], @auth.credentials[1], request.safe?
43
+ )
39
44
  end
40
45
 
41
46
  def protected!
42
- unless authorized?
43
- response['WWW-Authenticate'] = %(Basic realm="Restricted Area")
44
- throw(:halt, [401, "Invalid username or password"])
45
- end
47
+ return unless authorized?
48
+ response['WWW-Authenticate'] = %(Basic realm="Restricted Area")
49
+ throw(:halt, [401, 'Invalid username or password'])
46
50
  end
47
51
 
48
52
  get '/' do
49
- "Git LFS S3 is online."
53
+ 'Git LFS S3 is online.'
50
54
  end
51
55
 
52
56
  def valid_obj?(obj)
53
57
  # Validate that size >= 0 and oid is a SHA256 hash.
54
- begin
55
- if obj[:size] >= 0
56
- oid = obj[:oid]
57
- valid = (oid.hex.size <= 32) and (oid.size == 64) and (oid =~ /^[0-9a-f]+$/)
58
- end
59
- end
58
+ oid = obj[:oid]
59
+ return unless obj[:size] >= 0
60
+ (oid.hex.size <= 32) && (oid.size == 64) && (oid =~ /^[0-9a-f]+$/)
61
+ # XXX what exception needs to be ignored here?
62
+ rescue Exception
60
63
  end
61
64
 
62
- def expire_at()
65
+ def expire_at
63
66
  DateTime.now.next_day.to_time.utc.iso8601
64
67
  end
65
68
 
@@ -72,9 +75,9 @@ module GitLfsS3
72
75
  'size' => size,
73
76
  'authenticated' => authenticated,
74
77
  'actions' => {
75
- 'download' => {
78
+ 'download' => {
76
79
  'href' => obj.presigned_url(:get,
77
- :expires_in => 86400),
80
+ expires_in: 86_400),
78
81
  'expires_at' => expire_at,
79
82
  },
80
83
  },
@@ -90,10 +93,10 @@ module GitLfsS3
90
93
  'size' => size,
91
94
  'authenticated' => authenticated,
92
95
  'actions' => {
93
- 'upload' => {
96
+ 'upload' => {
94
97
  'href' => obj.presigned_url(:put,
95
98
  acl: 'public-read',
96
- :expires_in => 86400),
99
+ expires_in: 86_400),
97
100
  'expires_at' => expire_at,
98
101
  },
99
102
  },
@@ -116,7 +119,7 @@ module GitLfsS3
116
119
  # Handle git-lfs batch downloads.
117
120
  objects = []
118
121
  params[:objects].each do |obj_json|
119
- obj_json = indifferent_params(obj_json)
122
+ obj_json = IndifferentHash(obj_json)
120
123
  obj = object_data(obj_json[:oid])
121
124
  if valid_obj?(obj_json)
122
125
  if obj.exists?
@@ -135,7 +138,7 @@ module GitLfsS3
135
138
  # Handle git-lfs batch uploads.
136
139
  objects = []
137
140
  params[:objects].each do |obj_json|
138
- obj_json = indifferent_params(obj_json)
141
+ obj_json = IndifferentHash(obj_json)
139
142
  obj = object_data(obj_json[:oid])
140
143
  if valid_obj?(obj_json)
141
144
  if obj.exists?
@@ -148,7 +151,7 @@ module GitLfsS3
148
151
  end
149
152
  end
150
153
  objects
151
- end
154
+ end
152
155
 
153
156
  def lfs_resp(objects)
154
157
  # Successful git-lfs batch response.
@@ -159,21 +162,21 @@ module GitLfsS3
159
162
  }
160
163
  body MultiJson.dump(resp)
161
164
  end
162
-
165
+
163
166
  def error_resp(status_code, message)
164
167
  # Error git-lfs batch response.
165
168
  status(status_code)
166
169
  resp = {
167
170
  'message' => message,
168
- 'request_id' => SecureRandom::uuid
171
+ 'request_id' => SecureRandom.uuid
169
172
  }
170
173
  body MultiJson.dump(resp)
171
174
  end
172
-
175
+
173
176
  post '/objects/batch', provides: 'application/vnd.git-lfs+json' do
174
177
  # git-lfs batch API
175
178
  authenticated = authorized?
176
- params = indifferent_params(JSON.parse(request.body.read))
179
+ params = IndifferentHash(JSON.parse(request.body.read))
177
180
  logger.debug params
178
181
  if params[:operation] == 'download'
179
182
  if settings.public_server
@@ -196,7 +199,7 @@ module GitLfsS3
196
199
  end
197
200
  end
198
201
 
199
- get "/objects/:oid", provides: 'application/vnd.git-lfs+json' do
202
+ get '/objects/:oid', provides: 'application/vnd.git-lfs+json' do
200
203
  if settings.public_server
201
204
  object = object_data(params[:oid])
202
205
  if object.exists?
@@ -206,7 +209,9 @@ module GitLfsS3
206
209
  'size' => object.size,
207
210
  '_links' => {
208
211
  'self' => {
209
- 'href' => File.join(settings.server_url, 'objects', params[:oid])
212
+ 'href' => File.join(
213
+ settings.server_url, 'objects', params[:oid]
214
+ )
210
215
  },
211
216
  'download' => {
212
217
  'href' => object_data(params[:oid]).presigned_url(:get)
@@ -216,53 +221,50 @@ module GitLfsS3
216
221
  body MultiJson.dump(resp)
217
222
  else
218
223
  status 404
219
- body MultiJson.dump({message: 'Object not found'})
224
+ body MultiJson.dump({ message: 'Object not found' })
220
225
  end
221
226
  else
222
227
  status 401
223
- body MultiJson.dump({message: 'Invalid username or password'})
228
+ body MultiJson.dump({ message: 'Invalid username or password' })
224
229
  end
225
230
  end
226
231
 
227
232
  def public_read_grant
228
233
  grantee = Aws::S3::Types::Grantee.new(
229
234
  display_name: nil, email_address: nil, id: nil, type: nil,
230
- uri: "http://acs.amazonaws.com/groups/global/AllUsers")
231
- Aws::S3::Types::Grant.new(grantee: grantee, permission: "READ")
235
+ uri: 'http://acs.amazonaws.com/groups/global/AllUsers'
236
+ )
237
+ Aws::S3::Types::Grant.new(grantee: grantee, permission: 'READ')
232
238
  end
233
239
 
234
- post "/objects", provides: 'application/vnd.git-lfs+json' do
240
+ post '/objects', provides: 'application/vnd.git-lfs+json' do
235
241
  if authorized?
236
242
  logger.debug headers.inspect
237
243
  service = UploadService.service_for(request.body)
238
244
  logger.debug service.response
239
-
245
+
240
246
  status service.status
241
247
  body MultiJson.dump(service.response)
242
248
  else
243
249
  status 401
244
- body MultiJson.dump({message: 'Invalid username or password'})
250
+ body MultiJson.dump({ message: 'Invalid username or password' })
245
251
  end
246
252
  end
247
253
 
248
254
  post '/verify', provides: 'application/vnd.git-lfs+json' do
249
255
  if authorized?
250
- data = MultiJson.load(request.body.tap { |b| b.rewind }.read)
256
+ data = MultiJson.load(request.body.tap(&:rewind).read)
251
257
  object = object_data(data['oid'])
252
- if not object.exists?
253
- status 404
254
- end
255
- if settings.public_server and settings.ceph_s3
256
- if not object.acl.grants.include?(public_read_grant)
257
- object.acl.put(acl: "public-read")
258
+ status 404 unless object.exists?
259
+ if settings.public_server && settings.ceph_s3
260
+ unless object.acl.grants.include?(public_read_grant)
261
+ object.acl.put(acl: 'public-read')
258
262
  end
259
263
  end
260
- if object.size == data['size']
261
- status 200
262
- end
264
+ status 200 if object.size == data['size']
263
265
  else
264
266
  status 401
265
- body MultiJson.dump({message: 'Invalid username or password'})
267
+ body MultiJson.dump({ message: 'Invalid username or password' })
266
268
  end
267
269
  end
268
270
  end
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GitLfsS3
2
4
  module AwsHelpers
3
5
  def s3
4
6
  @s3 ||= Aws::S3::Client.new({
5
- region: aws_region,
6
- access_key_id: aws_access_key_id,
7
- secret_access_key: aws_secret_access_key
8
- })
7
+ region: aws_region,
8
+ access_key_id: aws_access_key_id,
9
+ secret_access_key: aws_secret_access_key
10
+ })
9
11
  end
10
12
 
11
13
  def bucket_name
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'base64'
2
4
  require 'date'
3
5
  require 'digest/sha1'
@@ -6,19 +8,26 @@ require 'uri'
6
8
 
7
9
  module GitLfsS3
8
10
  module CephPresignerService
9
- extend self
11
+ module_function
12
+
10
13
  extend AwsHelpers
11
-
14
+
12
15
  def signed_url(obj)
13
- expire_at = (DateTime.now + 1).strftime("%s")
16
+ expire_at = (DateTime.now + 1).strftime('%s')
14
17
  secret_access_key = GitLfsS3::Application.settings.aws_secret_access_key
15
18
  access_key_id = GitLfsS3::Application.settings.aws_access_key_id
16
19
  endpoint = GitLfsS3::Application.settings.endpoint
17
20
  digest = OpenSSL::Digest.new('sha1')
18
- can_string = "PUT\n\napplication/octet-stream\n#{expire_at}\n/#{obj.bucket_name}/#{obj.key}"
21
+ can_string = "PUT\n\napplication/octet-stream\n" \
22
+ "#{expire_at}\n/#{obj.bucket_name}/#{obj.key}"
19
23
  hmac = OpenSSL::HMAC.digest(digest, secret_access_key, can_string)
20
- signature = URI.escape(Base64.encode64(hmac).strip, /[\+=?@$&,\/:;\?]/)
21
- "#{endpoint}/#{obj.bucket_name}/#{obj.key}?Signature=#{signature}&AWSAccessKeyId=#{access_key_id}&Expires=#{expire_at}"
24
+ signature = URI.encode_www_form(
25
+ Base64.encode64(hmac).strip, /[\+=?@$&,\/:;\?]/
26
+ )
27
+ "#{endpoint}/#{obj.bucket_name}/#{obj.key}?" \
28
+ "Signature=#{signature}" \
29
+ "&AWSAccessKeyId=#{access_key_id}" \
30
+ "&Expires=#{expire_at}"
22
31
  end
23
32
  end
24
33
  end
@@ -1,19 +1,22 @@
1
- require "git-lfs-s3/services/upload/base"
2
- require "git-lfs-s3/services/upload/object_exists"
3
- require "git-lfs-s3/services/upload/upload_required"
1
+ # frozen_string_literal: true
2
+
3
+ require 'git-lfs-s3/services/upload/base'
4
+ require 'git-lfs-s3/services/upload/object_exists'
5
+ require 'git-lfs-s3/services/upload/upload_required'
4
6
 
5
7
  module GitLfsS3
6
8
  module UploadService
7
- extend self
9
+ module_function
10
+
8
11
  extend AwsHelpers
9
12
 
10
13
  MODULES = [
11
14
  ObjectExists,
12
15
  UploadRequired
13
- ]
16
+ ].freeze
14
17
 
15
18
  def service_for(data)
16
- req = MultiJson.load data.tap { |d| d.rewind }.read
19
+ req = MultiJson.load data.tap(&:rewind).read
17
20
  object = object_data(req['oid'])
18
21
 
19
22
  MODULES.each do |mod|
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GitLfsS3
2
4
  module UploadService
3
5
  class Base
4
6
  include AwsHelpers
5
-
7
+
6
8
  attr_reader :req, :object
7
9
 
8
10
  def initialize(req, object)
@@ -11,11 +13,11 @@ module GitLfsS3
11
13
  end
12
14
 
13
15
  def response
14
- raise "Override"
16
+ raise 'Override'
15
17
  end
16
18
 
17
19
  def status
18
- raise "Override"
20
+ raise 'Override'
19
21
  end
20
22
 
21
23
  private
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GitLfsS3
2
4
  module UploadService
3
5
  class ObjectExists < Base
@@ -9,7 +11,7 @@ module GitLfsS3
9
11
  {
10
12
  '_links' => {
11
13
  'download' => {
12
- 'href' => object.presigned_url(:get, :expires_in => 86400)
14
+ 'href' => object.presigned_url(:get, expires_in: 86_400)
13
15
  }
14
16
  }
15
17
  }
@@ -1,4 +1,6 @@
1
- require "git-lfs-s3/services/ceph_presigner"
1
+ # frozen_string_literal: true
2
+
3
+ require 'git-lfs-s3/services/ceph_presigner'
2
4
 
3
5
  module GitLfsS3
4
6
  module UploadService
@@ -29,18 +31,16 @@ module GitLfsS3
29
31
 
30
32
  def upload_destination
31
33
  if ceph_s3
32
- GitLfsS3::CephPresignerService::signed_url(object)
34
+ GitLfsS3::CephPresignerService.signed_url(object)
35
+ elsif GitLfsS3::Application.settings.public_server
36
+ object.presigned_url(:put, acl: 'public-read', expires_in: 86_400)
33
37
  else
34
- if GitLfsS3::Application.settings.public_server
35
- object.presigned_url(:put, acl: 'public-read', :expires_in => 86400)
36
- else
37
- object.presigned_url(:put, :expires_in => 86400)
38
- end
38
+ object.presigned_url(:put, expires_in: 86_400)
39
39
  end
40
40
  end
41
41
 
42
42
  def upload_headers
43
- {'content-type' => ''}
43
+ { 'content-type' => '' }
44
44
  end
45
45
  end
46
46
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GitLfsS3
2
- VERSION = '0.3.5'
4
+ VERSION = '0.3.6'
3
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lsst-git-lfs-s3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan LeFevre
@@ -26,33 +26,33 @@ dependencies:
26
26
  - !ruby/object:Gem::Version
27
27
  version: '2'
28
28
  - !ruby/object:Gem::Dependency
29
- name: sinatra
29
+ name: multi_json
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '2'
34
+ version: '1'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '2'
41
+ version: '1'
42
42
  - !ruby/object:Gem::Dependency
43
- name: multi_json
43
+ name: sinatra
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '1'
48
+ version: '2'
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '1'
55
+ version: '2'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: rake
58
58
  requirement: !ruby/object:Gem::Requirement
@@ -67,7 +67,21 @@ dependencies:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: '10'
70
- description: LSST's Git LFS server that uses S3 for the storage backend.
70
+ - !ruby/object:Gem::Dependency
71
+ name: rubocop
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: 0.53.0
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 0.53.0
84
+ description: LSST's Git LFS server
71
85
  email:
72
86
  - meltingice8917@gmail.com
73
87
  - jmatt@lsst.org
@@ -77,6 +91,8 @@ extensions: []
77
91
  extra_rdoc_files: []
78
92
  files:
79
93
  - ".gitignore"
94
+ - ".rubocop.yml"
95
+ - ".travis.yml"
80
96
  - Gemfile
81
97
  - README.md
82
98
  - Rakefile
@@ -114,6 +130,5 @@ rubyforge_project:
114
130
  rubygems_version: 2.6.14
115
131
  signing_key:
116
132
  specification_version: 4
117
- summary: LSST's Git LFS server that uses S3 for the storage backend by providing presigned
118
- S3 URLs.
133
+ summary: LSST's Git LFS server
119
134
  test_files: []