octonaut 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -6,15 +6,15 @@ A little CLI sugar for the GitHub API, built with [gli][] and [Octokit][].
6
6
 
7
7
  ### Why not `hub`?
8
8
 
9
- [hub][] is great, you should use it. But hub focuses mostly on smoothing the
9
+ [hub][] is great, you should use it; however, `hub` primarily focuses on smoothing the
10
10
  git workflow for GitHub and most commands are in the context of a GitHub
11
11
  repository.
12
12
 
13
- Octonaut is more general purpose CLI for the GitHub API. Oh and [plugins][].
13
+ Octonaut is a more general-purpose CLI for the GitHub API. Oh, and [plugins][].
14
14
 
15
15
  ### Installation
16
16
 
17
- Install via Rubygems:
17
+ Install via RubyGems:
18
18
 
19
19
  ```
20
20
  gem install octonaut
@@ -33,24 +33,32 @@ GLOBAL OPTIONS
33
33
  -a, --[no-]auto_traversal - Automatically fetch all pages of paginated results
34
34
  --help - Show this message
35
35
  -n, --[no-]netrc - Use .netrc file for authentication
36
+ --netrc-file=arg - .netrc file for authentication (default: none)
36
37
  -p, --password=arg - GitHub password (default: ********)
37
38
  -t, --oauth_token, --token=arg - GitHub API token (default: ********)
38
39
  -u, --login=arg - GitHub login (default: none)
39
40
 
40
41
  COMMANDS
41
- browse - Browse resource on github.com
42
- follow - Follow a user
43
- followers - View followers for a user
44
- following - View who a user is following
45
- follows - Check to see if a user follows another
46
- help - Shows a list of commands or help for one command
47
- langs, languages - Display languages for a repo
48
- me - View your profile
49
- repo, repository - Display details for a repository
50
- repos, repositories - List repositories for a user or organization
51
- say - An plugin method
52
- unfollow - Unfollow a user
53
- user, whois - View profile for a user
42
+ archive_link - Get repository tarball or zipball archive URL
43
+ authorize - Create and store an API token using username and password
44
+ browse - Browse resource on github.com
45
+ contents - Get repository contents
46
+ follow - Follow a user
47
+ followers - View followers for a user
48
+ following - View who a user is following
49
+ follows - Check to see if a user follows another
50
+ help - Shows a list of commands or help for one command
51
+ initconfig - Initialize the config file using current global options
52
+ langs, languages - Display languages for a repo
53
+ markdown, md - Convert markdown to HTML
54
+ me - View your profile
55
+ readme - View README for repository
56
+ repo, repository - Display details for a repository
57
+ repos, repositories - List repositories for a user or organization
58
+ scopes - List scopes for a token
59
+ tokens, authorizations - Manage tokens
60
+ unfollow - Unfollow a user
61
+ user, whois - View profile for a user
54
62
  ```
55
63
 
56
64
  View a user's profile:
@@ -123,13 +131,26 @@ $ octonaut unfollow pengwynn
123
131
  Unfollowed pengwynn.
124
132
  ```
125
133
 
134
+ Convert some markdown:
135
+ ```
136
+ $ octonaut markdown "# Header #"
137
+ <h1>Header</h1>
138
+ ```
139
+ Convert markdown using STDIN
140
+ ```
141
+ $ echo "Fixed in #3 " | be bin/octonaut markdown -c pengwynn/octonaut
142
+ <p>Fixed in <a href="https://github.com/pengwynn/octonaut/issues/3" class="issue-link" title="authorize command">#3</a> </p>"
143
+ ```
144
+
145
+ ... and [much more][commands].
146
+
126
147
  ## Extend with plugins
127
148
 
128
149
  Octonaut makes it simple to extend the CLI with new commands just by adding
129
150
  some Ruby files to `~/.octonaut/plugins`:
130
151
 
131
152
  ```
132
- $ cat ~/.octonaut/plugins/test.rb
153
+ $ cat ~/.octonaut_plugins/test.rb
133
154
  module Octonaut
134
155
 
135
156
  desc 'An plugin method'
@@ -141,6 +162,7 @@ module Octonaut
141
162
  end
142
163
  end
143
164
 
165
+ $ export OCTONAUT_PLUGINS_PATH=~./octonaut_plugins
144
166
  $ octonaut say "hello from plugins"
145
167
 
146
168
  MMM. .MMM
@@ -182,3 +204,4 @@ Copyright (c) 2013 Wynn Netherland. See [LICENSE][] for details.
182
204
  [t]: https://github.com/sferik/t
183
205
  [sferik]: https://github.com/sferik
184
206
  [LICENSE]: https://github.com/pengwynn/octonaut/blob/master/LICENSE.md
207
+ [commands]: https://github.com/pengwynn/octonaut/tree/master/lib/octonaut/commands
data/lib/octonaut.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'csv'
2
2
  require 'gli'
3
+ require 'highline/import'
3
4
  require 'launchy'
4
5
  require 'octokit'
5
6
  require 'octonaut/printer'
@@ -11,15 +12,31 @@ module Octonaut
11
12
  extend Octonaut::Printer
12
13
  extend Octonaut::Helpers
13
14
 
15
+ def self.config_path
16
+ path = if ENV['OCTONAUT_ENV'] == 'TEST'
17
+ 'tmp/fakehome'
18
+ else
19
+ ENV['HOME']
20
+ end
21
+
22
+ File.expand_path(File.join(path, '.octonaut'))
23
+ end
24
+
14
25
  program_desc 'Octokit-powered CLI for GitHub'
15
26
  commands_from 'octonaut/commands'
16
- commands_from File.join(ENV['HOME'], '.octonaut', 'plugins')
27
+ if plugins_path = ENV['OCTONAUT_PLUGINS_PATH']
28
+ commands_from File.expand_path(plugins_path)
29
+ end
17
30
 
31
+ config_file Octonaut.config_path
18
32
 
19
33
  desc 'Use .netrc file for authentication'
20
34
  default_value false
21
35
  switch [:n, :netrc]
22
36
 
37
+ desc '.netrc file for authentication'
38
+ flag "netrc-file"
39
+
23
40
  desc 'GitHub login'
24
41
  flag [:u, :login]
25
42
  desc 'GitHub password'
@@ -58,9 +75,20 @@ module Octonaut
58
75
  end
59
76
 
60
77
  def self.client(global, options)
61
- opts = global.merge(options).
78
+ opts = global
79
+ netrc_path = global.delete("netrc-file")
80
+ opts[:netrc] = netrc_path if netrc_path
81
+ # drop OAuth token if basic auth is present
82
+ if (opts['login'] && opts['password']) || opts[:netrc]
83
+ %w(t token oauth_token).each do |k|
84
+ opts.delete(k)
85
+ opts.delete(k.to_sym)
86
+ end
87
+ end
88
+ opts.merge!(options).
62
89
  select {|k, v| Octokit::Configuration::VALID_OPTIONS_KEYS.include?(k) }
63
90
  Octokit::Client.new(opts)
64
91
  end
65
92
 
93
+
66
94
  end
@@ -0,0 +1,54 @@
1
+ module Octonaut
2
+
3
+ desc "Create and store an API token using username and password"
4
+ command :authorize do |c|
5
+ c.action do |global,options,args|
6
+ username = ask("GitHub username: ")
7
+ password = ask("Enter your password: ") { |q| q.echo = false }
8
+
9
+ client = Octokit::Client.new :login => username, :password => password
10
+ authorization = client.create_authorization :scopes => []
11
+
12
+ if File.readable?(Octonaut.config_path)
13
+ config = YAML::load_file(Octonaut.config_path)
14
+ File.open(Octonaut.config_path, 'w') do |out|
15
+ %w(t token oauth_token).each do |key|
16
+ config.delete(key)
17
+ config.delete(key.to_sym)
18
+ end
19
+ config[:t] = authorization.token
20
+ YAML.dump(config, out)
21
+ end
22
+ else
23
+ Octonaut.run ["-t", authorization.token, "initconfig"]
24
+ end
25
+ end
26
+ end
27
+
28
+ desc "Manage tokens"
29
+ command [:tokens, :authorizations] do |c|
30
+ c.default_command :ls
31
+
32
+ c.desc "List GitHub API tokens"
33
+ c.command [:ls, :list] do |ls|
34
+ ls.action do |global,options,args|
35
+ raise ArgumentError.new "Basic Authentication required" unless @client.authenticated?
36
+
37
+ ls_tokens @client.authorizations
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ desc "List scopes for a token"
44
+ arg_name "token"
45
+ command :scopes do |c|
46
+ c.action do |global,options,args|
47
+ token = args.shift
48
+
49
+ raise ArgumentError.new "Token required" unless token
50
+
51
+ puts (Octokit.scopes(token).join(', '))
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,70 @@
1
+ module Octonaut
2
+
3
+ desc "View README for repository"
4
+ arg_name "repo"
5
+ command :readme do |c|
6
+ c.desc "Output format"
7
+ c.flag [:f, :format]
8
+ c.desc "Ref (branch name or commit SHA)"
9
+ c.flag [:ref]
10
+ c.action do |global,options,args|
11
+
12
+ repo = args.shift
13
+ raise ArgumentError.new "Repository required" if repo.nil?
14
+
15
+ format = options[:f] || "raw"
16
+
17
+ opts = {}
18
+ opts[:ref] = options[:ref] if options[:ref]
19
+ opts[:accept] = "application/vnd.github.#{format}"
20
+
21
+ puts @client.readme repo, opts
22
+ end
23
+
24
+ end
25
+
26
+ desc "Get repository contents"
27
+ arg_name "repo"
28
+ arg_name "path"
29
+ command :contents do |c|
30
+ c.desc "Output format"
31
+ c.flag [:f, :format]
32
+ c.desc "Ref (branch name or commit SHA)"
33
+ c.flag [:ref]
34
+ c.action do |global,options,args|
35
+
36
+ repo = args.shift
37
+ raise ArgumentError.new "Repository required" if repo.nil?
38
+
39
+ format = options[:f] || "raw"
40
+
41
+ opts = {}
42
+ opts[:ref] = options[:ref] if options[:ref]
43
+ opts[:path] = args.shift
44
+ opts[:accept] = "application/vnd.github.#{format}"
45
+
46
+ puts @client.contents repo, opts
47
+ end
48
+ end
49
+
50
+ desc "Get repository tarball or zipball archive URL"
51
+ arg_name "repo"
52
+ command :archive_link do |c|
53
+ c.desc "Archive format"
54
+ c.default_value "tar"
55
+ c.flag [:f, :format]
56
+ c.desc "Ref (branch name or commit SHA)"
57
+ c.default_value "master"
58
+ c.flag [:ref]
59
+ c.action do |global,options,args|
60
+
61
+ repo = args.shift
62
+ raise ArgumentError.new "Repository required" if repo.nil?
63
+
64
+ opts = {}
65
+ opts[:format] = "#{options[:format]}ball"
66
+ opts[:ref] = options[:ref]
67
+ print @client.archive_link repo, opts
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,33 @@
1
+ require 'json'
2
+
3
+ module Octonaut
4
+
5
+ desc "Convert markdown to HTML"
6
+ arg_name 'string'
7
+ command [:markdown, :md] do |c|
8
+ MODE_OPTS = %w(gfm markdown)
9
+ c.desc "Render markdown in plain 'markdown' or 'gfm'"
10
+ c.default_value 'gfm'
11
+ c.flag [:m, :mode]
12
+
13
+ c.desc "The repository context for 'gfm' mode"
14
+ c.flag [:c, :context]
15
+
16
+ c.action do |global,options,args|
17
+ raise ArgumentError.new "Valid mode options are #{MODE_OPTS.join(', ')}" unless MODE_OPTS.include? options[:mode]
18
+
19
+ src = args.shift
20
+ src = $stdin.gets if src.nil?
21
+ opts = {}
22
+ if mode = options.fetch(:mode, nil)
23
+ opts[:mode] = mode
24
+ end
25
+ if context = options.fetch(:context, nil)
26
+ opts[:context] = context
27
+ end
28
+ response = @client.markdown src, opts
29
+
30
+ puts response
31
+ end
32
+ end
33
+ end
@@ -1,11 +1,13 @@
1
+ require 'octonaut/printers/authorizations'
1
2
  require 'octonaut/printers/organizations'
2
3
  require 'octonaut/printers/users'
3
4
  require 'octonaut/printers/repositories'
4
5
 
5
6
  module Octonaut
6
7
  module Printer
7
- include Octonaut::Printers::Users
8
+ include Octonaut::Printers::Authorizations
8
9
  include Octonaut::Printers::Repositories
10
+ include Octonaut::Printers::Users
9
11
 
10
12
  def print_table(data)
11
13
  data.each { | key, value | puts "#{key.rjust(data.keys.map(&:length).max)} #{value}" }
@@ -0,0 +1,11 @@
1
+ module Octonaut
2
+ module Printers
3
+ module Authorizations
4
+
5
+ def ls_authorizations(authorizations, options = {})
6
+ authorizations.each {|a| puts "#{a.token} #{a.scopes.join(',')} #{a.app.name}" }
7
+ end
8
+ alias_method :ls_tokens, :ls_authorizations
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module Octonaut
2
- VERSION = '0.0.2'
2
+ VERSION = '0.1.0'
3
3
  end
data/octonaut.gemspec CHANGED
@@ -19,7 +19,8 @@ spec = Gem::Specification.new do |s|
19
19
  s.executables << 'octonaut'
20
20
  s.add_dependency('gli','~> 2.5.5')
21
21
  s.add_dependency('octokit', '~> 1.22.0')
22
- s.add_dependency('launchy')
22
+ s.add_dependency('launchy', '~> 2.2.0')
23
+ s.add_dependency('highline', '~> 1.6.15')
23
24
  s.add_development_dependency('rake')
24
25
  s.add_development_dependency('rdoc')
