test-gem-push 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/app.rb +94 -0
  3. metadata +57 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5a5fd55f4169a1aee52e8b2b7ad350e116990dcb
4
+ data.tar.gz: b0e5200dd408c77d62087f289af2c754642a81a5
5
+ SHA512:
6
+ metadata.gz: ad29258e10b1f7a60e69356561300be83120d3be8e59daba978fdf6317510639041ee5833156c25c7280506aad2fd3cc23490f24a168b07f8ef0ffc9f80612cd
7
+ data.tar.gz: 76fb67d582b8d3cf0155ead4798fdf822107018cf4cd0a6dbb3f1e6ff3bf2726dc7361dd8cb639514940a956a59bcc555974e48af4ae63527d4cede6e5349086
data/app.rb ADDED
@@ -0,0 +1,94 @@
1
+ require 'bundler/setup'
2
+
3
+ require 'dotenv'
4
+ require 'sinatra'
5
+ require 'json'
6
+ require 'rubygems/package'
7
+ require 'rubygems/commands/push_command'
8
+
9
+ Dotenv.load
10
+
11
+ Gem::DefaultUserInteraction.ui = Gem::ConsoleUI.new
12
+ Gem.configuration.rubygems_api_key = ENV.fetch('RUBYGEMS_API_KEY')
13
+ TOKEN = ENV.fetch('TOKEN')
14
+
15
+ def get_json(host, path)
16
+ json = Net::HTTP.get(host, path)
17
+ JSON.load(json)
18
+ rescue
19
+ raise "Failed to load JSON from #{host}/#{path}:\n#{json}"
20
+ end
21
+
22
+ def push!(name, version)
23
+ spec = Gem::Specification.new do |s|
24
+ s.name = name
25
+ s.version = version
26
+ s.authors = ['example@example.com']
27
+ s.files = [__FILE__]
28
+ s.summary = 'test'
29
+ s.required_ruby_version = '~> 2.0'
30
+ s.required_rubygems_version = '~> 2.6'
31
+ s.add_dependency 'foo', '~> 1.0'
32
+ end
33
+ file = Gem::Package.build(spec)
34
+ Gem::Commands::PushCommand.new.send_gem(file)
35
+ ensure
36
+ File.delete(file)
37
+ end
38
+
39
+ def get_dependency_api(gem_name)
40
+ get_json('bundler.rubygems.org', "/api/v1/dependencies.json?gems=#{gem_name}")
41
+ end
42
+
43
+ def get_versions
44
+ Net::HTTP.get('index.rubygems.org', '/versions')
45
+ end
46
+
47
+ def get_info(name)
48
+ Net::HTTP.get('index.rubygems.org', "/info/#{name}")
49
+ end
50
+
51
+ post '/' do
52
+ halt 401, 'token does not match' unless TOKEN == params['token']
53
+
54
+ version = params.fetch('version') { Time.now.strftime('%Y.%m.%d.%H.%M.%S') }
55
+ gem_name = ENV.fetch('GEM_NAME')
56
+
57
+ dependency_endpoint = get_dependency_api(gem_name)
58
+ versions = get_versions.lines
59
+ info = get_info(gem_name).lines
60
+
61
+ if dependency_endpoint.find { |g| g['version'] == version }
62
+ halt 422, "#{gem_name}-#{version} already was pushed"
63
+ end
64
+
65
+ begin
66
+ push!(gem_name, version)
67
+ rescue Gem::SystemExitException
68
+ halt 500, "Failed to push: #{$ERROR_INFO}"
69
+ end
70
+
71
+ new_gem = get_dependency_api(gem_name) - dependency_endpoint
72
+ case new_gem.size
73
+ when 0 then halt 404, 'gem not added to dependency API'
74
+ when 1
75
+ unless new_gem.first.values_at('name', 'number', 'platform', 'dependencies') == [gem_name, version, 'ruby', [['foo', '~> 1.0']]]
76
+ halt 404, "wrong gem added: #{new_gem}"
77
+ end
78
+ else halt 404, "too many new gems added: #{new_gem}"
79
+ end
80
+
81
+ new_versions = versions - get_versions.lines
82
+ unless new_versions.find { |l| l == "#{gem_name} #{version}" }
83
+ halt 404, 'gem not added to versions file'
84
+ end
85
+
86
+ new_info = get_info(gem_name).lines - info
87
+ case new_info.size
88
+ when 0 then halt 404, 'gem not added to dependency API'
89
+ when 1 then halt 404, "wrong gem added: #{new_info}" unless new_info =~ /^#{version} /
90
+ else halt 404, "too many new gems added: #{new_info}"
91
+ end
92
+
93
+ halt "successfully pushed #{gem_name}-#{version}"
94
+ end
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: test-gem-push
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - example@example.com
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-06-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: foo
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ description:
28
+ email:
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - app.rb
34
+ homepage:
35
+ licenses: []
36
+ metadata: {}
37
+ post_install_message:
38
+ rdoc_options: []
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - "~>"
44
+ - !ruby/object:Gem::Version
45
+ version: '2.0'
46
+ required_rubygems_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: '2.6'
51
+ requirements: []
52
+ rubyforge_project:
53
+ rubygems_version: 2.4.5.1
54
+ signing_key:
55
+ specification_version: 4
56
+ summary: test
57
+ test_files: []