package_cloud 0.1.3 → 0.2.0

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.
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