25
26
  s.add_development_dependency('guard-cucumber')
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe Octonaut do
4
+
5
+ context "authorizations" do
6
+
7
+ it "lists tokens" do
8
+ request = stub_get("https://defunkt:il0veruby@api.github.com/authorizations").
9
+ to_return(json_response("tokens.json"))
10
+
11
+ Octonaut.run %w(-u defunkt -p il0veruby tokens)
12
+
13
+ expect($stdout.string).to eq(fixture('tokens.ls').read)
14
+ end
15
+
16
+ it "displays scopes for a token" do
17
+
18
+ request = stub_get("https://@api.github.com/user").
19
+ with(:headers => {"Authorization" => "token e46e749d1c727ff18b7fa403e924e58407fd9ac7"}).
20
+ to_return(json_response("user.json", {"X-OAuth-Scopes" => "repo, user"}))
21
+
22
+ Octonaut.run %w(scopes e46e749d1c727ff18b7fa403e924e58407fd9ac7 )
23
+
24
+ expect($stdout.string).to include("repo, user")
25
+
26
+ end
27
+
28
+ xit "creates a token" do
29
+ request = stub_post("https://defunkt:il0veruby@api.github.com/authorizations").
30
+ with(:body => {"scopes" => ["repo", "user"]}).
31
+ to_return(json_response("token.json"))
32
+
33
+
34
+ Octonaut.run %w(-u defunkt -p il0veruby tokens create -s repo user)
35
+ expect($stdout.string).to include("e46e749d1c727ff18b7fa403e924e58407fd9ac7")
36
+ end
37
+
38
+ xit "updates a token" do
39
+ # wait on hypermedia Octokit
40
+ end
41
+
42
+ xit "deletes a token" do
43
+ # wait on hypermedia Octokit
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe Octonaut do
4
+
5
+ context "contents" do
6
+
7
+ it "displays the src for a README" do
8
+ request = stub_get("/repos/pengwynn/octonaut/readme").
9
+ to_return(:headers => {"Content-Type" => "application/vnd.github.raw; charset=utf-8"},
10
+ :body => fixture("readme.src"))
11
+
12
+ Octonaut.run %w(readme pengwynn/octonaut)
13
+
14
+ expect(request).to have_been_made
15
+ expect($stdout.string).to eq(fixture('readme.src').read)
16
+ end
17
+
18
+ it "displays a rendered README in HTML" do
19
+ request = stub_get("/repos/pengwynn/octonaut/readme").
20
+ to_return(:headers => {"Content-Type" => "application/vnd.github.html; charset=utf-8"},
21
+ :body => fixture("readme.html"))
22
+
23
+ Octonaut.run %w(readme -f html pengwynn/octonaut)
24
+
25
+ expect(request).to have_been_made
26
+ expect($stdout.string).to eq(fixture('readme.html').read)
27
+ end
28
+
29
+ it "renders a README on a ref" do
30
+ Octokit::Client.any_instance.should_receive(:readme).
31
+ with("pengwynn/octonaut", :ref => "some-branch", :accept => "application/vnd.github.html")
32
+
33
+ Octonaut.run %w(readme -f html --ref some-branch pengwynn/octonaut)
34
+ end
35
+
36
+ xit "renders a directory tree of repository contents" do
37
+ # need more smarts in Octokit for this
38
+ end
39
+
40
+ it "gets contents of a file" do
41
+ request = stub_get("/repos/pengwynn/octonaut/contents/README.md").
42
+ to_return(:headers => {"Content-Type" => "application/vnd.github.raw; charset=utf-8"},
43
+ :body => fixture("readme.src"))
44
+
45
+ Octonaut.run %w(contents pengwynn/octonaut README.md)
46
+
47
+ expect(request).to have_been_made
48
+ expect($stdout.string).to eq(fixture('readme.src').read)
49
+ end
50
+
51
+ it "gets an archive link" do
52
+ url = "https://nodeload.github.com/pengwynn/octonaut/legacy.zip/master"
53
+ Octokit::Client.any_instance.should_receive(:archive_link).
54
+ with("pengwynn/octonaut", :format => "zipball", :ref => "master").
55
+ and_return(url)
56
+
57
+ Octonaut.run %w(archive_link -f zip pengwynn/octonaut)
58
+ expect($stdout.string).to eq(url)
59
+
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1 @@
1
+ <h1>Test</h1>
@@ -0,0 +1,2 @@
1
+ <h1>
2
+ <a name="test" class="anchor" href="#test"><span class="mini-icon mini-icon-link"></span></a>Test</h1>
@@ -0,0 +1,187 @@
1
+ <div class="announce instapaper_body md" data-path="README.md" id="readme"><article class="markdown-body entry-content" itemprop="mainContentOfPage"><h1>
2
+ <a name="octonaut" class="anchor" href="#octonaut"><span class="mini-icon mini-icon-link"></span></a>Octonaut</h1>
3
+
4
+ <p>A little CLI sugar for the GitHub API, built with <a href="https://github.com/davetron5000/gli">gli</a> and <a href="https://github.com/pengwynn/octokit">Octokit</a>.</p>
5
+
6
+ <p><strong>Still early. Rapidly evolving.</strong> Why not <a href="https://github.com/pengwynn/octonaut/blob/master/CONTRIBUTING.md">help out</a>?</p>
7
+
8
+ <h3>
9
+ <a name="why-not-hub" class="anchor" href="#why-not-hub"><span class="mini-icon mini-icon-link"></span></a>Why not <code>hub</code>?</h3>
10
+
11
+ <p><a href="https://github.com/defunkt/hub">hub</a> is great, you should use it; however, <code>hub</code> primarily focuses on smoothing the
12
+ git workflow for GitHub and most commands are in the context of a GitHub
13
+ repository.</p>
14
+
15
+ <p>Octonaut is a more general-purpose CLI for the GitHub API. Oh, and <a href="#extend-with-plugins">plugins</a>.</p>
16
+
17
+ <h3>
18
+ <a name="installation" class="anchor" href="#installation"><span class="mini-icon mini-icon-link"></span></a>Installation</h3>
19
+
20
+ <p>Install via RubyGems:</p>
21
+
22
+ <pre><code>gem install octonaut
23
+ </code></pre>
24
+
25
+ <h3>
26
+ <a name="example-usage" class="anchor" href="#example-usage"><span class="mini-icon mini-icon-link"></span></a>Example usage</h3>
27
+
28
+ <pre><code>$ octonaut
29
+ NAME
30
+ octonaut - Octokit-powered CLI for GitHub
31
+
32
+ SYNOPSIS
33
+ octonaut [global options] command [command options] [arguments...]
34
+
35
+ GLOBAL OPTIONS
36
+ -a, --[no-]auto_traversal - Automatically fetch all pages of paginated results
37
+ --help - Show this message
38
+ -n, --[no-]netrc - Use .netrc file for authentication
39
+ --netrc-file=arg - .netrc file for authentication (default: none)
40
+ -p, --password=arg - GitHub password (default: ********)
41
+ -t, --oauth_token, --token=arg - GitHub API token (default: ********)
42
+ -u, --login=arg - GitHub login (default: none)
43
+
44
+ COMMANDS
45
+ browse - Browse resource on github.com
46
+ follow - Follow a user
47
+ followers - View followers for a user
48
+ following - View who a user is following
49
+ follows - Check to see if a user follows another
50
+ help - Shows a list of commands or help for one command
51
+ initconfig - Initialize the config file using current global options
52
+ langs, languages - Display languages for a repo
53
+ me - View your profile
54
+ repo, repository - Display details for a repository
55
+ repos, repositories - List repositories for a user or organization
56
+ unfollow - Unfollow a user
57
+ user, whois - View profile for a user
58
+ </code></pre>
59
+
60
+ <p>View a user's profile:</p>
61
+
62
+ <pre><code>$ octonaut whois cloudhead
63
+ ID 40774
64
+ JOINED 2008-12-16T15:09:49Z
65
+ LOGIN cloudhead
66
+ NAME Alexis Sellier
67
+ COMPANY SoundCloud, Ltd.
68
+ LOCATION Berlin
69
+ FOLLOWERS 2347
70
+ FOLLOWING 48
71
+ HIREABLE true
72
+ URL http://twitter.com/cloudhead
73
+ </code></pre>
74
+
75
+ <p>Browse a user on github.com in your default browser:</p>
76
+
77
+ <pre><code>$ octonaut browse cloudhead
78
+ </code></pre>
79
+
80
+ <p>List followers:</p>
81
+
82
+ <pre><code>$ octonaut followers pengwynn
83
+ krisbulman
84
+ camdub
85
+ cglee
86
+ nextmat
87
+ zachinglis
88
+ seaofclouds
89
+ njonsson
90
+ davidnorth
91
+ polomasta
92
+ webiest
93
+ mchelen
94
+ brogers
95
+ marclove
96
+ adamstac
97
+ marshall
98
+ asenchi
99
+ piyush
100
+ rmetzler
101
+ nileshtrivedi
102
+ sferik
103
+ jimmybaker
104
+ jnunemaker
105
+ peterberkenbosch
106
+ leah
107
+ jakestutzman
108
+ nkabbara
109
+ etagwerker
110
+ vagostino
111
+ johan--
112
+ bry4n
113
+ ...
114
+ </code></pre>
115
+
116
+ <p>Follow a user:</p>
117
+
118
+ <pre><code>$ octonaut follow linus
119
+ Followed linus.
120
+ </code></pre>
121
+
122
+ <p>Unfollow a user:</p>
123
+
124
+ <pre><code>$ octonaut unfollow pengwynn
125
+ Unfollowed pengwynn.
126
+ </code></pre>
127
+
128
+ <p>Convert some markdown:</p>
129
+
130
+ <pre><code>$ octonaut markdown "# Header #"
131
+ &lt;h1&gt;Header&lt;/h1&gt;
132
+ </code></pre>
133
+
134
+ <h2>
135
+ <a name="extend-with-plugins" class="anchor" href="#extend-with-plugins"><span class="mini-icon mini-icon-link"></span></a>Extend with plugins</h2>
136
+
137
+ <p>Octonaut makes it simple to extend the CLI with new commands just by adding
138
+ some Ruby files to <code>~/.octonaut/plugins</code>:</p>
139
+
140
+ <pre><code>$ cat ~/.octonaut_plugins/test.rb
141
+ module Octonaut
142
+
143
+ desc 'An plugin method'
144
+ arg_name 'text'
145
+ command :say do |c|
146
+ c.action do |global,options,args|
147
+ puts @client.say args.shift
148
+ end
149
+ end
150
+ end
151
+
152
+ $ export OCTONAUT_PLUGINS_PATH=~./octonaut_plugins
153
+ $ octonaut say "hello from plugins"
154
+
155
+ MMM. .MMM
156
+ MMMMMMMMMMMMMMMMMMM
157
+ MMMMMMMMMMMMMMMMMMM ____________________
158
+ MMMMMMMMMMMMMMMMMMMMM | |
159
+ MMMMMMMMMMMMMMMMMMMMMMM | hello from plugins |
160
+ MMMMMMMMMMMMMMMMMMMMMMMM |_ ________________|
161
+ MMMM::- -:::::::- -::MMMM |/
162
+ MM~:~ ~:::::~ ~:~MM
163
+ .. MMMMM::. .:::+:::. .::MMMMM ..
164
+ .MM::::: ._. :::::MM.
165
+ MMMM;:::::;MMMM
166
+ -MM MMMMMMM
167
+ ^ M+ MMMMMMMMM
168
+ MMMMMMM MM MM MM
169
+ MM MM MM MM
170
+ MM MM MM MM
171
+ .~~MM~MM~MM~MM~~.
172
+ ~~~~MM:~MM~~~MM~:MM~~~~
173
+ ~~~~~~==~==~~~==~==~~~~~~
174
+ ~~~~~~==~==~==~==~~~~~~
175
+ :~==~==~==~==~~
176
+ </code></pre>
177
+
178
+ <h2>
179
+ <a name="inspiration" class="anchor" href="#inspiration"><span class="mini-icon mini-icon-link"></span></a>Inspiration</h2>
180
+
181
+ <p>Octonaut is inspired by <a href="https://github.com/sferik/t"><code>t</code>, the awesome Twitter CLI</a> from <a href="https://github.com/sferik">Erik Michaels-Ober</a>.</p>
182
+
183
+ <h2>
184
+ <a name="copyright" class="anchor" href="#copyright"><span class="mini-icon mini-icon-link"></span></a>Copyright</h2>
185
+
186
+ <p>Copyright (c) 2013 Wynn Netherland. See <a href="https://github.com/pengwynn/octonaut/blob/master/LICENSE.md">LICENSE</a> for details.</p></article></div>
187
+
@@ -0,0 +1,192 @@
1
+ # Octonaut
2
+
3
+ A little CLI sugar for the GitHub API, built with [gli][] and [Octokit][].
4
+
5
+ **Still early. Rapidly evolving.** Why not [help out][contributing]?
6
+
7
+ ### Why not `hub`?
8
+
9
+ [hub][] is great, you should use it; however, `hub` primarily focuses on smoothing the
10
+ git workflow for GitHub and most commands are in the context of a GitHub
11
+ repository.
12
+
13
+ Octonaut is a more general-purpose CLI for the GitHub API. Oh, and [plugins][].
14
+
15
+ ### Installation
16
+
17
+ Install via RubyGems:
18
+
19
+ ```
20
+ gem install octonaut
21
+ ```
22
+
23
+ ### Example usage
24
+ ```
25
+ $ octonaut
26
+ NAME
27
+ octonaut - Octokit-powered CLI for GitHub
28
+
29
+ SYNOPSIS
30
+ octonaut [global options] command [command options] [arguments...]
31
+
32
+ GLOBAL OPTIONS
33
+ -a, --[no-]auto_traversal - Automatically fetch all pages of paginated results
34
+ --help - Show this message
35
+ -n, --[no-]netrc - Use .netrc file for authentication
36
+ --netrc-file=arg - .netrc file for authentication (default: none)
37
+ -p, --password=arg - GitHub password (default: ********)
38
+ -t, --oauth_token, --token=arg - GitHub API token (default: ********)
39
+ -u, --login=arg - GitHub login (default: none)
40
+
41
+ COMMANDS
42
+ browse - Browse resource on github.com
43
+ follow - Follow a user
44
+ followers - View followers for a user
45
+ following - View who a user is following
46
+ follows - Check to see if a user follows another
47
+ help - Shows a list of commands or help for one command
48
+ initconfig - Initialize the config file using current global options
49
+ langs, languages - Display languages for a repo
50
+ me - View your profile
51
+ repo, repository - Display details for a repository
52
+ repos, repositories - List repositories for a user or organization
53
+ unfollow - Unfollow a user
54
+ user, whois - View profile for a user
55
+ ```
56
+
57
+ View a user's profile:
58
+
59
+ ```
60
+ $ octonaut whois cloudhead
61
+ ID 40774
62
+ JOINED 2008-12-16T15:09:49Z
63
+ LOGIN cloudhead
64
+ NAME Alexis Sellier
65
+ COMPANY SoundCloud, Ltd.
66
+ LOCATION Berlin
67
+ FOLLOWERS 2347
68
+ FOLLOWING 48
69
+ HIREABLE true
70
+ URL http://twitter.com/cloudhead
71
+ ```
72
+
73
+ Browse a user on github.com in your default browser:
74
+
75
+ ```
76
+ $ octonaut browse cloudhead
77
+ ```
78
+
79
+ List followers:
80
+ ```
81
+ $ octonaut followers pengwynn
82
+ krisbulman
83
+ camdub
84
+ cglee
85
+ nextmat
86
+ zachinglis
87
+ seaofclouds
88
+ njonsson
89
+ davidnorth
90
+ polomasta
91
+ webiest
92
+ mchelen
93
+ brogers
94
+ marclove
95
+ adamstac
96
+ marshall
97
+ asenchi
98
+ piyush
99
+ rmetzler
100
+ nileshtrivedi
101
+ sferik
102
+ jimmybaker
103
+ jnunemaker
104
+ peterberkenbosch
105
+ leah
106
+ jakestutzman
107
+ nkabbara
108
+ etagwerker
109
+ vagostino
110
+ johan--
111
+ bry4n
112
+ ...
113
+ ```
114
+
115
+ Follow a user:
116
+ ```
117
+ $ octonaut follow linus
118
+ Followed linus.
119
+ ```
120
+
121
+ Unfollow a user:
122
+ ```
123
+ $ octonaut unfollow pengwynn
124
+ Unfollowed pengwynn.
125
+ ```
126
+
127
+ Convert some markdown:
128
+ ```
129
+ $ octonaut markdown "# Header #"
130
+ <h1>Header</h1>
131
+ ```
132
+
133
+ ## Extend with plugins
134
+
135
+ Octonaut makes it simple to extend the CLI with new commands just by adding
136
+ some Ruby files to `~/.octonaut/plugins`:
137
+
138
+ ```
139
+ $ cat ~/.octonaut_plugins/test.rb
140
+ module Octonaut
141
+
142
+ desc 'An plugin method'
143
+ arg_name 'text'
144
+ command :say do |c|
145
+ c.action do |global,options,args|
146
+ puts @client.say args.shift
147
+ end
148
+ end
149
+ end
150
+
151
+ $ export OCTONAUT_PLUGINS_PATH=~./octonaut_plugins
152
+ $ octonaut say "hello from plugins"
153
+
154
+ MMM. .MMM
155
+ MMMMMMMMMMMMMMMMMMM
156
+ MMMMMMMMMMMMMMMMMMM ____________________
157
+ MMMMMMMMMMMMMMMMMMMMM | |
158
+ MMMMMMMMMMMMMMMMMMMMMMM | hello from plugins |
159
+ MMMMMMMMMMMMMMMMMMMMMMMM |_ ________________|
160
+ MMMM::- -:::::::- -::MMMM |/
161
+ MM~:~ ~:::::~ ~:~MM
162
+ .. MMMMM::. .:::+:::. .::MMMMM ..
163
+ .MM::::: ._. :::::MM.
164
+ MMMM;:::::;MMMM
165
+ -MM MMMMMMM
166
+ ^ M+ MMMMMMMMM
167
+ MMMMMMM MM MM MM
168
+ MM MM MM MM
169
+ MM MM MM MM
170
+ .~~MM~MM~MM~MM~~.
171
+ ~~~~MM:~MM~~~MM~:MM~~~~
172
+ ~~~~~~==~==~~~==~==~~~~~~
173
+ ~~~~~~==~==~==~==~~~~~~
174
+ :~==~==~==~==~~
175
+ ```
176
+
177
+ ## Inspiration
178
+
179
+ Octonaut is inspired by [`t`, the awesome Twitter CLI][t] from [Erik Michaels-Ober][sferik].
180
+
181
+ ## Copyright
182
+
183
+ Copyright (c) 2013 Wynn Netherland. See [LICENSE][] for details.
184
+
185
+ [hub]: https://github.com/defunkt/hub
186
+ [gli]: https://github.com/davetron5000/gli
187
+ [octokit]: https://github.com/pengwynn/octokit
188
+ [plugins]: #extend-with-plugins
189
+ [contributing]: https://github.com/pengwynn/octonaut/blob/master/CONTRIBUTING.md
190
+ [t]: https://github.com/sferik/t
191
+ [sferik]: https://github.com/sferik
192
+ [LICENSE]: https://github.com/pengwynn/octonaut/blob/master/LICENSE.md
@@ -0,0 +1,16 @@
1
+ {
2
+ "id": 2,
3
+ "url": "http://api.github.dev/authorizations/2",
4
+ "app": {
5
+ "name": "GitHub API",
6
+ "url": "http://developer.github.com/v3/oauth/#oauth-authorizations-api"
7
+ },
8
+ "token": "e46e749d1c727ff18b7fa403e924e58407fd9ac7",
9
+ "note": null,
10
+ "note_url": null,
11
+ "created_at": "2013-03-19T14:05:27Z",
12
+ "updated_at": "2013-03-19T14:05:27Z",
13
+ "scopes": [
14
+ "repo"
15
+ ]
16
+ }
@@ -0,0 +1,50 @@
1
+ [
2
+ {
3
+ "id": 1,
4
+ "url": "http://api.github.dev/authorizations/1",
5
+ "app": {
6
+ "name": "GitHub API",
7
+ "url": "http://developer.github.com/v3/oauth/#oauth-authorizations-api"
8
+ },
9
+ "token": "dafefb71c1ad57481f14e5e201e1b3c196fe8664",
10
+ "note": null,
11
+ "note_url": null,
12
+ "created_at": "2013-03-08T22:22:46Z",
13
+ "updated_at": "2013-03-08T22:23:13Z",
14
+ "scopes": [
15
+
16
+ ]
17
+ },
18
+ {
19
+ "id": 2,
20
+ "url": "http://api.github.dev/authorizations/2",
21
+ "app": {
22
+ "name": "GitHub API",
23
+ "url": "http://developer.github.com/v3/oauth/#oauth-authorizations-api"
24
+ },
25
+ "token": "e46e749d1c727ff18b7fa403e924e58407fd9ac7",
26
+ "note": null,
27
+ "note_url": null,
28
+ "created_at": "2013-03-19T14:05:27Z",
29
+ "updated_at": "2013-03-19T14:05:27Z",
30
+ "scopes": [
31
+ "repo"
32
+ ]
33
+ },
34
+ {
35
+ "id": 3,
36
+ "url": "http://api.github.dev/authorizations/3",
37
+ "app": {
38
+ "name": "GitHub API",
39
+ "url": "http://developer.github.com/v3/oauth/#oauth-authorizations-api"
40
+ },
41
+ "token": "ba7d03e4d3ede4f62fc5667040da3513877e6c11",
42
+ "note": null,
43
+ "note_url": null,
44
+ "created_at": "2013-03-19T17:08:03Z",
45
+ "updated_at": "2013-03-19T17:08:03Z",
46
+ "scopes": [
47
+
48
+ ]
49
+ }
50
+ ]
@@ -0,0 +1,3 @@
1
+ dafefb71c1ad57481f14e5e201e1b3c196fe8664 GitHub API
2
+ e46e749d1c727ff18b7fa403e924e58407fd9ac7 repo GitHub API
3
+ ba7d03e4d3ede4f62fc5667040da3513877e6c11 GitHub API
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Octonaut do
4
+
5
+ context "markdown" do
6
+
7
+ it "renders gfm markdown" do
8
+ request = stub_post('/markdown').
9
+ to_return(:body => fixture('gfm.html'))
10
+
11
+ Octonaut.run ['markdown', '# Test #']
12
+ expect(request).to have_been_made
13
+ end
14
+
15
+ it "renders plain markdown" do
16
+ request = stub_post('/markdown').
17
+ to_return(:body => fixture('markdown.html').read)
18
+
19
+ Octonaut.run ['markdown', '# Test #', '-m', 'markdown']
20
+ expect(request).to have_been_made
21
+ end
22
+
23
+ it "takes input from STDIN" do
24
+
25
+ $stdin.should_receive(:gets).and_return("*foo*")
26
+ Octokit::Client.any_instance.
27
+ should_receive(:markdown).
28
+ with("*foo*", {:mode => "gfm"})
29
+
30
+ Octonaut.run ['markdown']
31
+
32
+ end
33
+
34
+ end
35
+ end
@@ -2,42 +2,28 @@ require 'spec_helper'
2
2
 
