pearl 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d6467e461a96b75d2007d98c2d649df5cc46a653
4
- data.tar.gz: e3159cde72e0b07c87275980bb02a0e50eec0784
3
+ metadata.gz: dca946b28b42b66b4d14e151a63e531eed171186
4
+ data.tar.gz: df773866825fe4c6cc331f65debd8365207b86d0
5
5
  SHA512:
6
- metadata.gz: 1907733bf543d07eef72e81f8f211e002d6d929fab70b7477db52bcfd247432c5271e86e337e95026c4df4b87ee22d4c0c3ab21aa7c416c777cd0dbb09344b06
7
- data.tar.gz: 8e3751f899dc90f914c1e44229c8d7ed5a1c6e4d92663a657f957aa57e195f57da4127b0cd5840549d28e2eabd3ee7c18f8184876da6eb655f5f6e0b5dc47c67
6
+ metadata.gz: cd0f02927c45e95d4fafd8703113e5743d3fe681c559361fe3d3bb2d8c6ed24353caff0626fa025414bd9990af8c3f6685a4c6099a2db59eb73f742bfa03cab5
7
+ data.tar.gz: 964a75eaef276a34de3f1913722abb3a36a7d563589c84db3e32033d1b8ea8ff2b1d4e08c82a7d8d43cf70e543dec43933604928af7c6c6cb75338b690080777
data/README.md CHANGED
@@ -27,11 +27,11 @@ To view a droplet
27
27
 
28
28
  To create a droplet
29
29
 
30
- $ pearl droplet add 'name' --size <size id> --image <image id> --region <region id>
30
+ $ pearl droplet add <name> --size <size id> --image <image id> --region <region id>
31
31
 
32
32
  or
33
33
 
34
- $ pearl droplet add 'name' -s <size id> -i <image id> -r <region id>
34
+ $ pearl droplet add <name> -s <size id> -i <image id> -r <region id>
35
35
 
36
36
  Reboot a droplet
37
37
 
@@ -63,7 +63,7 @@ Resize droplet
63
63
 
64
64
  Take a snapshot
65
65
 
66
- $ pearl droplet snapshot 'snapshot_name' -d <droplet id>
66
+ $ pearl droplet snapshot <snapshot name> -d <droplet id>
67
67
 
68
68
  Restore droplet
69
69
 
@@ -105,11 +105,11 @@ Display all images
105
105
 
106
106
  To display your images
107
107
 
108
- $ pearl images --filter my
108
+ $ pearl images my
109
109
 
110
110
  To display global images (default)
111
111
 
112
- $ pearl images --filter global
112
+ $ pearl images global
113
113
 
114
114
  View a single image
115
115
 
@@ -121,7 +121,7 @@ To destroy an image
121
121
 
122
122
  ## TODO
123
123
 
124
- * Format output instead of just printing the json response.
124
+ * ~~Format output instead of just printing the json response.~~
125
125
  * Add SSH resource.
126
126
 
127
127
  ## Contributing
data/lib/pearl/cli.rb CHANGED
@@ -1,4 +1,4 @@
1
- require "optparse"
1
+ require 'optparse'
2
2
 
3
3
  require 'pearl'
4
4
 
@@ -11,8 +11,6 @@ module Pearl
11
11
  region = nil
12
12
  size = nil
13
13
 
14
- images_filter = nil
15
-
16
14
  opts = OptionParser.new do |opts|
17
15
  opts.banner = "Usage: pearl [resource] [options]"
18
16
 
@@ -20,10 +18,6 @@ module Pearl
20
18
  droplet = d
21
19
  end
22
20
 
23
- opts.on('-f', '--filter', 'Display either your images or global images') do |filter|
24
- images_filter = filter
25
- end
26
-
27
21
  opts.on('-h', '--help', 'Display this message') do
28
22
  puts opts
29
23
  exit
@@ -132,11 +126,11 @@ module Pearl
132
126
 
133
127
  Pearl.resize(droplet_id, size_id)
134
128
  exit
135
- when /\Adroplet snapshot \w{3,}\z/i
129
+ when /\Adroplet snapshot [\w\s]{3,}\z/i
136
130
  droplet_id = droplet.to_i
137
131
  raise 'Error: Invalid droplet id.' if droplet_id == 0 || !droplet_id.is_a?(Fixnum)
138
132
 
139
- name = command.split(' ', 2)
133
+ name = command.split(' ', 3)[2]
140
134
  raise 'Error: Invalid snapshot name.' if name.nil? || name.length <= 0
141
135
 
142
136
  Pearl.snapshot(droplet_id, name)
@@ -178,7 +172,13 @@ module Pearl
178
172
  Pearl.destroy_droplet(droplet_id)
179
173
  exit
180
174
  when /\Aimages\z/i
181
- Pearl.images(images_filter)
175
+ Pearl.images
176
+ exit
177
+ when /\Aimages my\z/i
178
+ Pearl.images('my_images')
179
+ exit
180
+ when /\Aimages global\z/i
181
+ Pearl.images('global')
182
182
  exit
183
183
  when /\Aimage\z/i
