mygithub 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +18 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +98 -0
- data/Rakefile +8 -0
- data/bin/mygithub +5 -0
- data/lib/mygithub.rb +6 -0
- data/lib/mygithub/cli.rb +44 -0
- data/lib/mygithub/cli_core.rb +68 -0
- data/lib/mygithub/github_accessor.rb +67 -0
- data/lib/mygithub/milkode_accessor.rb +105 -0
- data/lib/mygithub/settings.rb +72 -0
- data/lib/mygithub/version.rb +3 -0
- data/lib/mygithub/web/app.rb +99 -0
- data/lib/mygithub/web/config.ru +5 -0
- data/lib/mygithub/web/views/index.haml +73 -0
- data/lib/mygithub/web/views/layout.haml +27 -0
- data/lib/mygithub/web/views/login.haml +36 -0
- data/lib/mygithub/web/views/mygithub.scss +7 -0
- data/mygithub.gemspec +26 -0
- data/test/data/.mygithub/mygithub.yaml +3 -0
- data/test/file_test_utils.rb +52 -0
- data/test/test_cli.rb +39 -0
- data/test/test_github_accessor.rb +39 -0
- data/test/test_helper.rb +3 -0
- data/test/test_settings.rb +42 -0
- metadata +145 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 ongaeshi
|
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,98 @@
|
|
1
|
+
# MyGithub
|
2
|
+
|
3
|
+
自分のGithubレポジトリのソースコードをオフラインで高速に検索。
|
4
|
+
|
5
|
+
![mygithub](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20130207/20130207000947_original.png)
|
6
|
+
|
7
|
+
- OAuthでGithubにログイン
|
8
|
+
- 全てのレポジトリをチェックアウト
|
9
|
+
- 検索用のインデックスを貼る
|
10
|
+
- [Milkode](http://milkode.ongaeshi.me/wiki/Main_Page)をバックエンドに使用
|
11
|
+
|
12
|
+
## Install
|
13
|
+
|
14
|
+
```
|
15
|
+
$ gem install mygithub
|
16
|
+
```
|
17
|
+
|
18
|
+
## Usage
|
19
|
+
|
20
|
+
```
|
21
|
+
$ mygithub
|
22
|
+
Tasks:
|
23
|
+
mygithub help [TASK] # Describe available tasks or one specific task
|
24
|
+
mygithub init # Init setting
|
25
|
+
mygithub update # Pull repositories
|
26
|
+
mygithub web # Startup web interface
|
27
|
+
```
|
28
|
+
|
29
|
+
## Setup
|
30
|
+
|
31
|
+
```
|
32
|
+
$ mygithub web
|
33
|
+
```
|
34
|
+
|
35
|
+
webアプリが起動したらGithubへの認証を通しましょう。
|
36
|
+
|
37
|
+
![login](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20130207/20130207000948_original.png)
|
38
|
+
|
39
|
+
ログイン後、レポジトリをチェックアウトするのでしばらく時間がかかります・・
|
40
|
+
|
41
|
+
![mygithub](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20130207/20130207000945_original.png)
|
42
|
+
|
43
|
+
この画面になればチェックアウト完了です、おめでとう!
|
44
|
+
|
45
|
+
- 自分が過去に書いた全てのソースからいつでも情報を引き出すことが可能です
|
46
|
+
- Milkodeベースの検索はとっても高速です *100000ファイル* 位なら1秒もかかりません。
|
47
|
+
- レポジトリをGithubに追加した時は *新しいレポジトリを取り込む* ボタンを押せば取り込めます
|
48
|
+
- ![github-button](https://raw.github.com/github/media/master/octocats/blacktocat-16.png) ボタンを押せば関連するGithubページにジャンプすることが出来ます
|
49
|
+
|
50
|
+
## Setup (Use command line)
|
51
|
+
|
52
|
+
Webアプリからの認証が上手く行かない時に。
|
53
|
+
|
54
|
+
```
|
55
|
+
$ mygithub init
|
56
|
+
Create -> /Users/ongaeshi/.mygithub/mygithub.yaml
|
57
|
+
Please edit YAML settings!
|
58
|
+
```
|
59
|
+
|
60
|
+
.yamlファイルにユーザー名と自身のGithubトークンを入力。
|
61
|
+
|
62
|
+
```yaml
|
63
|
+
---
|
64
|
+
username: ongaeshi
|
65
|
+
token: 12345678abcdefghijklmnopqrstuvwxyzj90909
|
66
|
+
```
|
67
|
+
|
68
|
+
updateコマンドを実行。
|
69
|
+
|
70
|
+
```
|
71
|
+
$ mygithub update
|
72
|
+
create : /Users/ongaeshi/.mygithub/database/milkode.yaml
|
73
|
+
create : /Users/ongaeshi/.mygithub/database/db/milkode.db created.
|
74
|
+
git : git://github.com/ongaeshi/HideFileToggle.git
|
75
|
+
Cloning into '/Users/ongaeshi/.mygithub/database/packages/git/HideFileToggle'...
|
76
|
+
.
|
77
|
+
.
|
78
|
+
```
|
79
|
+
|
80
|
+
webアプリ起動。
|
81
|
+
|
82
|
+
```
|
83
|
+
$ mygithub web
|
84
|
+
```
|
85
|
+
|
86
|
+
## Pow
|
87
|
+
一度認証が終われば[Pow](http://pow.cx/)経由で使うことが出来ます。例えば http://mygithub.dev でアクセス出来るようにするには以下をどうぞ。
|
88
|
+
|
89
|
+
```
|
90
|
+
ln -s /opt/local/lib/ruby1.9/gems/1.9.1/gems/mygithub-0.1.0/lib/mygithub/web mygithub
|
91
|
+
```
|
92
|
+
|
93
|
+
## Memo
|
94
|
+
- 認証時は必ず http://127.0.0.1:9295 でアクセスするようにして下さい
|
95
|
+
- opensslが正しくインストールされていてもSSL証明書が設置されていないとダウンロードに失敗します → [対策](http://qiita.com/items/12457815d5cee3723b97)
|
96
|
+
|
97
|
+
|
98
|
+
|
data/Rakefile
ADDED
data/bin/mygithub
ADDED
data/lib/mygithub.rb
ADDED
data/lib/mygithub/cli.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @file
|
4
|
+
# @brief
|
5
|
+
# @author ongaeshi
|
6
|
+
# @date 2013/02/02
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'thor'
|
10
|
+
require 'mygithub/cli_core'
|
11
|
+
require 'mygithub/settings'
|
12
|
+
|
13
|
+
module Mygithub
|
14
|
+
class CLI < Thor
|
15
|
+
desc "init", "Init setting"
|
16
|
+
option :no_save, :type => :boolean, :desc => 'No save.'
|
17
|
+
def init
|
18
|
+
CliCore.new.init(options)
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "update", "Pull repositories"
|
22
|
+
def update(*args)
|
23
|
+
CliCore.new.update(args, options)
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "web", "Startup web interface"
|
27
|
+
option :db, :default => Settings.default_database
|
28
|
+
option :host, :default => '127.0.0.1', :aliases => '-o'
|
29
|
+
option :port, :default => 9295, :aliases => '-p'
|
30
|
+
option :server, :default => 'thin', :aliases => '-s'
|
31
|
+
option :no_browser, :type => :boolean, :default => false, :aliases => '-n', :type => :boolean, :desc => 'Do not launch browser.'
|
32
|
+
option :customize, :type => :boolean, :desc => 'Create customize file.'
|
33
|
+
def web
|
34
|
+
CliCore.new.web(options)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @file
|
4
|
+
# @brief
|
5
|
+
# @author ongaeshi
|
6
|
+
# @date 2013/02/02
|
7
|
+
|
8
|
+
require 'mygithub/settings'
|
9
|
+
require 'milkode/cdstk/cdstk'
|
10
|
+
require 'milkode/cdweb/cli_cdweb'
|
11
|
+
require 'mygithub/github_accessor'
|
12
|
+
require 'milkode/cdstk/yaml_file_wrapper'
|
13
|
+
require 'mygithub/milkode_accessor'
|
14
|
+
|
15
|
+
module Mygithub
|
16
|
+
class CliCore
|
17
|
+
def initialize
|
18
|
+
@settings = Settings.new
|
19
|
+
@github = GithubAccessor.new @settings.username, @settings.token
|
20
|
+
@milk = MilkodeAccessor.new Settings.default_database
|
21
|
+
end
|
22
|
+
|
23
|
+
def init(options)
|
24
|
+
if (@settings.empty?)
|
25
|
+
@settings.save unless options[:no_save]
|
26
|
+
puts "Create -> #{Settings.default_filename}"
|
27
|
+
puts "Please edit YAML settings!"
|
28
|
+
else
|
29
|
+
puts "Already exists '#{Settings.default_filename}'."
|
30
|
+
puts "Please edit YAML settings!"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def update(args, options)
|
35
|
+
# initialize
|
36
|
+
@milk.init
|
37
|
+
@milk.create_milkweb_yaml(@github.avatar_url)
|
38
|
+
|
39
|
+
# Get repo_names
|
40
|
+
if args.empty?
|
41
|
+
names = @github.repo_names.map {|r| r.sub(@settings.username + '/', "")}
|
42
|
+
else
|
43
|
+
names = args
|
44
|
+
end
|
45
|
+
|
46
|
+
# update or add
|
47
|
+
add_repos = []
|
48
|
+
update_repos = []
|
49
|
+
|
50
|
+
names.each do |name|
|
51
|
+
unless @milk.exist? name
|
52
|
+
add_repos << "git://github.com/#{@settings.username}/#{name}.git"
|
53
|
+
else
|
54
|
+
update_repos << name
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
@milk.add add_repos unless add_repos.empty?
|
59
|
+
@milk.update update_repos unless update_repos.empty?
|
60
|
+
end
|
61
|
+
|
62
|
+
def web(options)
|
63
|
+
@milk.web(options)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @file
|
4
|
+
# @brief Githubへのアクセス
|
5
|
+
# @author ongaeshi
|
6
|
+
# @date 2013/02/02
|
7
|
+
|
8
|
+
require 'github_api'
|
9
|
+
require 'date'
|
10
|
+
|
11
|
+
module Mygithub
|
12
|
+
class GithubAccessor
|
13
|
+
attr_reader :token
|
14
|
+
|
15
|
+
def initialize(username, token)
|
16
|
+
@username = username
|
17
|
+
@token = token
|
18
|
+
|
19
|
+
@github = Github.new(:oauth_token => @token)
|
20
|
+
# @memo SSL証明書絡みでエラーが出たらこちら
|
21
|
+
# @github = Github.new do |config|
|
22
|
+
# config.endpoint = 'https://api.github.com/'
|
23
|
+
# config.user = username
|
24
|
+
# config.oauth_token = token # @memo 何故か'@token'にすると動かない
|
25
|
+
# config.adapter = :net_http
|
26
|
+
# config.ssl = {:verify => false}
|
27
|
+
# end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Repository
|
31
|
+
attr_accessor :pushed_at
|
32
|
+
|
33
|
+
def initialize(repo)
|
34
|
+
@repo = repo
|
35
|
+
@pushed_at = DateTime.parse(repo.pushed_at)
|
36
|
+
end
|
37
|
+
|
38
|
+
def full_name
|
39
|
+
@repo.full_name
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def repo_names
|
44
|
+
repos = []
|
45
|
+
page = 1
|
46
|
+
|
47
|
+
while (true)
|
48
|
+
r = @github.repos.list(:per_page => 100, :page => page).map {|r| Repository.new(r)}
|
49
|
+
break if r.empty?
|
50
|
+
repos += r
|
51
|
+
page += 1
|
52
|
+
end
|
53
|
+
|
54
|
+
repos.sort_by{|r| r.pushed_at}.map{|r| r.full_name}
|
55
|
+
end
|
56
|
+
|
57
|
+
def username
|
58
|
+
@username
|
59
|
+
end
|
60
|
+
|
61
|
+
def avatar_url
|
62
|
+
@github.users.get(username).avatar_url
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @file
|
4
|
+
# @brief Milkodeへのアクセス
|
5
|
+
# @author ongaeshi
|
6
|
+
# @date 2013/02/02
|
7
|
+
|
8
|
+
require 'milkode/cdstk/cdstk'
|
9
|
+
require 'milkode/cdweb/cli_cdweb'
|
10
|
+
require 'milkode/cdstk/yaml_file_wrapper'
|
11
|
+
require 'milkode/cdweb/lib/database'
|
12
|
+
|
13
|
+
module Mygithub
|
14
|
+
class MilkodeAccessor
|
15
|
+
attr_reader :dbdir
|
16
|
+
|
17
|
+
def initialize(dbdir)
|
18
|
+
@dbdir = dbdir
|
19
|
+
@cdstk = Milkode::Cdstk.new($stdout, @dbdir)
|
20
|
+
@yaml = YamlFileWrapper.load_if(@dbdir)
|
21
|
+
end
|
22
|
+
|
23
|
+
def init
|
24
|
+
unless File.exist? @dbdir
|
25
|
+
FileUtils.mkdir_p @dbdir
|
26
|
+
@cdstk.init({})
|
27
|
+
@yaml = YamlFileWrapper.load_if(@dbdir)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_milkweb_yaml(icon_url)
|
32
|
+
filename = File.join(@dbdir, 'milkweb.yaml')
|
33
|
+
|
34
|
+
File.open(filename, "w") do |f|
|
35
|
+
f.write <<EOF
|
36
|
+
---
|
37
|
+
:home_title : "MyGithub"
|
38
|
+
:home_icon : #{icon_url}
|
39
|
+
|
40
|
+
:header_title: "MyGithub"
|
41
|
+
:header_icon : #{icon_url}
|
42
|
+
|
43
|
+
:display_about_milkode: false
|
44
|
+
EOF
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def add(args)
|
49
|
+
@cdstk.add(args, {:same_add => true})
|
50
|
+
end
|
51
|
+
|
52
|
+
def update(args)
|
53
|
+
@cdstk.update(args, {})
|
54
|
+
end
|
55
|
+
|
56
|
+
def exist?(name)
|
57
|
+
!@yaml.find_name(name).nil?
|
58
|
+
end
|
59
|
+
|
60
|
+
def database_exitst?
|
61
|
+
@yaml && @yaml.contents.size > 0
|
62
|
+
end
|
63
|
+
|
64
|
+
def web(options)
|
65
|
+
opts = {
|
66
|
+
:environment => ENV['RACK_ENV'] || "development",
|
67
|
+
:pid => nil,
|
68
|
+
:Port => options[:port],
|
69
|
+
:Host => options[:host],
|
70
|
+
:AccessLog => [],
|
71
|
+
:config => "config.ru",
|
72
|
+
# ----------------------------
|
73
|
+
:server => options[:server],
|
74
|
+
:LaunchBrowser => !options[:no_browser],
|
75
|
+
:LaunchURL => database_exitst? ? nil : '/login',
|
76
|
+
:DbDir => options[:db],
|
77
|
+
}
|
78
|
+
|
79
|
+
# init
|
80
|
+
init
|
81
|
+
|
82
|
+
# open
|
83
|
+
@cdstk.assert_compatible
|
84
|
+
|
85
|
+
# Milkode::CLI_Cdweb.execute_with_options($stdout, opts)
|
86
|
+
cdweb_execute_with_options($stdout, opts)
|
87
|
+
end
|
88
|
+
|
89
|
+
# milkode/cdweb/cli_cdweb.rb:95
|
90
|
+
def cdweb_execute_with_options(stdout, options)
|
91
|
+
dbdir = File.expand_path(options[:DbDir])
|
92
|
+
|
93
|
+
# 使用するデータベースの位置設定
|
94
|
+
Milkode::Database.setup(dbdir)
|
95
|
+
|
96
|
+
# サーバースクリプトのある場所へ移動
|
97
|
+
FileUtils.cd(File.join File.dirname(__FILE__), 'web')
|
98
|
+
|
99
|
+
# Rackサーバー起動
|
100
|
+
Rack::Server.start(options)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @file
|
4
|
+
# @brief
|
5
|
+
# @author ongaeshi
|
6
|
+
# @date 2012/10/22
|
7
|
+
|
8
|
+
require 'yaml'
|
9
|
+
require 'fileutils'
|
10
|
+
|
11
|
+
module Mygithub
|
12
|
+
class Settings
|
13
|
+
def self.default_dir
|
14
|
+
File.expand_path('~/.mygithub')
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.default_filename
|
18
|
+
File.join default_dir, 'mygithub.yaml'
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.default_database
|
22
|
+
File.join default_dir, 'database'
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(filename = Settings.default_filename)
|
26
|
+
@filename = filename
|
27
|
+
|
28
|
+
if File.exist?(@filename)
|
29
|
+
open(@filename) do |f|
|
30
|
+
@data = YAML.load(f.read)
|
31
|
+
end
|
32
|
+
else
|
33
|
+
@data = {
|
34
|
+
'username' => '',
|
35
|
+
'token' => ''
|
36
|
+
}
|
37
|
+
@is_empty = true
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def save
|
42
|
+
FileUtils.mkdir_p File.dirname(@filename)
|
43
|
+
|
44
|
+
open(@filename, "w") do |f|
|
45
|
+
f.write YAML.dump(@data)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def username
|
50
|
+
@data['username']
|
51
|
+
end
|
52
|
+
|
53
|
+
def username=(username)
|
54
|
+
@data['username'] = username
|
55
|
+
end
|
56
|
+
|
57
|
+
def token
|
58
|
+
@data['token']
|
59
|
+
end
|
60
|
+
|
61
|
+
def token=(token)
|
62
|
+
@data['token'] = token
|
63
|
+
end
|
64
|
+
|
65
|
+
def empty?
|
66
|
+
!@is_empty.nil?
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @file
|
4
|
+
# @brief
|
5
|
+
# @author ongaeshi
|
6
|
+
# @date 2013/02/03
|
7
|
+
|
8
|
+
$LOAD_PATH.unshift '../..'
|
9
|
+
NO_REQUIRE_APP_ERROR = true
|
10
|
+
require 'milkode/cdweb/app'
|
11
|
+
require 'omniauth'
|
12
|
+
require 'omniauth-github'
|
13
|
+
require 'mygithub/settings'
|
14
|
+
require 'mygithub/cli_core'
|
15
|
+
require 'mygithub/settings'
|
16
|
+
require 'milkode/cdweb/lib/database'
|
17
|
+
|
18
|
+
# データベースは ~/.mygithub 固定
|
19
|
+
Milkode::Database.setup(Mygithub::Settings.default_database)
|
20
|
+
|
21
|
+
use Rack::Session::Cookie
|
22
|
+
use OmniAuth::Builder do
|
23
|
+
provider :github, '507d8ff7541315a61b21', '8a62747fc27f1570370669d5495afdfb4f86682f'
|
24
|
+
end
|
25
|
+
|
26
|
+
MY_VIEWS = File.dirname(__FILE__) + '/views'
|
27
|
+
|
28
|
+
class Sinatra::Base
|
29
|
+
# custom find_template from https://github.com/sinatra/sinatra/issues/48
|
30
|
+
def find_template(views, name, engine, &block)
|
31
|
+
[MY_VIEWS, views].each { |v| super(v, name, engine, &block) }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
get '/css/mygithub.css' do
|
36
|
+
scss :mygithub
|
37
|
+
end
|
38
|
+
|
39
|
+
get '/login' do
|
40
|
+
@setting = WebSetting.new
|
41
|
+
haml :login, :layout => false
|
42
|
+
end
|
43
|
+
|
44
|
+
get '/auth/github/callback' do
|
45
|
+
auth = request.env['omniauth.auth']
|
46
|
+
|
47
|
+
# Setup mygithub.yaml
|
48
|
+
settings = Mygithub::Settings.new
|
49
|
+
settings.username = auth.extra[:raw_info][:login]
|
50
|
+
settings.token = auth.credentials[:token]
|
51
|
+
settings.save
|
52
|
+
|
53
|
+
# Done
|
54
|
+
redirect '/update_all'
|
55
|
+
end
|
56
|
+
|
57
|
+
get '/update_all' do
|
58
|
+
# Update repositories
|
59
|
+
cli = Mygithub::CliCore.new
|
60
|
+
cli.update([], {})
|
61
|
+
|
62
|
+
# Reopen
|
63
|
+
Milkode::Database.instance.open
|
64
|
+
|
65
|
+
# Done
|
66
|
+
redirect '/'
|
67
|
+
end
|
68
|
+
|
69
|
+
require 'milkode/cdweb/app_error'
|
70
|
+
|
71
|
+
helpers do
|
72
|
+
def goto_github
|
73
|
+
settings = Mygithub::Settings.new
|
74
|
+
username = settings.username
|
75
|
+
"<a href='https://github.com/#{username}'>Goto Github : <img src='https://raw.github.com/github/media/master/octocats/blacktocat-32.png'></img></a>"
|
76
|
+
end
|
77
|
+
|
78
|
+
def goto_github_project(path)
|
79
|
+
return "" if (path == "")
|
80
|
+
|
81
|
+
image_href = 'https://raw.github.com/github/media/master/octocats/blacktocat-16.png'
|
82
|
+
|
83
|
+
settings = Mygithub::Settings.new
|
84
|
+
username = settings.username
|
85
|
+
|
86
|
+
paths = path.split('/')
|
87
|
+
|
88
|
+
if (paths.size == 1)
|
89
|
+
"<a href='https://github.com/#{username}/#{paths[0]}'><img src='#{image_href}'></img></a>"
|
90
|
+
else
|
91
|
+
"<a href='https://github.com/#{username}/#{paths[0]}/tree/master/#{paths[1..-1].join('/')}'><img src='#{image_href}'></img></a>"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# .search-summary に追加情報を表示したい時はこの関数をオーバーライド
|
96
|
+
def search_summary_hook(path)
|
97
|
+
goto_github_project(path)
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
!!!
|
2
|
+
|
3
|
+
-# layout.haml は使いません
|
4
|
+
|
5
|
+
%html(lang='ja')
|
6
|
+
%head
|
7
|
+
%meta(charset='utf-8')
|
8
|
+
%title= [@title, @setting.home_title].compact.join(' - ')
|
9
|
+
%link(rel="shortcut icon" href="#{@setting.favicon}")
|
10
|
+
%link(rel="stylesheet" href="/css/bootstrap.min.css" type="text/css" media="all")
|
11
|
+
%link(rel="stylesheet" href="/css/bootstrap-responsive.min.css" type="text/css" media="all")
|
12
|
+
%link(rel="stylesheet" href="/css/milkode.css" type="text/css" media="all")
|
13
|
+
%link(rel="stylesheet" href="/css/smoothness/jquery-ui-1.8.22.custom.css" type="text/css" media="all")
|
14
|
+
%link(rel="stylesheet" href="/css/jquery.multiselect.css" type="text/css" media="all")
|
15
|
+
%link(rel="stylesheet" href="/css/jquery.multiselect.filter.css" type="text/css" media="all")
|
16
|
+
%link(rel="stylesheet" href="/css/mygithub.css" type="text/css" media="all")
|
17
|
+
|
18
|
+
%body
|
19
|
+
.container#toppage
|
20
|
+
.row
|
21
|
+
.span10.offset2
|
22
|
+
%h1 <a href="/"><img src=#{@setting.home_icon} alt="milkode-icon" border="0" height="135px" /></a> #{@setting.home_title} <font class="version">#{@version}</font>
|
23
|
+
|
24
|
+
.row
|
25
|
+
.span6.offset6
|
26
|
+
%p
|
27
|
+
= goto_github
|
28
|
+
<br>
|
29
|
+
<a href="/home">#{@package_num}</a>のパッケージ<br>
|
30
|
+
<a href="/home?query=f:*">#{@file_num}</a>のファイル<br>
|
31
|
+
|
32
|
+
.span10.offset2
|
33
|
+
.form
|
34
|
+
%form(method="post" action="/search")
|
35
|
+
%input(name="query" type="text" style="width: 419px;")
|
36
|
+
%input(type="submit" value="検索")
|
37
|
+
%input(name='pathname' type='hidden' value='/home')
|
38
|
+
|
39
|
+
.row
|
40
|
+
.span4.offset4
|
41
|
+
#select_package
|
42
|
+
= create_select_package_home
|
43
|
+
|
44
|
+
.row
|
45
|
+
.span3
|
46
|
+
%h2 最近使った
|
47
|
+
= @package_list.top_view
|
48
|
+
.span3
|
49
|
+
%h2 追加
|
50
|
+
= @package_list.top_add
|
51
|
+
.span3
|
52
|
+
%h2 更新
|
53
|
+
= @package_list.top_update
|
54
|
+
.span3
|
55
|
+
%h2 お気に入り
|
56
|
+
= @package_list.top_fav
|
57
|
+
|
58
|
+
%hr
|
59
|
+
|
60
|
+
.row
|
61
|
+
.span4.offset4
|
62
|
+
.footer
|
63
|
+
<a href="/help">ヘルプ</a>
|
64
|
+
= @setting.about_milkode
|
65
|
+
|
66
|
+
.span4.offset4
|
67
|
+
<a href="/update_all">新しいレポジトリを取り込む</a>
|
68
|
+
|
69
|
+
%script(type='text/javascript' src='/js/jquery-1.7.2.min.js')
|
70
|
+
%script(type='text/javascript' src='/js/jquery-ui-1.8.22.custom.min.js')
|
71
|
+
%script(type='text/javascript' src='/js/jquery.multiselect.min.js')
|
72
|
+
%script(type='text/javascript' src='/js/jquery.multiselect.filter.min.js')
|
73
|
+
%script(type='text/javascript' src='/js/milkode.js')
|
@@ -0,0 +1,27 @@
|
|
1
|
+
!!!
|
2
|
+
|
3
|
+
%html(lang='ja')
|
4
|
+
%head
|
5
|
+
%meta(charset='utf-8')
|
6
|
+
%title= [@title, @setting.home_title].compact.join(' - ')
|
7
|
+
%link(rel="stylesheet" href="/css/bootstrap.min.css" type="text/css" media="all")
|
8
|
+
%link(rel="stylesheet" href="/css/bootstrap-responsive.min.css" type="text/css" media="all")
|
9
|
+
%link(rel="stylesheet" href="/css/milkode.css" type="text/css" media="all")
|
10
|
+
%link(rel="stylesheet" href="/css/coderay.css" type="text/css" media="all")
|
11
|
+
%link(rel="stylesheet" href="/css/coderay-patch.css" type="text/css" media="all")
|
12
|
+
%link(rel="stylesheet" href="/css/smoothness/jquery-ui-1.8.22.custom.css" type="text/css" media="all")
|
13
|
+
%link(rel="stylesheet" href="/css/jquery.multiselect.css" type="text/css" media="all")
|
14
|
+
%link(rel="stylesheet" href="/css/jquery.multiselect.filter.css" type="text/css" media="all")
|
15
|
+
%link(rel="stylesheet" href="/css/mygithub.css" type="text/css" media="all")
|
16
|
+
|
17
|
+
%body
|
18
|
+
.container-fluid#mainpage
|
19
|
+
!= yield
|
20
|
+
%script(type='text/javascript' src='/js/jquery-1.7.2.min.js')
|
21
|
+
%script(type='text/javascript' src='/js/jquery-ui-1.8.22.custom.min.js')
|
22
|
+
%script(type='text/javascript' src='/js/jquery.multiselect.min.js')
|
23
|
+
%script(type='text/javascript' src='/js/jquery.multiselect.filter.min.js')
|
24
|
+
%script(type='text/javascript' src='/js/bootstrap.min.js')
|
25
|
+
%script(type='text/javascript' src='/js/milkode.js')
|
26
|
+
|
27
|
+
-# GoogleAnalyticsを使いたい場合はここにコードを挿入して下さい。
|
@@ -0,0 +1,36 @@
|
|
1
|
+
!!!
|
2
|
+
|
3
|
+
-# layout.haml は使いません
|
4
|
+
|
5
|
+
%html(lang='ja')
|
6
|
+
%head
|
7
|
+
%meta(charset='utf-8')
|
8
|
+
%title= [@title, @setting.home_title].compact.join(' - ')
|
9
|
+
%link(rel="shortcut icon" href="#{@setting.favicon}")
|
10
|
+
%link(rel="stylesheet" href="/css/bootstrap.min.css" type="text/css" media="all")
|
11
|
+
%link(rel="stylesheet" href="/css/bootstrap-responsive.min.css" type="text/css" media="all")
|
12
|
+
%link(rel="stylesheet" href="/css/milkode.css" type="text/css" media="all")
|
13
|
+
%link(rel="stylesheet" href="/css/smoothness/jquery-ui-1.8.22.custom.css" type="text/css" media="all")
|
14
|
+
%link(rel="stylesheet" href="/css/jquery.multiselect.css" type="text/css" media="all")
|
15
|
+
%link(rel="stylesheet" href="/css/jquery.multiselect.filter.css" type="text/css" media="all")
|
16
|
+
%link(rel="stylesheet" href="/css/mygithub.css" type="text/css" media="all")
|
17
|
+
%link(rel="stylesheet" href="/css/auth-buttons.css" type="text/css" media="all")
|
18
|
+
|
19
|
+
%body
|
20
|
+
.container#toppage
|
21
|
+
.row
|
22
|
+
.span8.offset4
|
23
|
+
%h1 MyGithub
|
24
|
+
|
25
|
+
%hr
|
26
|
+
|
27
|
+
.row
|
28
|
+
.span8.offset4
|
29
|
+
%a(class="btn-auth btn-github large" href="/auth/github")
|
30
|
+
Sign in with <b>github</b>
|
31
|
+
|
32
|
+
%script(type='text/javascript' src='/js/jquery-1.7.2.min.js')
|
33
|
+
%script(type='text/javascript' src='/js/jquery-ui-1.8.22.custom.min.js')
|
34
|
+
%script(type='text/javascript' src='/js/jquery.multiselect.min.js')
|
35
|
+
%script(type='text/javascript' src='/js/jquery.multiselect.filter.min.js')
|
36
|
+
%script(type='text/javascript' src='/js/milkode.js')
|
@@ -0,0 +1,7 @@
|
|
1
|
+
body {
|
2
|
+
background-color: #f7f7f7;
|
3
|
+
background-image: url(data:image/png;base64,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);
|
4
|
+
|
5
|
+
}
|
6
|
+
|
7
|
+
|
data/mygithub.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 'mygithub/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "mygithub"
|
8
|
+
gem.version = Mygithub::VERSION
|
9
|
+
gem.authors = ["ongaeshi"]
|
10
|
+
gem.email = ["ongaeshi0621@gmail.com"]
|
11
|
+
gem.description = %q{Fast search in offline Github source code of its own.}
|
12
|
+
gem.summary = %q{Fast search in offline Github source code of its own.}
|
13
|
+
gem.homepage = ""
|
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 'thor', '~> 0.15.0'
|
21
|
+
gem.add_dependency 'rack', '~> 1.4.0'
|
22
|
+
gem.add_dependency 'milkode', '>= 0.9.8'
|
23
|
+
gem.add_dependency 'github_api'
|
24
|
+
gem.add_dependency 'omniauth'
|
25
|
+
gem.add_dependency 'omniauth-github'
|
26
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @file
|
4
|
+
# @brief ファイルテスト用ユーティリティ
|
5
|
+
# @author ongaeshi
|
6
|
+
# @date 2011/02/21
|
7
|
+
#
|
8
|
+
# 使い方:
|
9
|
+
#
|
10
|
+
# class TestCdstk < Test::Unit::TestCase
|
11
|
+
# include FileTestUtils
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# すると以下のことを自動でやってくれます
|
15
|
+
#
|
16
|
+
# 1. tmpディレクトリの作成
|
17
|
+
# 2. tmpディレクトリに移動
|
18
|
+
# 3. テスト実行
|
19
|
+
# 4. 元のディレクトリに戻る
|
20
|
+
# 5. tmpディレクトリの削除
|
21
|
+
#
|
22
|
+
|
23
|
+
require 'fileutils'
|
24
|
+
|
25
|
+
module FileTestUtils
|
26
|
+
def setup
|
27
|
+
create_tmp_dir
|
28
|
+
FileUtils.cd(@tmp_dir)
|
29
|
+
end
|
30
|
+
|
31
|
+
def teardown
|
32
|
+
teardown_custom(true)
|
33
|
+
end
|
34
|
+
|
35
|
+
def teardown_custom(is_remove_dir)
|
36
|
+
FileUtils.cd(@prev_dir)
|
37
|
+
FileUtils.rm_rf(@tmp_dir) if (is_remove_dir)
|
38
|
+
end
|
39
|
+
|
40
|
+
def tmp_path(path)
|
41
|
+
File.join @tmp_dir, path
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def create_tmp_dir
|
47
|
+
@prev_dir = Dir.pwd
|
48
|
+
@tmp_dir = File.join(File.dirname(__FILE__), "tmp")
|
49
|
+
FileUtils.rm_rf(@tmp_dir)
|
50
|
+
FileUtils.mkdir_p(@tmp_dir)
|
51
|
+
end
|
52
|
+
end
|
data/test/test_cli.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @file
|
4
|
+
# @brief
|
5
|
+
# @author ongaeshi
|
6
|
+
# @date 2013/02/02
|
7
|
+
|
8
|
+
require 'mygithub/cli.rb'
|
9
|
+
require 'test_helper'
|
10
|
+
|
11
|
+
module Mygithub
|
12
|
+
class TestCLI < Test::Unit::TestCase
|
13
|
+
def setup
|
14
|
+
$stdout = StringIO.new
|
15
|
+
@orig_stdout = $stdout
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
$stdout = @orig_stdout
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_no_arg
|
23
|
+
assert_match /Tasks:/, command("")
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_init
|
27
|
+
assert_match /mygithub.yaml/, command("init --no-save")
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def command(arg)
|
33
|
+
CLI.start(arg.split)
|
34
|
+
$stdout.string
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @file
|
4
|
+
# @brief
|
5
|
+
# @author ongaeshi
|
6
|
+
# @date 2012/10/15
|
7
|
+
|
8
|
+
require 'mygithub/github_accessor'
|
9
|
+
require 'mygithub/settings'
|
10
|
+
require 'test_helper'
|
11
|
+
|
12
|
+
module Mygithub
|
13
|
+
class TestGithubAccessor < Test::Unit::TestCase
|
14
|
+
def setup
|
15
|
+
# Need 'mygithub init'
|
16
|
+
@settings = Settings.new
|
17
|
+
assert_equal false, @settings.empty?
|
18
|
+
|
19
|
+
# Create GithubAccessor
|
20
|
+
@gh = GithubAccessor.new(@settings.username, @settings.token)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_token
|
24
|
+
assert_equal @settings.token, @gh.token
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_repo_names
|
28
|
+
assert_not_nil @gh.repo_names
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_username
|
32
|
+
assert_not_nil @gh.username
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_avatar_url
|
36
|
+
assert_not_nil @gh.avatar_url
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @file
|
4
|
+
# @brief
|
5
|
+
# @author ongaeshi
|
6
|
+
# @date 2013/02/02
|
7
|
+
|
8
|
+
require 'mygithub/settings'
|
9
|
+
require 'test_helper'
|
10
|
+
|
11
|
+
module Mygithub
|
12
|
+
class TestSettings < Test::Unit::TestCase
|
13
|
+
include FileTestUtils
|
14
|
+
|
15
|
+
def test_default_filename
|
16
|
+
assert_match /\.mygithub\/mygithub\.yaml/, Settings.default_filename
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_default_database
|
20
|
+
assert_match /\.mygithub\/database/, Settings.default_database
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_empty
|
24
|
+
obj = Settings.new('mygithub.yaml') # データが無い場合は新規作成
|
25
|
+
assert_equal "" , obj.username
|
26
|
+
assert_equal "" , obj.token
|
27
|
+
assert_equal true, obj.empty?
|
28
|
+
obj.save
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_exist_yaml
|
32
|
+
obj = Settings.new(tmp_path('../data/.mygithub/mygithub.yaml'))
|
33
|
+
assert_equal "ongaeshi" , obj.username
|
34
|
+
assert_equal "this0is1ongaeshis2token", obj.token
|
35
|
+
assert_equal false , obj.empty?
|
36
|
+
end
|
37
|
+
|
38
|
+
def teardown
|
39
|
+
teardown_custom(true)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
metadata
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mygithub
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- ongaeshi
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-02-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: thor
|
16
|
+
requirement: &2153679040 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.15.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2153679040
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rack
|
27
|
+
requirement: &2153678540 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.4.0
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *2153678540
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: milkode
|
38
|
+
requirement: &2153678080 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.9.8
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *2153678080
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: github_api
|
49
|
+
requirement: &2153677700 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *2153677700
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: omniauth
|
60
|
+
requirement: &2153677240 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *2153677240
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: omniauth-github
|
71
|
+
requirement: &2153676820 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *2153676820
|
80
|
+
description: Fast search in offline Github source code of its own.
|
81
|
+
email:
|
82
|
+
- ongaeshi0621@gmail.com
|
83
|
+
executables:
|
84
|
+
- mygithub
|
85
|
+
extensions: []
|
86
|
+
extra_rdoc_files: []
|
87
|
+
files:
|
88
|
+
- .gitignore
|
89
|
+
- Gemfile
|
90
|
+
- LICENSE.txt
|
91
|
+
- README.md
|
92
|
+
- Rakefile
|
93
|
+
- bin/mygithub
|
94
|
+
- lib/mygithub.rb
|
95
|
+
- lib/mygithub/cli.rb
|
96
|
+
- lib/mygithub/cli_core.rb
|
97
|
+
- lib/mygithub/github_accessor.rb
|
98
|
+
- lib/mygithub/milkode_accessor.rb
|
99
|
+
- lib/mygithub/settings.rb
|
100
|
+
- lib/mygithub/version.rb
|
101
|
+
- lib/mygithub/web/app.rb
|
102
|
+
- lib/mygithub/web/config.ru
|
103
|
+
- lib/mygithub/web/views/index.haml
|
104
|
+
- lib/mygithub/web/views/layout.haml
|
105
|
+
- lib/mygithub/web/views/login.haml
|
106
|
+
- lib/mygithub/web/views/mygithub.scss
|
107
|
+
- mygithub.gemspec
|
108
|
+
- test/data/.mygithub/mygithub.yaml
|
109
|
+
- test/file_test_utils.rb
|
110
|
+
- test/test_cli.rb
|
111
|
+
- test/test_github_accessor.rb
|
112
|
+
- test/test_helper.rb
|
113
|
+
- test/test_settings.rb
|
114
|
+
homepage: ''
|
115
|
+
licenses: []
|
116
|
+
post_install_message:
|
117
|
+
rdoc_options: []
|
118
|
+
require_paths:
|
119
|
+
- lib
|
120
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
128
|
+
requirements:
|
129
|
+
- - ! '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
requirements: []
|
133
|
+
rubyforge_project:
|
134
|
+
rubygems_version: 1.8.11
|
135
|
+
signing_key:
|
136
|
+
specification_version: 3
|
137
|
+
summary: Fast search in offline Github source code of its own.
|
138
|
+
test_files:
|
139
|
+
- test/data/.mygithub/mygithub.yaml
|
140
|
+
- test/file_test_utils.rb
|
141
|
+
- test/test_cli.rb
|
142
|
+
- test/test_github_accessor.rb
|
143
|
+
- test/test_helper.rb
|
144
|
+
- test/test_settings.rb
|
145
|
+
has_rdoc:
|