test-gem-push 0.0.1
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.
- checksums.yaml +7 -0
- data/app.rb +94 -0
- 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: []
|