mygithub 0.3.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.
@@ -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: