gemjar 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
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
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in gemjar.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 George Drummond
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,118 @@
1
+ # Gemjar HQ
2
+
3
+ ***[GemJar HQ](https://gemjarhq.com)*** is a private RubyGem hosting service that is compatible with all hosting platforms, including ***Heroku***!
4
+
5
+ ## Installation
6
+
7
+ ```
8
+ gem install gemjar
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ Running ```gemjar help``` will give you a list of the available commands:
14
+
15
+ ```
16
+ Tasks:
17
+ gemjar help [TASK] # Describe available tasks or one specific task
18
+ gemjar list # List rubygems in my GemJar
19
+ gemjar login # Sign into your GemJar account
20
+ gemjar logout # Sign out of your GemJar account
21
+ gemjar push # Push a new gem to GemJar
22
+ gemjar user:add # Add a new collaborator
23
+ gemjar user:list # List collaborators
24
+ gemjar user:remove # Remove a collaborator
25
+ gemjar version # Output GemJar version number
26
+ ```
27
+
28
+ ## API Usage
29
+
30
+ With the GemJar gem you can also interact directly with the API. For this you will probably want to add GemJar to your gem file.
31
+
32
+ ```ruby
33
+ gem 'gemjar'
34
+ ```
35
+
36
+ Now configure GemJar with your **api_token** which you can find on the overview page.
37
+
38
+ ```ruby
39
+ GemJar.configure do |config|
40
+ config.api_token = 'api_token'
41
+ end
42
+ ```
43
+
44
+ Then you can create a new ```GemJar::Client``` object.
45
+
46
+ ```ruby
47
+ client = GemJar::Client.new
48
+ ```
49
+
50
+ ### Users
51
+
52
+ Add a collaborator to your account:
53
+
54
+ ```ruby
55
+ client.users.create(:email => 'user@example.com')
56
+ ```
57
+ List collaborators linked to your account:
58
+
59
+ ```ruby
60
+ client.users.all
61
+ # returns:
62
+ # [
63
+ # {:email => 'user@example.com', :id => '50f08648cf60c9300e000001'},
64
+ # {:email => 'collaborator@example.com', :id => '50f5c1afcf60c95013000004'}
65
+ # ]
66
+ ```
67
+
68
+ Remove a collaborator from your account:
69
+
70
+ ```ruby
71
+ client.users.destroy('50f5c1afcf60c95013000004')
72
+ ```
73
+
74
+ ### Rubygems
75
+
76
+ List all Rubygems
77
+
78
+ ```ruby
79
+ client.rubygems.all
80
+ ```
81
+
82
+ Upload a Rubygem to your GemJar
83
+
84
+ ```ruby
85
+ file = File.new(PATH_TO_GEM), 'rb')
86
+ client.rubygems.create(:file => file)
87
+ ```
88
+
89
+ ## Contributing
90
+
91
+ Feel free to hack away and send me a pull request!
92
+
93
+ ## License
94
+
95
+ ```
96
+ Copyright (c) 2013 George Drummond
97
+
98
+ MIT License
99
+
100
+ Permission is hereby granted, free of charge, to any person obtaining
101
+ a copy of this software and associated documentation files (the
102
+ "Software"), to deal in the Software without restriction, including
103
+ without limitation the rights to use, copy, modify, merge, publish,
104
+ distribute, sublicense, and/or sell copies of the Software, and to
105
+ permit persons to whom the Software is furnished to do so, subject to
106
+ the following conditions:
107
+
108
+ The above copyright notice and this permission notice shall be
109
+ included in all copies or substantial portions of the Software.
110
+
111
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
112
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
113
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
114
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
115
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
116
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
117
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
118
+ ```
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/gemjar ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/ruby
2
+ require 'gemjar'
3
+
4
+ GemJar::Cli.start
data/gemjar.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'gemjar/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "gemjar"
8
+ gem.version = GemJar::GEM_VERSION
9
+ gem.authors = ["George Drummond"]
10
+ gem.email = ["georgedrummond@gmail.com"]
11
+ gem.description = %q{Official GemJar HQ RubyGem.}
12
+ gem.summary = %q{Official GemJar HQ RubyGem.}
13
+ gem.homepage = "https://gemjarhq.com"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency 'rest-client', '1.6.7'
21
+ gem.add_dependency 'json', '1.7.6'
22
+ gem.add_dependency 'thor', '0.16.0'
23
+ gem.add_dependency 'smart_colored', '1.1.1'
24
+ gem.add_dependency 'launchy', '2.1.2'
25
+ gem.add_dependency 'highline', '1.6.15'
26
+ end
data/lib/gemjar.rb ADDED
@@ -0,0 +1,19 @@
1
+ require_relative 'gemjar/version'
2
+
3
+ module GemJar
4
+ autoload :Cli, 'gemjar/cli'
5
+ autoload :Client, 'gemjar/client'
6
+ autoload :Resource, 'gemjar/resource'
7
+
8
+ class << self
9
+ attr_accessor :api_key
10
+
11
+ def endpoint
12
+ 'https://gemjarhq.com/api/v1'
13
+ end
14
+
15
+ def configure(&block)
16
+ yield GemJar
17
+ end
18
+ end
19
+ end
data/lib/gemjar/cli.rb ADDED
@@ -0,0 +1,133 @@
1
+ require 'thor'
2
+ require 'rest_client'
3
+ require 'smart_colored/extend'
4
+ require 'launchy'
5
+ require 'highline'
6
+
7
+ module GemJar
8
+ class Cli < Thor
9
+ include Thor::Actions
10
+
11
+ desc 'user:add', 'Add a new collaborator'.cyan
12
+ map 'user:add' => 'user_add'
13
+ def user_add(email)
14
+ with_rescue do
15
+ client.users.create :email => email
16
+ puts "#{email} was added as a collaborator".green
17
+ end
18
+ rescue RestClient::Conflict
19
+ puts "#{email} is already associated with an account".red
20
+ end
21
+
22
+ desc 'user:list', 'List collaborators'.cyan
23
+ map 'user:list' => 'user_list'
24
+ def user_list
25
+ with_rescue do
26
+ puts '=== Users'
27
+ users = client.users.all.sort { |a, b| a['email'] <=> b['email'] }
28
+ users.each { |u| puts u['email'] }
29
+ end
30
+ end
31
+
32
+ desc 'user:remove', 'Remove a collaborator'.cyan
33
+ map 'user:remove' => 'user_remove'
34
+ def user_remove(email)
35
+ with_rescue do
36
+ user = client.users.all.select { |u| u['email'] == email }.first
37
+ if user
38
+ client.users.destroy user['id']
39
+ puts "#{email} has been removed as a collaborator".green
40
+ else
41
+ puts "#{email} does not exist as a collaborator".red
42
+ end
43
+ end
44
+ end
45
+
46
+ desc 'auth:login', 'Sign into your GemJar account'.cyan
47
+ map 'auth:login' => 'auth_login'
48
+ def auth_login
49
+ authenticate_session
50
+ end
51
+
52
+ desc 'auth:logout', 'Sign out of your GemJar account'.cyan
53
+ map 'auth:logout' => 'auth_logout'
54
+ def auth_logout
55
+ remove_file config, :verbose => false
56
+ end
57
+
58
+ desc 'list', 'List rubygems in my GemJar'.cyan
59
+ def list
60
+ with_rescue do
61
+ puts '=== GemJar'
62
+ client.rubygems.all.each do |gem|
63
+ gems = []
64
+ gem['versions'].each { |version| gems << version['number'] }
65
+ puts "#{gem['name']} (#{gems.join ', '})"
66
+ end
67
+ end
68
+ end
69
+
70
+ desc 'push', 'Push a new gem to GemJar'.cyan
71
+ def push(rubygem)
72
+ with_rescue do
73
+ if File.exists?(rubygem)
74
+ client.rubygems.create :file => File.new(rubygem, 'rb')
75
+ puts "#{rubygem} was pushed to GemJar HQ".green
76
+ else
77
+ puts 'Rubygem does not exist'.red
78
+ end
79
+ end
80
+ rescue RestClient::Conflict
81
+ puts 'The gem you tried to upload already exists in your GemJar'.red
82
+ end
83
+
84
+ desc 'version', 'Output GemJar version number'.cyan
85
+ def version
86
+ puts "Gem: #{GemJar::GEM_VERSION.green}, API: #{GemJar::API_VERSION.green}"
87
+ end
88
+
89
+ desc 'signup', 'Sign up for a GemJar HQ account'.cyan
90
+ def signup
91
+ Launchy.open 'https://gemjarhq.com/signup'
92
+ end
93
+
94
+ private
95
+
96
+ def config
97
+ File.join(Gem.user_home, '.gem', 'gemjar')
98
+ end
99
+
100
+ def with_rescue(&block)
101
+ block.call
102
+ rescue RestClient::NotAcceptable => e
103
+ puts JSON.parse(e.response)['error_message'].red
104
+ rescue RestClient::Unauthorized
105
+ auth_logout
106
+ @highline.say "\n\n-------------------\nLooks like your login session wasnt valid\n\n"
107
+ authenticate_session
108
+ end
109
+
110
+ def authenticate_session
111
+ with_rescue do
112
+ highline = HighLine.new
113
+ puts "Please log in to continue..\n\n"
114
+ email = highline.ask("Email Address:")
115
+ password = highline.ask("Password:") { |q| q.echo = false }
116
+ api_key = RestClient.post("#{GemJar.endpoint}/authentications",
117
+ :email => email,
118
+ :password => password
119
+ )
120
+ add_file config, api_key, :verbose => false
121
+ return api_key
122
+ end
123
+ end
124
+
125
+ def client
126
+ api_key = File.open(config).read rescue authenticate_session
127
+ GemJar.configure do |config|
128
+ config.api_key = api_key
129
+ end
130
+ @client ||= GemJar::Client.new
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,12 @@
1
+ module GemJar
2
+ class Client
3
+
4
+ def users
5
+ @users ||= GemJar::Resource::User
6
+ end
7
+
8
+ def rubygems
9
+ @users ||= GemJar::Resource::Rubygem
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ module GemJar
2
+ module Resource
3
+ autoload :Base, 'gemjar/resource/base'
4
+ autoload :User, 'gemjar/resource/user'
5
+ autoload :Rubygem, 'gemjar/resource/rubygem'
6
+ end
7
+ end
@@ -0,0 +1,29 @@
1
+ require 'rest_client'
2
+ require 'json'
3
+
4
+ class GemJar::Resource::Base
5
+
6
+ class << self
7
+ def resource(resource)
8
+ @resource = resource
9
+ @rest = RestClient::Resource.new(
10
+ GemJar.endpoint,
11
+ :user => 'x',
12
+ :password => GemJar.api_key
13
+ )
14
+ end
15
+
16
+ def all
17
+ JSON.parse @rest[@resource].get(:accept => :json)
18
+ end
19
+
20
+ def create(opts)
21
+ @rest[@resource].post opts.merge(:accept => :json)
22
+ end
23
+
24
+ def destroy(id)
25
+ path = [@resource, id].join('/')
26
+ @rest[path].delete
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,3 @@
1
+ class GemJar::Resource::Rubygem < GemJar::Resource::Base
2
+ resource :rubygems
3
+ end
@@ -0,0 +1,3 @@
1
+ class GemJar::Resource::User < GemJar::Resource::Base
2
+ resource :users
3
+ end
@@ -0,0 +1,4 @@
1
+ module GemJar
2
+ GEM_VERSION = '0.0.1'
3
+ API_VERSION = 'v1'
4
+ end
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gemjar
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - George Drummond
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-01-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rest-client
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.6.7
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.6.7
30
+ - !ruby/object:Gem::Dependency
31
+ name: json
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - '='
36
+ - !ruby/object:Gem::Version
37
+ version: 1.7.6
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - '='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.7.6
46
+ - !ruby/object:Gem::Dependency
47
+ name: thor
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - '='
52
+ - !ruby/object:Gem::Version
53
+ version: 0.16.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.16.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: smart_colored
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - '='
68
+ - !ruby/object:Gem::Version
69
+ version: 1.1.1
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - '='
76
+ - !ruby/object:Gem::Version
77
+ version: 1.1.1
78
+ - !ruby/object:Gem::Dependency
79
+ name: launchy
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - '='
84
+ - !ruby/object:Gem::Version
85
+ version: 2.1.2
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - '='
92
+ - !ruby/object:Gem::Version
93
+ version: 2.1.2
94
+ - !ruby/object:Gem::Dependency
95
+ name: highline
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - '='
100
+ - !ruby/object:Gem::Version
101
+ version: 1.6.15
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - '='
108
+ - !ruby/object:Gem::Version
109
+ version: 1.6.15
110
+ description: Official GemJar HQ RubyGem.
111
+ email:
112
+ - georgedrummond@gmail.com
113
+ executables:
114
+ - gemjar
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - .gitignore
119
+ - Gemfile
120
+ - LICENSE.txt
121
+ - README.md
122
+ - Rakefile
123
+ - bin/gemjar
124
+ - gemjar.gemspec
125
+ - lib/gemjar.rb
126
+ - lib/gemjar/cli.rb
127
+ - lib/gemjar/client.rb
128
+ - lib/gemjar/resource.rb
129
+ - lib/gemjar/resource/base.rb
130
+ - lib/gemjar/resource/rubygem.rb
131
+ - lib/gemjar/resource/user.rb
132
+ - lib/gemjar/version.rb
133
+ homepage: https://gemjarhq.com
134
+ licenses: []
135
+ post_install_message:
136
+ rdoc_options: []
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ! '>='
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ! '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ requirements: []
152
+ rubyforge_project:
153
+ rubygems_version: 1.8.24
154
+ signing_key:
155
+ specification_version: 3
156
+ summary: Official GemJar HQ RubyGem.
157
+ test_files: []
158
+ has_rdoc: