package_cloud 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/package_cloud CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
  require "package_cloud"
3
3
 
4
- PackageCloud::CLI.start(ARGV)
4
+ PackageCloud::CLI::Entry.start(ARGV)
data/lib/package_cloud.rb CHANGED
@@ -6,7 +6,9 @@ module PackageCloud
6
6
  autoload :CLI, "package_cloud/cli"
7
7
  autoload :Client, "package_cloud/client"
8
8
  autoload :ConfigFile, "package_cloud/config_file"
9
+ autoload :MasterToken, "package_cloud/master_token"
9
10
  autoload :Object, "package_cloud/object"
11
+ autoload :ReadToken, "package_cloud/read_token"
10
12
  autoload :Repository, "package_cloud/repository"
11
13
  autoload :Validator, "package_cloud/validator"
12
14
  end
@@ -5,7 +5,7 @@ module PackageCloud
5
5
  module Auth
6
6
  class << self
7
7
  def get_token(url)
8
- JSON.parse(RestClient.get("#{url}/token.json"))["token"]
8
+ JSON.parse(RestClient.get("#{url}/api/v1/token.json"))["token"]
9
9
  end
10
10
  end
11
11
  end
@@ -2,104 +2,27 @@ require "colorize"
2
2
  require "thor"
3
3
 
4
4
  module PackageCloud
5
- class CLI < Thor
6
- class_option "config"
7
- class_option "url"
8
-
9
- desc "list_distros package_type",
10
- "list available distros and versions for package_type"
11
- def list_distros(package_type)
12
- distros = client.distributions[package_type]
13
- if distros
14
- puts "Listing distributions for #{package_type}:"
15
- distros.each do |distro|
16
- puts "\n #{distro["display_name"]} (#{distro["index_name"]}):\n\n"
17
- distro["versions"].each do |ver|
18
- puts " #{ver["display_name"]} (#{ver["index_name"]})"
19
- end
5
+ module CLI
6
+ autoload :Distro, "package_cloud/cli/distro"
7
+ autoload :Entry, "package_cloud/cli/entry"
8
+ autoload :MasterToken, "package_cloud/cli/master_token"
9
+ autoload :Repository, "package_cloud/cli/repository"
10
+
11
+ class Base < Thor
12
+ class_option "config"
13
+ class_option "url"
14
+
15
+ private
16
+ def config
17
+ @config ||= begin
18
+ ConfigFile.new(options[:config] || "~/.packagecloud",
19
+ options[:url] || "https://packagecloud.io").tap(&:read_or_create)
20
+ end
20
21
  end
21
22
 
22
- puts "\nIf you don't see your distribution or version here, email us at support@packagecloud.io."
23
- else
24
- puts "No distributions exist for #{package_type}.".red
25
- puts "That either means that we don't support #{package_type} or that it doesn't require a distribution/version."
26
- exit(1)
27
- end
28
- end
29
-
30
- desc "push user/repo[/distro/version] /path/to/package",
31
- "push package to repository (in distro/version if required)"
32
- def push(repo, package_file)
33
- ARGV.clear # otherwise gets explodes
34
-
35
- validator = Validator.new(client)
36
- dist_id = validator.distribution_id(repo, package_file)
37
-
38
- # strip os/dist
39
- repo = repo.split("/")[0..1].join("/")
40
-
41
- print "Looking for repository at #{repo}... "
42
- repo = client.repository(repo)
43
- print "success!\n"
44
- print "Pushing #{package_file}... "
45
- repo.create_package(package_file, dist_id)
46
- end
47
-
48
- option :private
49
- desc "create repo_name",
50
- "create repository called repo_name"
51
- def create(repo_name)
52
- config.read_or_create
53
- client = Client.new(config)
54
-
55
- print "Looking for repository at #{repo_name}... "
56
- repo = client.create_repo(repo_name, options[:private])
57
- print "success!\n".green
58
- puts "Your repository has been created at:"
59
- puts " #{repo["url"]}"
60
- end
61
-
62
- desc "list",
63
- "list your repositories"
64
- def list
65
- repos = client.repositories
66
- if repos.length == 0
67
- puts "You have no repositories at the moment. Create one!"
68
- else
69
- puts "Your repositories:"
70
- puts ""
71
- repos.each_with_index do |repo, i|
72
- puts " #{repo.fqname} (#{repo.private_human})"
73
- puts " last push: #{repo.last_push_human} | packages: #{repo.package_count_human}"
74
- puts "" unless i == repos.length - 1
23
+ def client
24
+ @client ||= Client.new(config)
75
25
  end
