octonaut 0.0.2 → 0.1.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/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