3
3
  describe Octonaut do
4
4
 
5
- before :each do
6
- @old_stderr = $stderr
7
- $stderr = StringIO.new
8
- @old_stdout = $stdout
9
- $stdout = StringIO.new
10
- end
11
-
12
- after :each do
13
- $stderr = @old_stderr
14
- $stdout = @old_stdout
15
- end
16
-
17
- context "with an empty config file" do
18
- before do
19
- FileUtils.rm_f Dir.glob(File.join(ENV['HOME'], '.octonaut'))
5
+ context "with config files" do
6
+ it "can init a config file" do
7
+ Octonaut.run %w(-t 123456 initconfig)
8
+ info = YAML::load_file(Octonaut.config_path)
9
+ expect(info['t']).to eq "123456"
20
10
  end
11
+ end
21
12
 
22
- after do
23
- FileUtils.rm_f Dir.glob(File.join(ENV['HOME'], '.octonaut'))
24
- end
13
+ context "plugins" do
14
+ it "finds plugins" do
15
+ Octonaut.run %w(foo)
25
16
 
26
- it "works" do
27
- expect(true).to be_true
17
+ expect($stdout.string).to include("bar")
28
18
  end
29
19
  end
30
20
 
31
21
  context "when authenticating" do
32
22
 
33
- before do
34
- FileUtils.cp File.join('spec', 'fixtures', '.netrc'), File.join(ENV['HOME'])
35
- end
36
-
37
23
  it "knows about .netrc info" do
38
24
  request = stub_get("https://defunkt:il0veruby@api.github.com/user").
39
25
  to_return(json_response("user.json"))
40
- Octonaut.run %w(-n me)
26
+ Octonaut.run %w(--netrc-file tmp/fakehome/.netrc me)
41
27
  expect(request).to have_been_made
42
28
  end
43
29
 
@@ -63,6 +49,54 @@ describe Octonaut do
63
49
  expect(request).to have_been_made
64
50
  end
65
51
 
52
+ context "when authorizing" do
53
+
54
+ it "can store a token for later" do
55
+ request = stub_post("https://defunkt:il0veruby@api.github.com/authorizations").
56
+ with(:body => {"scopes" => []}).
57
+ to_return(json_response("token.json"))
58
+
59
+ HighLine.any_instance.should_receive(:ask).
60
+ with("GitHub username: ").
61
+ and_return("defunkt")
62
+ HighLine.any_instance.should_receive(:ask).
63
+ with("Enter your password: ").
64
+ and_return("il0veruby")
65
+
66
+ Octonaut.run %w(authorize)
67
+
68
+ expect(request).to have_been_made
69
+ info = YAML::load_file(Octonaut.config_path)
70
+ expect(info['t']).to eq "e46e749d1c727ff18b7fa403e924e58407fd9ac7"
71
+ end
72
+
73
+ it "doesn't step on an existing config file" do
74
+ Octonaut.run %w(-u defunkt initconfig --force)
75
+ info = YAML::load_file(Octonaut.config_path)
76
+ expect(info['u']).to eq "defunkt"
77
+ expect(info['t']).to be_nil
78
+
79
+ request = stub_post("https://defunkt:il0veruby@api.github.com/authorizations").
80
+ with(:body => {"scopes" => []}).
81
+ to_return(json_response("token.json"))
82
+
83
+ HighLine.any_instance.should_receive(:ask).
84
+ with("GitHub username: ").
85
+ and_return("defunkt")
86
+ HighLine.any_instance.should_receive(:ask).
87
+ with("Enter your password: ").
88
+ and_return("il0veruby")
89
+
90
+ Octonaut.run %w(authorize)
91
+
92
+ expect(request).to have_been_made
93
+ info = YAML::load_file(Octonaut.config_path)
94
+ expect(info[:t]).to eq "e46e749d1c727ff18b7fa403e924e58407fd9ac7"
95
+ expect(info['u']).to eq "defunkt"
96
+ end
97
+
98
+ end
99
+
66
100
  end
