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.
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: []