76
- end
77
- end
78
-
79
- desc "install user/repo package_type",
80
- "install user/repo for package_type"
81
- def install(repo, package_type)
82
- if Process.uid != 0 && package_type != "gem"
83
- abort("You have to run install as root.".red)
84
- end
85
-
86
- print "Locating repository at #{repo}... "
87
- repo = client.repository(repo)
88
- print "success!\n"
89
- pid = fork { exec(repo.install_script(package_type)) }
90
- Process.waitpid(pid)
91
26
  end
92
-
93
- private
94
- def config
95
- @config ||= begin
96
- ConfigFile.new(options[:config] || "~/.packagecloud",
97
- options[:url] || "https://packagecloud.io").tap(&:read_or_create)
98
- end
99
- end
100
-
101
- def client
102
- @client ||= Client.new(config)
103
- end
104
27
  end
105
28
  end
@@ -0,0 +1,26 @@
1
+ module PackageCloud
2
+ module CLI
3
+ class Distro < Base
4
+ desc "list package_type",
5
+ "list available distros and versions for package_type"
6
+ def list(package_type)
7
+ distros = client.distributions[package_type]
8
+ if distros
9
+ puts "Listing distributions for #{package_type}:"
10
+ distros.each do |distro|
11
+ puts "\n #{distro["display_name"]} (#{distro["index_name"]}):\n\n"
12
+ distro["versions"].each do |ver|
13
+ puts " #{ver["display_name"]} (#{ver["index_name"]})"
14
+ end
15
+ end
16
+
17
+ puts "\nIf you don't see your distribution or version here, email us at support@packagecloud.io."
18
+ else
19
+ puts "No distributions exist for #{package_type}.".red
20
+ puts "That either means that we don't support #{package_type} or that it doesn't require a distribution/version."
21
+ exit(1)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,33 @@
1
+ module PackageCloud
2
+ module CLI
3
+ class Entry < Base
4
+ desc "repository SUBCMD ...ARGS", "manage repositories"
5
+ subcommand "repository", Repository
6
+
7
+ desc "distro SUBCMD ...ARGS", "manage repositories"
8
+ subcommand "distro", Distro
9
+
10
+ desc "master_token SUBCMD ...ARGS", "manage master tokens"
11
+ subcommand "master_token", MasterToken
12
+
13
+
14
+ desc "push user/repo[/distro/version] /path/to/package",
15
+ "push package to repository (in distro/version if required)"
16
+ def push(repo, package_file)
17
+ ARGV.clear # otherwise gets explodes
18
+
19
+ validator = Validator.new(client)
20
+ dist_id = validator.distribution_id(repo, package_file)
21
+
22
+ # strip os/dist
23
+ repo = repo.split("/")[0..1].join("/")
24
+
25
+ print "Looking for repository at #{repo}... "
26
+ repo = client.repository(repo)
27
+ print "success!\n"
28
+ print "Pushing #{package_file}... "
29
+ repo.create_package(package_file, dist_id)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,89 @@
1
+ module PackageCloud
2
+ module CLI
3
+ class MasterToken < Base
4
+ desc "list user/repository",
5
+ "list master tokens for specified repository"
6
+ def list(repo_name)
7
+ print "Looking for repository at #{repo_name}... "
8
+ repo = client.repository(repo_name)
9
+ print "success!\n"
10
+
11
+ tokens = repo.master_tokens
12
+ puts "Tokens for #{repo_name}:"
13
+ puts ""
14
+ tokens.each_with_index do |token, i|
15
+ puts " #{token.name}"
16
+ puts " read tokens:"
17
+ token.read_tokens.each do |read_token|
18
+ puts " #{read_token.name}"
19
+ end
20
+ puts "" unless i == tokens.length - 1
21
+ end
22
+ end
23
+
24
+ desc "create user/repository token_name",
25
+ "create a master token for the specified repository"
26
+ def create(repo_name, token_name)
27
+ print "Looking for repository at #{repo_name}... "
28
+ repo = client.repository(repo_name)
29
+ print "success!\n"
30
+
31
+ print "Attempting to create token named #{token_name}... "
32
+ repo.create_master_token(token_name)
33
+ print "success!\n".green
34
+ end
35
+
36
+ desc "destroy user/repository token_name",
37
+ "destroy a master token for the specified repository"
38
+ def destroy(repo_name, token_name)
39
+ ARGV.clear # otherwise gets explodes
40
+
41
+ if token_name == "default"
42
+ abort("You can't delete the default master_token.".red)
43
+ end
44
+
45
+ print "Looking for repository at #{repo_name}... "
46
+ repo = client.repository(repo_name)
47
+ print "success!\n"
48
+
49
+ token = repo.master_tokens.detect do |token|
50
+ token.name == token_name
51
+ end
52
+
53
+ if token
54
+ msg = "\nAre you sure you want to delete #{token_name}?"
55
+ msg << " #{token.read_tokens.length} read tokens will no longer work afterwards (y/n)" if token.read_tokens.length > 0
56
+ answer = get_valid(msg) do |s|
57
+ s == "y" || s == "n"
58
+ end
59
+ if answer == "y"
60
+ print "Attempting to destroy token named #{token_name}... "
61
+ token.destroy
62
+ print "success!\n".green
63
+ else
64
+ puts "Aborting...".red
65
+ end
66
+ else
67
+ puts "Wasn't able to find a token named #{token_name}.".red
68
+ exit(1)
69
+ end
70
+ end
71
+
72
+ private
73
+ def get_valid(prompt)
74
+ selection = ""
75
+ times = 0
76
+ until yield(selection)
77
+ if times > 0
78
+ puts "#{selection} is not a valid selection."
79
+ end
80
+ print "#{prompt}: "
81
+ selection = ::Kernel.gets.chomp
82
+ times += 1
83
+ end
84
+
85
+ selection
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,50 @@
1
+ module PackageCloud
2
+ module CLI
3
+ class Repository < Base
4
+ option :private
5
+ desc "create repo_name",
6
+ "create repository called repo_name"
7
+ def create(repo_name)
8
+ config.read_or_create
9
+ client = Client.new(config)
10
+
11
+ print "Looking for repository at #{repo_name}... "
12
+ repo = client.create_repo(repo_name, options[:private])
13
+ print "success!\n".green
14
+ puts "Your repository has been created at:"
15
+ puts " #{repo["url"]}"
16
+ end
17
+
18
+ desc "list",
19
+ "list your repositories"
20
+ def list
21
+ repos = client.repositories
22
+ if repos.length == 0
23
+ puts "You have no repositories at the moment. Create one!"
24
+ else
25
+ puts "Your repositories:"
26
+ puts ""
27
+ repos.each_with_index do |repo, i|
28
+ puts " #{repo.fqname} (#{repo.private_human})"
29
+ puts " last push: #{repo.last_push_human} | packages: #{repo.package_count_human}"
30
+ puts "" unless i == repos.length - 1
31
+ end
32
+ end
33
+ end
34
+
35
+ desc "install user/repo package_type",
36
+ "install user/repo for package_type"
37
+ def install(repo, package_type)
38
+ if Process.uid != 0 && package_type != "gem"
39
+ abort("You have to run install as root.".red)
40
+ end
41
+
42
+ print "Locating repository at #{repo}... "
43
+ repo = client.repository(repo)
44
+ print "success!\n"
45
+ pid = fork { exec(repo.install_script(package_type)) }
46
+ Process.waitpid(pid)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -10,7 +10,7 @@ module PackageCloud
10
10
  def repositories
