mygithub 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .sass-cache/
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in mygithub.gemspec
4
+ gemspec
5
+
6
+ gem 'milkode', :path => '../milkode'
@@ -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.
@@ -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
+
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new(:test) do |test|
5
+ test.libs << 'lib' << 'test'
6
+ test.test_files = FileList['test/**/test_*.rb']
7
+ test.verbose = true
8
+ end
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "mygithub"
4
+
5
+ Mygithub::CLI.start
@@ -0,0 +1,6 @@
1
+ require "mygithub/version"
2
+ require "mygithub/cli"
3
+
4
+ module Mygithub
5
+ # Your code goes here...
6
+ end
@@ -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,3 @@
1
+ module Mygithub
2
+ VERSION = "0.3.0"
3
+ end
@@ -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,5 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
3
+
4
+ require './app'
5
+ run Sinatra::Application
@@ -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
+
@@ -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,3 @@
1
+ ---
2
+ username: 'ongaeshi'
3
+ token: 'this0is1ongaeshis2token'
@@ -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
@@ -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
@@ -0,0 +1,3 @@
1
+ require 'stringio'
2
+ require 'test/unit'
3
+ require 'file_test_utils'
@@ -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: