ugc 0.0.1 → 0.0.2

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/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .idea
data/.rvmrc ADDED
@@ -0,0 +1,2 @@
1
+ rvm_gemset_create_on_use_flag=1
2
+ rvm gemset use 'ugc'
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # Usergrid Command Line (ugc)
2
+
3
+ ugc enables convenient terminal access to Apigee's App Services (aka Usergrid).
4
+
5
+ ## Installation
6
+
7
+ $ gem install ugc
8
+
9
+ ## Usage
10
+
11
+ ### Help
12
+
13
+ $ ugc help
14
+
15
+ ### Setup
16
+
17
+ Connect to an Apigee administrator account:
18
+
19
+ $ ugc profile apigee
20
+ $ ugc target organization scottganyo
21
+ organization = scottganyo
22
+ $ ugc target app messagee
23
+ application = messagee
24
+ $ ugc login -a scott@ganyo.com
25
+ password: **********
26
+ logged in user: scott@ganyo.com
27
+
28
+
29
+ ### Examples
30
+
31
+ ![image](https://github.com/scottganyo/ugc/raw/master/examples.jpeg)
data/Rakefile ADDED
@@ -0,0 +1,46 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rake/clean'
4
+ require 'rubygems'
5
+ require 'rubygems/package_task'
6
+ require 'rdoc/task'
7
+ require 'cucumber'
8
+ require 'cucumber/rake/task'
9
+ Rake::RDocTask.new do |rd|
10
+ rd.main = "README.rdoc"
11
+ rd.rdoc_files.include("README.rdoc","lib/**/*.rb","bin/**/*")
12
+ rd.title = 'Your application title'
13
+ end
14
+
15
+ spec = eval(File.read('ugc.gemspec'))
16
+
17
+ Gem::PackageTask.new(spec) do |pkg|
18
+ end
19
+ CUKE_RESULTS = 'results.html'
20
+ CLEAN << CUKE_RESULTS
21
+ desc 'Run features'
22
+ Cucumber::Rake::Task.new(:features) do |t|
23
+ opts = "features --format html -o #{CUKE_RESULTS} --format progress -x"
24
+ opts += " --tags #{ENV['TAGS']}" if ENV['TAGS']
25
+ t.cucumber_opts = opts
26
+ t.fork = false
27
+ end
28
+
29
+ desc 'Run features tagged as work-in-progress (@wip)'
30
+ Cucumber::Rake::Task.new('features:wip') do |t|
31
+ tag_opts = ' --tags ~@pending'
32
+ tag_opts = ' --tags @wip'
33
+ t.cucumber_opts = "features --format html -o #{CUKE_RESULTS} --format pretty -x -s#{tag_opts}"
34
+ t.fork = false
35
+ end
36
+
37
+ task :cucumber => :features
38
+ task 'cucumber:wip' => 'features:wip'
39
+ task :wip => 'features:wip'
40
+ require 'rake/testtask'
41
+ Rake::TestTask.new do |t|
42
+ t.libs << "test"
43
+ t.test_files = FileList['test/*_test.rb']
44
+ end
45
+
46
+ task :default => [:test,:features]
data/examples.jpeg ADDED
Binary file
@@ -0,0 +1,6 @@
1
+ When /^I get help for "([^"]*)"$/ do |app_name|
2
+ @app_name = app_name
3
+ step %(I run `#{app_name} help`)
4
+ end
5
+
6
+ # Add more step definitions here
@@ -0,0 +1,15 @@
1
+ require 'aruba/cucumber'
2
+
3
+ ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
4
+ LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)),'..','..','lib')
5
+
6
+ Before do
7
+ # Using "announce" causes massive warnings on 1.9.2
8
+ @puts = true
9
+ @original_rubylib = ENV['RUBYLIB']
10
+ ENV['RUBYLIB'] = LIB_DIR + File::PATH_SEPARATOR + ENV['RUBYLIB'].to_s
11
+ end
12
+
13
+ After do
14
+ ENV['RUBYLIB'] = @original_rubylib
15
+ end
@@ -0,0 +1,8 @@
1
+ Feature: My bootstrapped app kinda works
2
+ In order to get going on coding my awesome app
3
+ I want to have aruba and cucumber setup
4
+ So I don't have to do it myself
5
+
6
+ Scenario: App just runs
7
+ When I get help for "ugc"
8
+ Then the exit status should be 0
@@ -0,0 +1,25 @@
1
+ module Ugc
2
+ class Application < Usergrid::Application
3
+
4
+ def initialize
5
+ super application_url
6
+ self.auth_token = $settings.access_token
7
+ end
8
+
9
+ def application_url
10
+ url = $settings.base_url
11
+ org = $settings.organization
12
+ app = $settings.application
13
+
14
+ raise "not configured" unless url && org && app
15
+
16
+ concat_urls url, "#{org}/#{app}"
17
+ end
18
+
19
+ def login(username, password)
20
+ super username, password
21
+ $settings.access_token = auth_token
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,10 @@
1
+ desc 'http delete'
2
+ arg_name 'url'
3
+
4
+ command :delete do |c|
5
+
6
+ c.action do |global_options,options,args|
7
+ format_result resource(args[0]).delete
8
+ end
9
+
10
+ end
@@ -0,0 +1,10 @@
1
+ desc 'http get'
2
+ arg_name 'url'
3
+
4
+ command :get do |c|
5
+
6
+ c.action do |global_options,options,args|
7
+ format_result resource(args[0]).get
8
+ end
9
+
10
+ end
@@ -0,0 +1,47 @@
1
+ desc 'list'
2
+ command :ls,:list do |c|
3
+
4
+ c.desc 'collections'
5
+ c.command [:collections] do |c2|
6
+
7
+ c2.action do |global_options,options,args|
8
+ app = $application.entity
9
+ collections = app['metadata']['collections']
10
+ table border: true do
11
+ row header: true do
12
+ collections.first[1].each_key do |k|
13
+ column k
14
+ end
15
+ end
16
+ collections.each_value do |coll|
17
+ row do
18
+ coll.each_value do |v|
19
+ column v
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ default_names = %w(assets users events roles folders activities devices groups)
28
+ default_names.each do |e|
29
+ c.desc e
30
+ c.command [e.to_sym] do |c2|
31
+ c2.action do |global_options,options,args|
32
+ format_collection($application[e].collection)
33
+ end
34
+ end
35
+ end
36
+
37
+ c.desc 'whatevers'
38
+ c.command [:whatevers] do |c2|
39
+ c2.action do |global_options,options,args|
40
+ whatevers = $application[args[0]].collection
41
+ format_collection(whatevers)
42
+ end
43
+ end
44
+
45
+ c.default_command :whatevers
46
+
47
+ end
@@ -0,0 +1,28 @@
1
+ require 'io/console'
2
+
3
+ desc 'Describe login here'
4
+ arg_name 'username'
5
+
6
+ command :login do |c|
7
+
8
+ c.switch [:a,:admin]
9
+ c.action do |global_options,options,args|
10
+
11
+ if args[0]
12
+ password = ask('password: ') { |q| q.echo = '*' }
13
+
14
+ if password
15
+ if options[:admin]
16
+ management = Ugc::Management.new
17
+ management.login args[0], password
18
+ else
19
+ application = Ugc::Application.new
20
+ application.login args[0], password
21
+ end
22
+ end
23
+ puts "logged in user: #{args[0]}"
24
+ else
25
+ raise 'username required'
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ desc 'http post'
2
+ arg_name 'url [data]'
3
+
4
+ command :post do |c|
5
+ c.flag [:d,:data]
6
+
7
+ c.action do |global_options,options,args|
8
+ format_result resource(args[0]).post (options[:data] || args[1])
9
+ end
10
+
11
+ end
@@ -0,0 +1,32 @@
1
+ desc 'set the current profile'
2
+ arg_name 'profile name'
3
+
4
+ command :profile,:profiles do |c|
5
+ c.switch :d,:delete
6
+ c.action do |global_options,options,args|
7
+ if args[0]
8
+ if options[:delete]
9
+ $settings.delete_profile args[0]
10
+ puts "Deleted profile: " + args[0]
11
+ else
12
+ $settings.active_profile_name = args[0]
13
+ puts 'Set active profile:'
14
+ show_profile(args[0])
15
+ end
16
+ else
17
+ puts "Saved profiles:"
18
+ $settings.profiles.each_key do |name|
19
+ show_profile(name)
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ def show_profile(name)
26
+ profile = $settings.profile(name)
27
+ print $settings.active_profile_name == name ? ' *' : ' '
28
+ puts name
29
+ $settings.profile(name).each_pair do |k,v|
30
+ puts " #{k}: #{v}"
31
+ end
32
+ end
@@ -0,0 +1,11 @@
1
+ desc 'http put'
2
+ arg_name 'url [data]'
3
+
4
+ command :put do |c|
5
+ c.flag [:d,:data]
6
+
7
+ c.action do |global_options,options,args|
8
+ format_result resource(args[0]).put (options[:data] || args[1])
9
+ end
10
+
11
+ end
@@ -0,0 +1,54 @@
1
+ desc 'query'
2
+ long_desc 'note: query may contain a "from" clause instead of specifying collection_name'
3
+ arg_name '[collection_name] query'
4
+
5
+ command :query do |c|
6
+ c.action do |global_options,options,args|
7
+
8
+ case args.size
9
+ when 2
10
+ type = args[0]
11
+ query = args[1]
12
+ when 1
13
+ query = args[0]
14
+ else
15
+ help_now!
16
+ end
17
+
18
+ parsed_query = parse_sql query
19
+
20
+ if type == nil && parsed_query['from']
21
+ type = parsed_query['from']
22
+ query.gsub! /from\s+#{type}/i, ''
23
+ end
24
+
25
+ result = $application[type].query query
26
+
27
+ collection = result.collection
28
+ format_collection collection, parsed_query['select']
29
+ end
30
+
31
+ end
32
+
33
+ def parse_sql(query)
34
+ result = {}
35
+ keywords = %w(select from where)
36
+ current = nil
37
+ query.downcase.split(/[\s,*]/).each do |ea|
38
+ next if ea == ''
39
+ if keywords.include? ea
40
+ current = ea
41
+ elsif current
42
+ if result[current]
43
+ if result[current].is_a? Array
44
+ result[current] << ea
45
+ else
46
+ result[current] = [result[current]] << ea
47
+ end
48
+ else
49
+ result[current] = ea
50
+ end
51
+ end
52
+ end
53
+ result
54
+ end
@@ -0,0 +1,47 @@
1
+ desc 'set the base url, org, and app'
2
+
3
+ command :target do |c|
4
+
5
+ c.desc 'set base url'
6
+ c.command [:base,:base_url] do |ep|
7
+ ep.action do |global_options,options,args|
8
+ $settings.base_url = args[0]
9
+ puts "base_url = #{$settings.base_url}"
10
+ end
11
+ end
12
+
13
+ c.desc 'set organization'
14
+ c.command [:org,:organization] do |ep|
15
+ ep.action do |global_options,options,args|
16
+ $settings.organization = args[0]
17
+ puts "organization = #{$settings.organization}"
18
+ end
19
+ end
20
+
21
+ c.desc 'set application'
22
+ c.command [:app,:application] do |ep|
23
+ ep.action do |global_options,options,args|
24
+ $settings.application = args[0]
25
+ puts "application = #{$settings.application}"
26
+ end
27
+ end
28
+
29
+ c.desc 'set full url - parses base, org, and app'
30
+ c.command [:url] do |url|
31
+ url.action do |global_options,options,args|
32
+ if args[0]
33
+ app_name = args[0].split('/')[-1]
34
+ org_name = args[0].split('/')[-2]
35
+ base_url = args[0][0..url.index(org_name)-2]
36
+ $settings.base_url = base_url
37
+ $settings.organization = org_name
38
+ $settings.application = app_name
39
+ end
40
+ puts "base_url = #{$settings.base_url}"
41
+ puts "organization = #{$settings.organization}"
42
+ puts "application = #{$settings.application}"
43
+ end
44
+ end
45
+
46
+ c.default_command :url
47
+ end
@@ -0,0 +1,91 @@
1
+ SKIP_ATTRS = %w(metadata uri type)
2
+
3
+ def format_result(result)
4
+ if result.multiple_entities? && result.collection.size > 1
5
+ format_collection(result.collection)
6
+ else
7
+ format_entity(result.entity)
8
+ end
9
+ end
10
+
11
+ INDEX_COL_WIDTH = 2
12
+ COL_OVERHEAD = 3
13
+
14
+ def format_collection(collection, headers=nil)
15
+ if collection && collection.size > 0
16
+ table border: true do
17
+ row header: true do
18
+ headers ||= collection.first.keys.reject{|e| SKIP_ATTRS.include? e}
19
+ column '#', width: INDEX_COL_WIDTH
20
+ headers.each do |r|
21
+ column r, width: equal_column_size(headers.size)
22
+ end
23
+ end
24
+ collection.each_with_index do |entity, index|
25
+ row do
26
+ column index
27
+ if entity.is_a? Array
28
+ entity.each do |v|
29
+ column v
30
+ end
31
+ else
32
+ entity.reject{|k,v| SKIP_ATTRS.include? k}.each_value do |v|
33
+ column v
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ else
40
+ puts "0 results"
41
+ end
42
+ end
43
+
44
+ def format_entity(entity)
45
+ if entity
46
+ table border: true do
47
+ row header: true do
48
+ column 'name', width: 20
49
+ column 'value', width: (terminal_columns - 28)
50
+ end
51
+ entity.data.reject{|k,v| SKIP_ATTRS.include? k}.each do |k,v|
52
+ row do
53
+ column(k)
54
+ column(v)
55
+ end
56
+ end
57
+ end
58
+ else
59
+ puts "no data"
60
+ end
61
+ end
62
+
63
+ def equal_column_size(num_cols)
64
+ ((terminal_columns - COL_OVERHEAD - (INDEX_COL_WIDTH + COL_OVERHEAD)) / num_cols).to_i - COL_OVERHEAD
65
+ end
66
+
67
+ def terminal_columns
68
+ size = detect_terminal_size
69
+ size ? size[0] : 80
70
+ end
71
+
72
+ # Returns [width, height] of terminal when detected, nil if not detected.
73
+ # Think of this as a simpler version of Highline's Highline::SystemExtensions.terminal_size()
74
+ def detect_terminal_size
75
+ if (ENV['COLUMNS'] =~ /^\d+$/) && (ENV['LINES'] =~ /^\d+$/)
76
+ [ENV['COLUMNS'].to_i, ENV['LINES'].to_i]
77
+ elsif (RUBY_PLATFORM =~ /java/ || (!STDIN.tty? && ENV['TERM'])) && command_exists?('tput')
78
+ [`tput cols`.to_i, `tput lines`.to_i]
79
+ elsif STDIN.tty? && command_exists?('stty')
80
+ `stty size`.scan(/\d+/).map { |s| s.to_i }.reverse
81
+ else
82
+ nil
83
+ end
84
+ rescue
85
+ nil
86
+ end
87
+
88
+ # Determines if a shell command exists by searching for it in ENV['PATH'].
89
+ def command_exists?(command)
90
+ ENV['PATH'].split(File::PATH_SEPARATOR).any? {|d| File.exists? File.join(d, command) }
91
+ end
@@ -0,0 +1,7 @@
1
+ def resource(uri)
2
+ if URI.parse(uri).host
3
+ Usergrid::Resource.new(uri, nil, $application.options) # absolute
4
+ else
5
+ $application[uri] # relative
6
+ end
7
+ end
@@ -0,0 +1,20 @@
1
+ module Ugc
2
+ class Management < Usergrid::Management
3
+
4
+ def initialize
5
+ super management_url
6
+ auth_token = $settings.access_token
7
+ end
8
+
9
+ def management_url
10
+ raise "not configured" unless $settings.base_url
11
+ $settings.base_url
12
+ end
13
+
14
+ def login(username, password)
15
+ super username, password
16
+ $settings.access_token = auth_token
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,110 @@
1
+ module Ugc
2
+ class Settings
3
+
4
+ SETTINGS_FILE = 'settings.yml'
5
+
6
+ def initialize(directory)
7
+ @file = File.join directory, SETTINGS_FILE
8
+ @settings = YAML.load_file(@file) rescue default_settings
9
+ end
10
+
11
+ def active_profile_name
12
+ @settings['active_profile'] || 'local'
13
+ end
14
+
15
+ def active_profile_name=(name)
16
+ raise "unknown profile: #{name}" unless profile(name)
17
+ @settings['active_profile'] = name
18
+ save
19
+ end
20
+
21
+ def delete_profile(name)
22
+ raise "cannot delete active profile" if active_profile_name == name
23
+ raise "unknown profile: #{name}" unless profiles[name]
24
+ profiles.delete name
25
+ save
26
+ end
27
+
28
+ def profile(name=nil)
29
+ name ||= active_profile_name
30
+ profiles[name] || profiles[name] = {}
31
+ end
32
+
33
+ def profiles
34
+ @settings['profiles'] || @settings['profiles'] = {}
35
+ end
36
+
37
+ def base_url
38
+ profile['base_url']
39
+ end
40
+
41
+ def base_url=(url)
42
+ URI.parse url
43
+ set_profile 'base_url', url
44
+ end
45
+
46
+ def organization
47
+ profile['organization']
48
+ end
49
+
50
+ def organization=(org)
51
+ set_profile 'organization', org
52
+ end
53
+
54
+ def application
55
+ profile['application']
56
+ end
57
+
58
+ def application=(app)
59
+ set_profile 'application', app
60
+ end
61
+
62
+ def access_token
63
+ profile['access_token']
64
+ end
65
+
66
+ def access_token=(token)
67
+ set_profile 'access_token', token
68
+ end
69
+
70
+ def configured?
71
+ base_url && organization && application
72
+ end
73
+
74
+ def logged_in?
75
+ !!access_token
76
+ end
77
+
78
+ private
79
+
80
+ def set_profile(prop, value)
81
+ profile[prop] = value
82
+ save
83
+ end
84
+
85
+ def save
86
+ Dir.mkdir(File.dirname(@file)) unless Dir.exist?(File.dirname(@file))
87
+ File.open(@file, 'w') do |out|
88
+ YAML.dump(@settings, out)
89
+ end
90
+ end
91
+
92
+ def default_settings
93
+ {
94
+ 'target' => 'https://api.usergrid.com',
95
+ 'active_profile' => 'local',
96
+ 'profiles' => {
97
+ 'local' => {
98
+ 'base_url' => 'http://localhost:8080',
99
+ 'organization' => 'test-organization',
100
+ 'application' => 'test-app'
101
+ },
102
+ 'apigee' => {
103
+ 'base_url' => 'https://api.usergrid.com'
104
+ }
105
+ }
106
+ }
107
+ end
108
+
109
+ end
110
+ end
data/lib/ugc/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ugc
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
@@ -0,0 +1,14 @@
1
+ require 'test_helper'
2
+
3
+ class DefaultTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ end
7
+
8
+ def teardown
9
+ end
10
+
11
+ def test_the_truth
12
+ assert true
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ require 'test/unit'
2
+
3
+ # Add test libraries you want to use here, e.g. mocha
4
+
5
+ class Test::Unit::TestCase
6
+
7
+ # Add global extensions to the test case class here
8
+
9
+ end
data/ugc.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # Ensure we require the local version and not one we might have installed already
2
+ require File.join([File.dirname(__FILE__),'lib','ugc','version.rb'])
3
+ spec = Gem::Specification.new do |s|
4
+ s.name = 'ugc'
5
+ s.version = Ugc::VERSION
6
+ s.author = 'Scott Ganyo'
7
+ s.email = 'scott@ganyo.com'
8
+ s.homepage = 'http://ganyo.com'
9
+ s.platform = Gem::Platform::RUBY
10
+ s.summary = 'Usergrid Command Line'
11
+ s.files = `git ls-files`.split($\)
12
+ s.require_paths << 'lib'
13
+ s.has_rdoc = true
14
+ s.extra_rdoc_files = ['README.rdoc','ugc.rdoc']
15
+ s.rdoc_options << '--title' << 'ugc' << '--main' << 'README.rdoc' << '-ri'
16
+ s.bindir = 'bin'
17
+ s.executables << 'ugc'
18
+ s.add_development_dependency('rake')
19
+ s.add_development_dependency('rdoc')
20
+ s.add_development_dependency('aruba')
21
+ s.add_runtime_dependency('gli','2.5.0')
22
+ s.add_runtime_dependency('usergrid_iron')
23
+ s.add_runtime_dependency('highline')
24
+ s.add_runtime_dependency('command_line_reporter')
25
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ugc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -132,10 +132,36 @@ extra_rdoc_files:
132
132
  - README.rdoc