11
11
  base_url = @config.base_url
12
12
  begin
13
- attrs = JSON.parse(RestClient.get("#{base_url}/repositories.json"))
13
+ attrs = JSON.parse(RestClient.get("#{base_url}/api/v1/repos.json"))
14
14
  attrs.map { |a| Repository.new(a, @config) }
15
15
  rescue RestClient::ResourceNotFound => e
16
16
  print "failed!\n".red
@@ -22,7 +22,7 @@ module PackageCloud
22
22
  base_url = @config.base_url
23
23
  user, repo = name.split("/")
24
24
  begin
25
- attrs = JSON.parse(RestClient.get("#{base_url}/#{user}/#{repo}.json"))
25
+ attrs = JSON.parse(RestClient.get("#{base_url}/api/v1/repos/#{user}/#{repo}.json"))
26
26
  Repository.new(attrs, @config)
27
27
  rescue RestClient::ResourceNotFound => e
28
28
  print "failed!\n".red
@@ -33,7 +33,7 @@ module PackageCloud
33
33
  def create_repo(name, priv)
34
34
  base_url = @config.base_url
35
35
  begin
36
- JSON.parse(RestClient.post("#{base_url}/repositories.json", :repository => {:name => name, :private => priv == "private" ? "1" : "0"}))
36
+ JSON.parse(RestClient.post("#{base_url}/api/v1/repos.json", :repository => {:name => name, :private => priv == "private" ? "1" : "0"}))
37
37
  rescue RestClient::UnprocessableEntity => e