67
101
 
68
102
  end
@@ -2,18 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe Octonaut do
4
4
 
5
- before :each do
6
- @old_stderr = $stderr
7
- $stderr = StringIO.new
8
- @old_stdout = $stdout
9
- $stdout = StringIO.new
10
- end
11
-
12
- after :each do
13
- $stderr = @old_stderr
14
- $stdout = @old_stdout
15
- end
16
-
17
5
  context "repositories" do
18
6
 
19
7
  it "displays repository information" do
data/spec/spec_helper.rb CHANGED
@@ -1,19 +1,26 @@
1
+ ENV['OCTONAUT_ENV'] = 'TEST'
2
+ ENV['OCTONAUT_PLUGINS_PATH'] = 'tmp/fakehome/plugins'
3
+
1
4
  RSpec.configure do |config|
2
5
  config.treat_symbols_as_metadata_keys_with_true_values = true
3
6
  config.order = 'random'
4
7
 
5
- config.before do
6
- unless ENV['CI']
7
- @original_home = ENV['HOME']
8
- new_home = File.expand_path("./tmp/fakehome")
9
- ENV['HOME'] = new_home
10
- end
8
+ config.before :each do
9
+ @old_stderr = $stderr
10
+ $stderr = StringIO.new
11
+ @old_stdout = $stdout
12
+ $stdout = StringIO.new
13
+ @old_stdin = $stdin
14
+ $stdin = StringIO.new
15
+ FileUtils.rm_f File.expand_path(Octonaut.config_path)
11
16
  end