133
133
  - ugc.rdoc
134
134
  files:
135
+ - .gitignore
136
+ - .rvmrc
137
+ - Gemfile
138
+ - README.md
139
+ - README.rdoc
140
+ - Rakefile
135
141
  - bin/ugc
136
- - lib/ugc/version.rb
142
+ - examples.jpeg
143
+ - features/step_definitions/ugc_steps.rb
144
+ - features/support/env.rb
145
+ - features/ugc.feature
137
146
  - lib/ugc.rb
138
- - README.rdoc
147
+ - lib/ugc/application.rb
148
+ - lib/ugc/commands/delete.rb
149
+ - lib/ugc/commands/get.rb
150
+ - lib/ugc/commands/list.rb
151
+ - lib/ugc/commands/login.rb
152
+ - lib/ugc/commands/post.rb
153
+ - lib/ugc/commands/profile.rb
154
+ - lib/ugc/commands/put.rb
155
+ - lib/ugc/commands/query.rb
156
+ - lib/ugc/commands/target.rb
157
+ - lib/ugc/helpers/formatters.rb
158
+ - lib/ugc/helpers/uri.rb
159
+ - lib/ugc/management.rb
160
+ - lib/ugc/settings.rb
161
+ - lib/ugc/version.rb
162
+ - test/default_test.rb
163
+ - test/test_helper.rb
164
+ - ugc.gemspec
139
165
  - ugc.rdoc
140
166
  homepage: http://ganyo.com
141
167
  licenses: []
@@ -157,7 +183,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
157
183
  version: '0'
158
184
  segments:
159
185
  - 0
160
- hash: 2484694068275381343
186
+ hash: -2123078772774079119
161
187
  required_rubygems_version: !ruby/object:Gem::Requirement
162
188
  none: false
163
189
  requirements:
@@ -166,11 +192,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
192
  version: '0'
167
193
  segments:
168
194
  - 0
169
- hash: 2484694068275381343
195
+ hash: -2123078772774079119
170
196
  requirements: []
171
197
  rubyforge_project:
172
198
  rubygems_version: 1.8.24
173
199
  signing_key:
174
200
  specification_version: 3
175
- summary: Usergrid Explorer
201
+ summary: Usergrid Command Line
176
202
  test_files: []