38
38
  print "error!\n".red
39
39
  json = JSON.parse(e.response)
@@ -48,7 +48,17 @@ module PackageCloud
48
48
  def distributions
49
49
  base_url = @config.base_url
50
50
  begin
51
- JSON.parse(RestClient.get("#{base_url}/distributions.json"))
51
+ JSON.parse(RestClient.get("#{base_url}/api/v1/distributions.json"))
52
+ rescue RestClient::ResourceNotFound => e
53
+ print "failed!\n".red
54
+ exit(127)
55
+ end
56
+ end
57
+
58
+ def gem_version
59
+ base_url = @config.base_url
60
+ begin
61
+ JSON.parse(RestClient.get("#{base_url}/api/v1/gem_version"))
52
62
  rescue RestClient::ResourceNotFound => e
53
63
  print "failed!\n".red
54
64
  exit(127)
@@ -17,6 +17,7 @@ module PackageCloud
17
17
  attrs = JSON.parse(File.read(@filename))
18
18
  @token = attrs["token"] if attrs.has_key?("token")
19
19
  @url = URI(attrs["url"]) if attrs.has_key?("url")
20
+ assert_reasonable_gem_version
20
21
  else
21
22
  puts "No config file exists at #{@filename}. Login to create one."
22
23
 
@@ -55,5 +56,14 @@ module PackageCloud
55
56
  File.open(@filename, "w", 0600) { |f| f << JSON.dump(attrs); f << "\r\n" }
56
57
  puts "success!"
57
58
  end
59
+
60
+ def assert_reasonable_gem_version
61
+ gem_version = Client.new(self).gem_version
62
+ if gem_version["minor"] != MINOR_VERSION
63
+ abort("This gem is out of date. Please update it!".red)
64
+ elsif gem_version["patch"] > PATCH_VERSION
65
+ $stderr << "[WARNING] There's a newer version of the package_cloud gem. Install it when you get a chance!\n"
66
+ end
67
+ end
58
68
  end
59
69
  end
@@ -0,0 +1,19 @@
1
+ module PackageCloud
2
+ class MasterToken < Object
3
+ def initialize(attrs, config)
4
+ @attrs = attrs
5
+ @config = config
6
+ end
7
+
8
+ def read_tokens
9
+ @attrs["read_tokens"].map do |read_token|
10
+ ReadToken.new(read_token)
11
+ end
12
+ end
13
+
14
+ def destroy
15
+ url = @config.base_url + paths["self"]
16
+ RestClient.delete(url)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ module PackageCloud
2
+ class ReadToken < Object
3
+ def initialize(attrs)
4
+ @attrs = attrs
5
+ end
6
+ end
7
+ end
@@ -25,10 +25,31 @@ module PackageCloud
25
25
  end
26
26
 
27
27
  def install_script(type)
28
- url = paths["install_script"].gsub(/:package_type/, type)
28
+ url = urls["install_script"].gsub(/:package_type/, type)
29
29
  RestClient.get(url)
30
30
  end
31
31
 
32
+ def master_tokens
33
+ url = @config.base_url + paths["master_tokens"]
34
+ attrs = JSON.parse(RestClient.get(url))
35
+ attrs.map { |a| MasterToken.new(a, @config) }
36
+ end
37
+
38
+ def create_master_token(name)
39
+ url = @config.base_url + paths["create_master_token"]
40
+ begin
41
+ RestClient.post(url, :master_token => {:name => name})
42
+ rescue RestClient::UnprocessableEntity => e
43
+ print "error:\n".red
44
+ json = JSON.parse(e.response)
45
+ json.each do |k,v|
46
+ puts "\n\t#{k}: #{v.join(", ")}\n"
47
+ end
48
+ puts ""
49
+ exit(1)
50
+ end
51
+ end
52
+
32
53
  def private_human
33
54
  send(:private) ? "private".red : "public".green
34
55
  end
@@ -1,3 +1,7 @@
1
1
  module PackageCloud
2
- VERSION = "0.1.3"
2
+ MAJOR_VERSION = "0"
3
+ MINOR_VERSION = "2"
4
+ PATCH_VERSION = "0"
5
+
6
+ VERSION = [MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION].join(".")
3
7
  end
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: package_cloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ prerelease:
5
+ version: 0.2.0
5
6
  platform: ruby
6
7
  authors:
7
8
  - James Golick