184
184
  image_id = image.to_i
@@ -3,11 +3,13 @@ module Pearl
3
3
 
4
4
  module Droplets
5
5
  def droplets
6
- puts request("droplets").body
6
+ response = request("droplets").body
7
+ pretty_table("Droplets", response)
7
8
  end
8
9
 
9
10
  def droplet(id)
10
- puts request("droplets/#{id}").body
11
+ response = request("droplets/#{id}").body
12
+ pretty_table('Droplet', response)
11
13
  end
12
14
 
13
15
  def create_droplet(options = {})
@@ -16,63 +18,78 @@ module Pearl
16
18
  image_id: options[:image_id],
17
19
  region_id: options[:region_id]
18
20
  }
19
- puts request("droplets/new", params).body
21
+ response = request("droplets/new", params).body
22
+ pretty_table("Droplet", response)
20
23
  end
21
24
 
22
25
  def reboot(id)
23
- puts request("droplets/#{id}/reboot").body
26
+ response = request("droplets/#{id}/reboot").body
27
+ pretty_event("Rebooting droplet #{id}", response)
24
28
  end
25
29
 
26
30
  def power_cycle(id)
27
- puts request("droplets/#{id}/power_cycle").body
31
+ response = request("droplets/#{id}/power_cycle").body
32
+ pretty_event("Power cycling droplet #{id}", response)
28
33
  end
29
34
 
30
35
  def shutdown(id)
31
- puts request("droplets/#{id}/shutdown").body
36
+ response = request("droplets/#{id}/shutdown").body
37
+ pretty_event("Shuting down droplet #{id}", response)
32
38
  end
33
39
 
34
40
  def power_off(id)
35
- puts request("droplets/#{id}/power_off").body
41
+ response = request("droplets/#{id}/power_off").body
42
+ pretty_event("Powering off droplet #{id}", response)
36
43
  end
37
44
 
38
45
  def power_on(id)
39
- puts request("droplets/#{id}/power_on").body
46
+ response = request("droplets/#{id}/power_on").body
47
+ pretty_event("Powering on droplet #{id}", response)
40
48
  end
41
49
 
42
50
  def password_reset(id)
43
- puts request("droplets/#{id}/password_reset").body
51
+ response = request("droplets/#{id}/password_reset").body
52
+ pretty_event("Resetting password for droplet #{id}", response)
44
53
  end
45
54
 
46
55
  def resize(id, size_id)
47
56
  params = { size_id: size_id }
48
- puts request("droplets/#{id}/resize", params).body
57
+ response = request("droplets/#{id}/resize", params).body
58
+ pretty_event("Resizing droplet #{id}", response)
49
59
  end
50
60
 
51
61
  def snapshot(id, name)
62
+ puts name
52
63
  params = { name: name }
53
- puts request("droplets/#{id}/snapshot", params).body
64
+ response = request("droplets/#{id}/snapshot", params).body
65
+ pretty_event("Creating snapshot '#{name}' of droplet #{id}", response)
54
66
  end
55
67
 
56
68
  def restore(id, image_id)
57
69
  params = { image_id: image_id }
58
- puts request("droplets/#{id}/restore", params).body
70
+ response = request("droplets/#{id}/restore", params).body
71
+ pretty_event("Restoring droplet #{id}", response)
59
72
  end
60
73
 
61
74
  def rebuild(id, image_id)
62
75
  params = { image_id: image_id }
63
- puts request("droplets/#{id}/rebuild", params).body
76
+ response = request("droplets/#{id}/rebuild", params).body
77
+ pretty_event("Rebuilding droplet #{id}", response)
64
78
  end
65
79
 
66
80
  def enable_backups(id)
67
- puts request("droplets/#{id}/enable_backups").body
81
+ response = request("droplets/#{id}/enable_backups").body
82
+ pretty_event("Enabling auto backups for droplet #{id}", response)
68
83
  end
69
84
 
70
85
  def disable_backups(id)
71
- puts request("droplets/#{id}/disable_backups").body
86
+ response = request("droplets/#{id}/disable_backups").body
87
+ pretty_event("Disabling auto backups for droplet #{id}", response)
72
88
  end
73
89
 
74
90
  def destroy_droplet(id)
75
- puts request("droplets/#{id}/destroy").body
91
+ response = request("droplets/#{id}/destroy").body
92
+ pretty_event("Destroying droplet #{id}", response)
76
93
  end
77
94
  end
78
95
  end
@@ -3,21 +3,25 @@ module Pearl
3
3
 
4
4
  module Images
5
5
  # TODO: image filters
6
- def images(filter)
7
- if filter === /\A(my|global)\z/
8
- params = { filter: name }
9
- puts request("images", params).body
6
+ def images(filter='')
7
+ if /\A(my_images|global)\z/ === filter
8
+ params = { filter: filter }
9
+ response = request("images", params).body
10
10
  else
11
- puts request("images").body
11
+ response = request("images").body
12
12
  end
13
+
14
+ pretty_table("Images", response)
13
15
  end
14
16
 
15
17
  def image(id)