12
17
 
13
- config.after do
14
- ENV['HOME'] = @original_home unless ENV['CI']
18
+ config.after :each do
19
+ $stderr = @old_stderr
20
+ $stdout = @old_stdout
21
+ $stdin = @old_stdin
22
+ FileUtils.rm_f File.expand_path(Octonaut.config_path)
15
23
  end
16
-
17
24
  end
18
25
 
19
26
  require 'octonaut'
@@ -72,12 +79,12 @@ def fixture(file)
72
79
  File.new(fixture_path + '/' + file)
73
80
  end
74
81
 
75
- def json_response(file)
82
+ def json_response(file, headers = {})
76
83
  {
77
84
  :body => fixture(file),
78
85
  :headers => {
79
86
  :content_type => 'application/json; charset=utf-8'
80
- }
87
+ }.merge(headers)
81
88
  }
82
89
  end
83
90
 
data/spec/users_spec.rb CHANGED
@@ -2,18 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe Octonaut do
4
4
 
5
- before :each do
6
- @old_stderr = $stderr
7
- $stderr = StringIO.new
8
- @old_stdout = $stdout
9
- $stdout = StringIO.new
10
- end
11
-
12
- after :each do
13
- $stderr = @old_stderr
14
- $stdout = @old_stdout
15
- end
16
-
17
5
  context "users" do
18
6
 
19
7
  it "looks up users by login" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: octonaut
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-03-18 00:00:00.000000000 Z
13
+ date: 2013-03-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: gli
@@ -49,17 +49,33 @@ dependencies:
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
- - - ! '>='
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 2.2.0
55
55
  type: :runtime
56
56
  prerelease: false
57
57
  version_requirements: !ruby/object:Gem::Requirement
58
58
  none: false
59
59
  requirements:
60
- - - ! '>='
60
+ - - ~>
61
61
  - !ruby/object:Gem::Version
62
- version: '0'
62
+ version: 2.2.0
63
+ - !ruby/object:Gem::Dependency
64
+ name: highline
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: 1.6.15
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: 1.6.15
63
79
  - !ruby/object:Gem::Dependency
64
80
  name: rake
65
81
  requirement: !ruby/object:Gem::Requirement
@@ -199,30 +215,43 @@ files:
199
215
  - LICENSE.md
200
216
  - Rakefile
201
217
  - octonaut.gemspec
218
+ - lib/octonaut/commands/authorizations.rb
202
219
  - lib/octonaut/commands/common.rb
220
+ - lib/octonaut/commands/contents.rb
221
+ - lib/octonaut/commands/markdown.rb
203
222
  - lib/octonaut/commands/repositories.rb
204
223
  - lib/octonaut/commands/users.rb
205
224
  - lib/octonaut/helpers.rb
206
225
  - lib/octonaut/printer.rb
226
+ - lib/octonaut/printers/authorizations.rb
207
227
  - lib/octonaut/printers/organizations.rb
208
228
  - lib/octonaut/printers/repositories.rb
209
229
  - lib/octonaut/printers/users.rb
210
230
  - lib/octonaut/version.rb
211
231
  - lib/octonaut.rb
212
232
  - bin/octonaut
233
+ - spec/authorizations_spec.rb
234
+ - spec/contents_spec.rb
235
+ - spec/fixtures/gfm.html
213
236
  - spec/fixtures/languages.json
214
237
  - spec/fixtures/languages.table
238
+ - spec/fixtures/markdown.html
239
+ - spec/fixtures/readme.html
240
+ - spec/fixtures/readme.src
215
241
  - spec/fixtures/repositories.json
216
242
  - spec/fixtures/repositories.ls
217
243
  - spec/fixtures/repository.json
244
+ - spec/fixtures/token.json
245
+ - spec/fixtures/tokens.json
246
+ - spec/fixtures/tokens.ls
218
247
  - spec/fixtures/user.json
219
248
  - spec/fixtures/users.json
220
249
  - spec/fixtures/users.ls
250
+ - spec/markdown_spec.rb
221
251
  - spec/octonaut_spec.rb
222
252
  - spec/repositories_spec.rb
223
253
  - spec/spec_helper.rb
224
254
  - spec/users_spec.rb
225
- - spec/fixtures/.netrc
226
255
  homepage: http://github.com/pengwynn
227
256
  licenses:
228
257
  - MIT
@@ -250,15 +279,24 @@ signing_key:
250
279
  specification_version: 3
251
280
  summary: CLI for GitHub
252
281
  test_files:
253
- - spec/fixtures/.netrc
282
+ - spec/authorizations_spec.rb
283
+ - spec/contents_spec.rb
284
+ - spec/fixtures/gfm.html
254
285
  - spec/fixtures/languages.json
255
286
  - spec/fixtures/languages.table
287
+ - spec/fixtures/markdown.html
288
+ - spec/fixtures/readme.html
289
+ - spec/fixtures/readme.src
256
290
  - spec/fixtures/repositories.json
257
291
  - spec/fixtures/repositories.ls
258
292
  - spec/fixtures/repository.json
293
+ - spec/fixtures/token.json
294
+ - spec/fixtures/tokens.json
295
+ - spec/fixtures/tokens.ls
259
296
  - spec/fixtures/user.json
260
297
  - spec/fixtures/users.json
261
298
  - spec/fixtures/users.ls
299
+ - spec/markdown_spec.rb
262
300
  - spec/octonaut_spec.rb
263
301
  - spec/repositories_spec.rb
264
302
  - spec/spec_helper.rb
data/spec/fixtures/.netrc DELETED
@@ -1,2 +0,0 @@
1
- machine api.github.com login defunkt password il0veruby
2
- machine api.github.dev login defunkt password il0veruby