@@ -9,12 +10,13 @@ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
12
 
12
- date: 2014-03-04 00:00:00 Z
13
+ date: 2014-04-14 00:00:00 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: thor
16
17
  prerelease: false
17
18
  requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
18
20
  requirements:
19
21
  - - "="
20
22
  - !ruby/object:Gem::Version
@@ -25,6 +27,7 @@ dependencies:
25
27
  name: highline
26
28
  prerelease: false
27
29
  requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
28
31
  requirements:
29
32
  - - "="
30
33
  - !ruby/object:Gem::Version
@@ -35,6 +38,7 @@ dependencies:
35
38
  name: rest-client
36
39
  prerelease: false
37
40
  requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
38
42
  requirements:
39
43
  - - "="
40
44
  - !ruby/object:Gem::Version
@@ -45,6 +49,7 @@ dependencies:
45
49
  name: json
46
50
  prerelease: false
47
51
  requirement: &id004 !ruby/object:Gem::Requirement
52
+ none: false
48
53
  requirements:
49
54
  - - "="
50
55
  - !ruby/object:Gem::Version
@@ -55,6 +60,7 @@ dependencies:
55
60
  name: colorize
56
61
  prerelease: false
57
62
  requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
58
64
  requirements:
59
65
  - - "="
60
66
  - !ruby/object:Gem::Version
@@ -65,6 +71,7 @@ dependencies:
65
71
  name: bundler
66
72
  prerelease: false
67
73
  requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
68
75
  requirements:
69
76
  - - ~>
70
77
  - !ruby/object:Gem::Version
@@ -75,9 +82,9 @@ dependencies:
75
82
  name: rake
76
83
  prerelease: false
77
84
  requirement: &id007 !ruby/object:Gem::Requirement
85
+ none: false
78
86
  requirements:
79
- - &id008
80
- - ">="
87
+ - - ">="
81
88
  - !ruby/object:Gem::Version
82
89
  version: "0"
83
90
  type: :development
@@ -101,9 +108,15 @@ files:
101
108
  - lib/package_cloud.rb
102
109
  - lib/package_cloud/auth.rb
103
110
  - lib/package_cloud/cli.rb
111
+ - lib/package_cloud/cli/distro.rb
112
+ - lib/package_cloud/cli/entry.rb
113
+ - lib/package_cloud/cli/master_token.rb
114
+ - lib/package_cloud/cli/repository.rb
104
115
  - lib/package_cloud/client.rb
105
116
  - lib/package_cloud/config_file.rb
117
+ - lib/package_cloud/master_token.rb
106
118
  - lib/package_cloud/object.rb
119
+ - lib/package_cloud/read_token.rb
107
120
  - lib/package_cloud/repository.rb
108
121
  - lib/package_cloud/validator.rb
109
122
  - lib/package_cloud/version.rb
@@ -111,25 +124,30 @@ files:
111
124
  homepage: https://packagecloud.io
112
125
  licenses:
113
126
  - MIT
114
- metadata: {}
115
-
116
127
  post_install_message:
117
128
  rdoc_options: []
118
129
 
119
130
  require_paths:
120
131
  - lib
121
132
  required_ruby_version: !ruby/object:Gem::Requirement
133
+ none: false
122
134
  requirements:
123
- - *id008
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: "0"
124
138
  required_rubygems_version: !ruby/object:Gem::Requirement
139
+ none: false
125
140
  requirements:
126
- - *id008
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: "0"
127
144
  requirements: []
128
145
 
129
146
  rubyforge_project:
130
- rubygems_version: 2.1.9
147
+ rubygems_version: 1.8.23
131
148
  signing_key:
132
- specification_version: 4
149
+ specification_version: 3
133
150
  summary: https://packagecloud.io
134
151
  test_files: []
135
152
 
153
+ has_rdoc:
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA512:
3
- data.tar.gz: 674a58d089c083097afa436918d5d31a62b0d9266d42b08db982d2513de5d9725cdb7af305b7462162cf0ea71eded879c96aad518943ddc2ee95dcc140527b51
4
- metadata.gz: 6695cc5d8daccd1b9e631b1ab21f0d2cf1298e024419fd8a38ef8ac02a0c3779620a9f880ce3e7095eed6707b5148bfd737ab889fb92e6664a52d34a92622857
5
- SHA1:
6
- data.tar.gz: 79e329454ab6a8deaa1a86bb5fa6dda54eaff956
7
- metadata.gz: 1a6346259c8e321a6d1fa20f415e2b9389eff0e9