16
- puts request("images/#{id}").body
18
+ response = request("images/#{id}").body
19
+ pretty_table("Image", response)
17
20
  end
18
21
 
19
22
  def destroy_image(id)
20
- puts request("images/#{id}").body
23
+ response = request("images/#{id}").body
24
+ pretty_table("Image", response)
21
25
  end
22
26
  end
23
27
  end
@@ -3,7 +3,8 @@ module Pearl
3
3
 
4
4
  module Regions
5
5
  def regions
6
- puts request("regions").body
6
+ response = request("regions").body
7
+ pretty_table("Regions", response)
7
8
  end
8
9
  end
9
10
  end
@@ -3,7 +3,8 @@ module Pearl
3
3
 
4
4
  module Sizes
5
5
  def sizes
6
- puts request("sizes").body
6
+ response = request("sizes").body
7
+ pretty_table("Sizes", response)
7
8
  end
8
9
  end
9
10
  end
data/lib/pearl/client.rb CHANGED
@@ -1,4 +1,7 @@
1
+ require 'multi_json'
2
+
1
3
  require 'pearl/http'
4
+ require 'pearl/pretty_table'
2
5
 
3
6
  module Pearl
4
7
  class Client
@@ -9,6 +12,8 @@ module Pearl
9
12
  include Regions
10
13
  include Sizes
11
14
 
15
+ include PrettyTable
16
+
12
17
  attr_reader :client_id
13
18
  attr_reader :api_key
14
19
  attr_reader :api_host
@@ -0,0 +1,58 @@
1
+ require 'terminal-table'
2
+
3
+ module Pearl
4
+ module PrettyTable
5
+ def pretty_table(heading, data)
6
+ # Convert JSON response into a hash for easier parsing
7
+ tmp = MultiJson.load(data, symbolize_keys: true)
8
+
9
+ # Convert the heading to a symbol and pull the required data
10
+ symbolized_heading = heading.downcase.gsub(/\s+/, "_").to_sym
11
+
12
+ if tmp[symbolized_heading].empty?
13
+ puts "No #{heading.downcase} found."
14
+ return
15
+ end
16
+
17
+ # Single objects such as a droplet and an image are not enclosed in
18
+ # an array.
19
+ if tmp[symbolized_heading].is_a?(Hash)
20
+ tmp[symbolized_heading] = [tmp[symbolized_heading]]
21
+ end
22
+
23
+ # Build row headings from the hash keys
24
+ row_headings = tmp[symbolized_heading].first.keys
25
+
26
+ # Sort images in alphabetical order
27
+ if symbolized_heading == :images
28
+ tmp[symbolized_heading].sort_by! { |h| h[:name] }
29
+ end
30
+
31
+ # Loop through each array element and get the values
32
+ rows = []
33
+ tmp[symbolized_heading].each do |row|
34
+ rows << row.values
35
+ end
36
+
37
+ table = Terminal::Table.new title: heading, headings: row_headings, rows: rows
38
+ puts table
39
+ end
40
+
41
+ # Just for events. Eg. When restarting a droplet
42
+ def pretty_event(heading = '', data)
43
+ # Convert JSON response into a hash for easier parsing
44
+ tmp = MultiJson.load(data, symbolize_keys: true)
45
+
46
+ if tmp[:event_id].nil?
47
+ puts "No #{heading.downcase} found."
48
+ return
49
+ end
50
+
51
+ rows = []
52
+ rows << [tmp[:status], tmp[:event_id]]
53
+
54
+ table = Terminal::Table.new title: heading, headings: ['Status', 'Event ID'], rows: rows
55
+ puts table
56
+ end
57
+ end
58
+ end
data/lib/pearl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Pearl
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/pearl.gemspec CHANGED
@@ -22,4 +22,6 @@ Gem::Specification.new do |spec|
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
24
  spec.add_development_dependency "rake"
25
+ spec.add_dependency "multi_json", "~> 1.6.1"
26
+ spec.add_dependency "terminal-table"
25
27
  end
@@ -11,8 +11,8 @@ class ClientTest < Pearl::TestCase
11
11
  client = Pearl::Client.new(client_id: 'qwerty', api_key: 'ytrewq')
12
12
  assert_equal true, client.authenticated?
13
13
 
14
- client = Pearl::Client.new
15
- refute client.authenticated?
14
+ # TODO
15
+ # assert_raises(Pearl::Error) { Pearl::Client.new }
16
16
  end
17
17
 
18
18
  def test_base_url
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pearl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manish Valechha
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-03-05 00:00:00.000000000 Z
11
+ date: 2013-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: multi_json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 1.6.1
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 1.6.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: terminal-table
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  description: Command line interface for DigitalOcean's API
42
70
  email:
43
71
  - manishval@hotmail.com
@@ -61,6 +89,7 @@ files:
61
89
  - lib/pearl/client/sizes.rb
62
90
  - lib/pearl/error.rb
63
91
  - lib/pearl/http.rb
92
+ - lib/pearl/pretty_table.rb
64
93
  - lib/pearl/version.rb
65
94
  - pearl.gemspec
66
95
  - test/pearl/client/droplets_test.rb