swdyh-gisty 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.rdoc ADDED
@@ -0,0 +1,42 @@
1
+
2
+ = gisty
3
+
4
+
5
+ == Description
6
+
7
+ yet another command line client for gist
8
+
9
+ == Installation
10
+
11
+ === Gem Installation
12
+
13
+ sudo gem install nokogiri
14
+
15
+ gem sources -a http://gems.github.com (you only have to do this once)
16
+ sudo gem install swdyh-gisty
17
+
18
+ set environment variable GISTY_DIR.
19
+ example .zshrc
20
+
21
+ export GISTY_DIR="$HOME/dev/gists"
22
+
23
+ zsh command completion: http://github.com/swdyh/gisty/raw/master/_gisty
24
+
25
+ == Features/Problems
26
+
27
+
28
+ == Synopsis
29
+
30
+ gisty list show local list.
31
+ gisty post file1 file2 ... post new gist.
32
+ gisty private_post file1 file2 ... post new private gist.
33
+ gisty sync sync remote gist.
34
+ gisty sync_delete sync remote gist. delete local gist if remote gist was deleted.
35
+ gisty version show gisty version
36
+ gisty help show help
37
+
38
+ == Copyright
39
+
40
+ Author:: swdyh <http://mailhide.recaptcha.net/d?k=01AhB7crgrlHptVaYRD0oPwA==&c=L_iqOZrGmo6hcGpPTFg1QYnjr-WpAStyQ4Y8ShfgOHs=>
41
+ Copyright:: Copyright (c) 2008 swdyh
42
+ License:: MIT
data/Rakefile ADDED
@@ -0,0 +1,103 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/clean'
4
+ require 'rake/testtask'
5
+ require 'rake/packagetask'
6
+ require 'rake/gempackagetask'
7
+ require 'rake/rdoctask'
8
+ require 'rake/contrib/rubyforgepublisher'
9
+ require 'rake/contrib/sshpublisher'
10
+ require 'fileutils'
11
+ require 'lib/gisty'
12
+ include FileUtils
13
+
14
+ NAME = "gisty"
15
+ AUTHOR = "swdyh"
16
+ EMAIL = "http://mailhide.recaptcha.net/d?k=01AhB7crgrlHptVaYRD0oPwA==&c=L_iqOZrGmo6hcGpPTFg1QYnjr-WpAStyQ4Y8ShfgOHs="
17
+ DESCRIPTION = "yet another command line client for gist"
18
+ RUBYFORGE_PROJECT = "gisty"
19
+ HOMEPATH = "http://github.com/swdyh/gisty/tree/master"
20
+ BIN_FILES = %w( gisty )
21
+
22
+ VERS = Gisty::VERSION
23
+ REV = File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
24
+ CLEAN.include ['**/.*.sw?', '*.gem', '.config', '*.gemspec']
25
+ RDOC_OPTS = [
26
+ '--title', "#{NAME} documentation",
27
+ "--charset", "utf-8",
28
+ "--opname", "index.html",
29
+ "--line-numbers",
30
+ "--main", "README.rdoc",
31
+ "--inline-source",
32
+ ]
33
+
34
+ task :default => [:test]
35
+ task :package => [:clean]
36
+
37
+ Rake::TestTask.new("test") do |t|
38
+ t.libs << "test"
39
+ t.pattern = "test/**/*_test.rb"
40
+ t.verbose = true
41
+ end
42
+
43
+ spec = Gem::Specification.new do |s|
44
+ s.name = NAME
45
+ s.version = VERS
46
+ s.platform = Gem::Platform::RUBY
47
+ s.has_rdoc = true
48
+ s.extra_rdoc_files = ["README.rdoc"]
49
+ s.rdoc_options += RDOC_OPTS + ['--exclude', '^(examples|extras)/']
50
+ s.summary = DESCRIPTION
51
+ s.description = DESCRIPTION
52
+ s.author = AUTHOR
53
+ s.email = EMAIL
54
+ s.homepage = HOMEPATH
55
+ s.executables = BIN_FILES
56
+ s.rubyforge_project = RUBYFORGE_PROJECT
57
+ s.bindir = "bin"
58
+ s.require_path = "lib"
59
+ #s.autorequire = ""
60
+ s.test_files = Dir["test/*_test.rb"]
61
+
62
+ #s.add_dependency('activesupport', '>=1.3.1')
63
+ #s.required_ruby_version = '>= 1.8.2'
64
+
65
+ s.files = %w(README.rdoc Rakefile) +
66
+ Dir.glob("{bin,doc,test,lib,templates,generator,extras,website,script}/**/*") +
67
+ Dir.glob("ext/**/*.{h,c,rb}") +
68
+ Dir.glob("examples/**/*.rb") +
69
+ Dir.glob("tools/*.rb") +
70
+ Dir.glob("rails/*.rb")
71
+
72
+ s.extensions = FileList["ext/**/extconf.rb"].to_a
73
+ end
74
+
75
+
76
+ Rake::GemPackageTask.new(spec) do |p|
77
+ p.need_tar = true
78
+ p.gem_spec = spec
79
+ end
80
+
81
+ Rake::RDocTask.new do |rdoc|
82
+ rdoc.rdoc_dir = 'html'
83
+ rdoc.options += RDOC_OPTS
84
+ rdoc.template = "resh"
85
+ #rdoc.template = "#{ENV['template']}.rb" if ENV['template']
86
+ if ENV['DOC_FILES']
87
+ rdoc.rdoc_files.include(ENV['DOC_FILES'].split(/,\s*/))
88
+ else
89
+ rdoc.rdoc_files.include('README.rdoc')
90
+ rdoc.rdoc_files.include('lib/**/*.rb')
91
+ rdoc.rdoc_files.include('ext/**/*.c')
92
+ end
93
+ end
94
+
95
+ desc 'Update gem spec'
96
+ task :gemspec do
97
+ open("#{NAME}.gemspec", 'w') { |f| f.puts spec.to_ruby }
98
+ end
99
+
100
+ desc 'gem build'
101
+ task :build_gem => [:gemspec] do
102
+ sh "gem build #{NAME}.gemspec"
103
+ end
data/bin/gisty ADDED
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'gisty'
5
+
6
+ @cmds = {}
7
+
8
+ def cmd name
9
+ @cmds[name.to_s] = Proc.new { |i| yield i }
10
+ end
11
+
12
+ cmd :version do
13
+ puts Gisty::VERSION
14
+ end
15
+
16
+ cmd :help do
17
+ puts <<-EOS
18
+ usage:
19
+ gisty commands
20
+ commands:
21
+ gisty list show local list.
22
+ gisty post file1 file2 ... post new gist.
23
+ gisty private_post file1 file2 ... post new private gist.
24
+ gisty sync sync remote gist.
25
+ gisty sync_delete sync remote gist. delete local gist if remote gist was deleted.
26
+ gisty version show gisty version
27
+ gisty help show help
28
+ EOS
29
+ end
30
+
31
+ cmd :list do
32
+ @g.list.each do |i|
33
+ puts "#{i[0]}: #{i[1].join(' ')}"
34
+ end
35
+ end
36
+
37
+ cmd :sync do
38
+ @g.sync
39
+ puts '---'
40
+ puts 'sync finished.'
41
+ end
42
+
43
+ cmd :sync_delete do
44
+ @g.sync true
45
+ puts '---'
46
+ puts 'sync finished.'
47
+ end
48
+
49
+ cmd :post do |fs|
50
+ if fs.size > 0
51
+ begin
52
+ url = @g.create fs
53
+ rescue Exception => e
54
+ puts 'error.'
55
+ else
56
+ system "open #{url}"
57
+ id = url.split('/').last
58
+ @g.clone id
59
+ end
60
+ end
61
+ end
62
+
63
+ cmd :private_post do |fs|
64
+ if fs.size > 0
65
+ begin
66
+ url = @g.create fs, :private => true
67
+ rescue Exception => e
68
+ puts 'error.'
69
+ else
70
+ system "open #{url}"
71
+ id = url.split('/').last
72
+ @g.clone id
73
+ end
74
+ end
75
+ end
76
+
77
+
78
+ if ENV['GISTY_DIR']
79
+ @g = Gisty.new ENV['GISTY_DIR']
80
+ else
81
+ puts "error: please set ENV['GISTY_DIR']"
82
+ exit
83
+ end
84
+
85
+ if ARGV.size == 0
86
+ @cmds['help'].call []
87
+ else
88
+ c = @cmds[ARGV.first]
89
+ if c
90
+ c.call ARGV.last(ARGV.size - 1)
91
+ else
92
+ puts '...'
93
+ end
94
+ end
95
+
data/lib/gisty.rb ADDED
@@ -0,0 +1,133 @@
1
+ require 'pathname'
2
+ require 'net/http'
3
+ require 'open-uri'
4
+ require 'rubygems'
5
+ require 'nokogiri'
6
+
7
+ class Gisty
8
+ VERSION = '0.0.3'
9
+ GIST_URL = 'http://gist.github.com/'
10
+
11
+ def self.extract_ids url
12
+ doc = Nokogiri::HTML open(url)
13
+ doc.css('.file .info a').map { |i| i['href'].sub('/', '') }
14
+ end
15
+
16
+ def self.extract url
17
+ doc = Nokogiri::HTML open(url)
18
+ {
19
+ :id => url.split('/').last,
20
+ :author => doc.css('#owner a').inner_text,
21
+ :files => doc.css('.meta .info').map { |i| i.inner_text.strip },
22
+ :clone => doc.css('a[rel="#git-clone"]').inner_text,
23
+ }
24
+ end
25
+
26
+ def initialize path, login = nil, token = nil
27
+ @auth = (login && token) ? { :login => login, :token => token } : auth
28
+ @auth_query = "login=#{@auth[:login]}&token=#{@auth[:token]}"
29
+ @dir = Pathname.pwd.realpath.join path
30
+ FileUtils.mkdir_p @dir unless @dir.exist?
31
+ end
32
+
33
+ def page_num
34
+ url = GIST_URL + 'mine?' + @auth_query
35
+ doc = Nokogiri::HTML open(url)
36
+ as = doc.css('.pagination a')
37
+ (as.size < 2) ? 1 : as[as.size - 2].inner_text.to_i
38
+ end
39
+
40
+ def page_urls
41
+ Array.new(page_num) { |i| GIST_URL + "mine?page=#{i + 1}&#{@auth_query}" }
42
+ end
43
+
44
+ def remote_ids
45
+ page_urls.map { |u| Gisty.extract_ids u }.flatten.uniq.sort
46
+ end
47
+
48
+ def clone id
49
+ FileUtils.cd @dir do
50
+ c = "git clone git@gist.github.com:#{id}.git"
51
+ Kernel.system c
52
+ end
53
+ end
54
+
55
+ def list
56
+ dirs = Pathname.glob(@dir.to_s + '/*')
57
+ dirs.map do |i|
58
+ [i.basename.to_s,
59
+ Pathname.glob(i.to_s + '/*').map { |i| i.basename.to_s }]
60
+ end
61
+ end
62
+
63
+ def local_ids
64
+ dirs = Pathname.glob(@dir.to_s + '/*')
65
+ dirs.map { |i| i.basename.to_s }
66
+ end
67
+
68
+ def delete id
69
+ FileUtils.rm_rf @dir.join(id) if @dir.join(id).exist?
70
+ end
71
+
72
+ def sync delete = false
73
+ remote = remote_ids
74
+ local = local_ids
75
+
76
+ if delete
77
+ (local - remote).each do |id|
78
+ # puts "delete #{id}"
79
+ delete id
80
+ end
81
+ ids = remote
82
+ else
83
+ ids = (remote + local).uniq
84
+ end
85
+
86
+ FileUtils.cd @dir do
87
+ ids.each do |id|
88
+ if File.exist? id
89
+ FileUtils.cd id do
90
+ c = "git pull"
91
+ Kernel.system c
92
+ end
93
+ else
94
+ c = "git clone git@gist.github.com:#{id}.git"
95
+ Kernel.system c
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ def auth
102
+ user = `git config --global github.user`.strip
103
+ token = `git config --global github.token`.strip
104
+ user.empty? ? {} : { :login => user, :token => token }
105
+ end
106
+
107
+ def post params
108
+ url = URI.parse('http://gist.github.com/gists')
109
+ req = Net::HTTP.post_form(url, params)
110
+ req['Location']
111
+ end
112
+
113
+ def build_params paths
114
+ list = (Array === paths ? paths : [paths]).map { |i| Pathname.new i }
115
+ raise 'file error' if list.any?{ |i| !i.file? }
116
+
117
+ params = {}
118
+ list.each_with_index do |i, index|
119
+ params["file_ext[gistfile#{index + 1}]"] = i.extname
120
+ params["file_name[gistfile#{index + 1}]"] = i.basename.to_s
121
+ params["file_contents[gistfile#{index + 1}]"] = IO.read(i)
122
+ end
123
+ params
124
+ end
125
+
126
+ def create paths, opt = { :private => false }
127
+ params = build_params paths
128
+ if opt[:private]
129
+ params['private'] = 'on'
130
+ end
131
+ post params.merge(auth)
132
+ end
133
+ end
@@ -0,0 +1,241 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
7
+
8
+ <title>gist: 24835 &mdash; GitHub</title>
9
+
10
+ <link href="/stylesheets/facebox.css" media="screen" rel="stylesheet" type="text/css" />
11
+ <link href="/stylesheets/gist/screen.css" media="screen" rel="stylesheet" type="text/css" />
12
+ <link href="/stylesheets/pygment_trac.css" media="screen" rel="stylesheet" type="text/css" />
13
+
14
+
15
+
16
+
17
+ </head>
18
+
19
+ <body>
20
+ <div id="main">
21
+ <div id="header" class="">
22
+ <div class="site">
23
+ <div class="logo">
24
+ <a href="/"><img src="/images/modules/header/logo_gist.png" alt="git-hub" /></a>
25
+ </div>
26
+
27
+ <div class="actions">
28
+ <a href="/">New</a>
29
+ <a href="/gists">All Gists</a>
30
+ <a href="/login?return_to=gist">Login</a>
31
+ <a href="http://github.com/signup?return_to=gist">Signup for a GitHub Account</a>
32
+ </div>
33
+
34
+ </div>
35
+ </div>
36
+
37
+ <div class="site">
38
+
39
+ <div id="gist_data">
40
+ <div id="repos">
41
+ <div class="repo public">
42
+ <div class="title">
43
+ <div class="path">
44
+ gist: 24835
45
+
46
+
47
+ <a href="/gists/24835/download"><img alt="Download_button" border="0" class="button" src="/images/modules/repos/download_button.png?9eb59f95332165fee30c4fdb22748a8fe02eb123" /></a>
48
+
49
+
50
+
51
+
52
+ <a href="http://github.com/signup"><img alt="fork" class="button" src="/images/modules/repos/fork_button.png?9eb59f95332165fee30c4fdb22748a8fe02eb123" /></a>
53
+
54
+ </div>
55
+
56
+
57
+ <div class="security public_security" style="">
58
+ <a href="#public_repo" rel="facebox"><img src="/images/icons/public.png" alt="public" /></a>
59
+ </div>
60
+
61
+
62
+ <div id="private_repo" class="hidden">
63
+ This gist is private.
64
+ All pages are served over SSL and all pushing and pulling is done over SSH.
65
+ No one may fork, clone, or view it unless they are given this private URL.
66
+ <br/>
67
+ <br/>
68
+ Every gist with this icon (<img src="/images/icons/private.png" alt="private" />) is private.
69
+ </div>
70
+ <div class="security public_security" style="display:none">
71
+ <a href="#public_repo" rel="facebox"><img src="/images/icons/public.png" alt="public" /></a>
72
+ </div>
73
+ <div id="public_repo" class="hidden">
74
+ This gist is public.
75
+ Anyone may fork, clone, or view it.
76
+ <br/>
77
+ <br/>
78
+ Every repository with this icon (<img src="/images/icons/public.png" alt="public" />) is public.
79
+ </div>
80
+ </div>
81
+
82
+ <div class="meta">
83
+ <table>
84
+
85
+
86
+
87
+ <tr>
88
+ <td class="label">Public Clone URL:</td>
89
+ <td>
90
+ <a rel="#git-clone" class="git_url_facebox" href="git://gist.github.com/24835.git">git://gist.github.com/24835.git</a>
91
+ <div id="git-clone" style="display:none; min-width:500px">
92
+ Give this clone URL to anyone.
93
+ <br/>
94
+
95
+ <code>git clone git://gist.github.com/24835.git gist-24835</code>
96
+ </div>
97
+ </td>
98
+ </tr>
99
+
100
+
101
+
102
+
103
+ </table>
104
+ </div>
105
+ </div>
106
+ </div>
107
+
108
+ <div id="files">
109
+
110
+
111
+
112
+
113
+
114
+ <div class="file">
115
+ <div class="meta">
116
+ <div class="info">
117
+ <span>delicious_hide_do_not_share.user.css</span>
118
+ </div>
119
+ <div class="actions">
120
+
121
+ <div id="gist-embed" style="display:inline;">
122
+ <a href="#" id="gist-embed-link">embed</a>
123
+ <input id="gist-embed-box" type="text" size="25" value='<script src="http://gist.github.com/24835.js"></script>' style="display:none;"/>
124
+ </div>
125
+
126
+ <a href="/raw/24835/43a86b56175c85f452af3fca4ce0df0997ff3bc2">raw</a>
127
+ </div>
128
+ </div>
129
+
130
+ <div class="data syntax">
131
+
132
+ <table cellpadding="0" cellspacing="0">
133
+ <tr>
134
+ <td>
135
+
136
+ <pre class="line_numbers">
137
+ <span id="LID1" rel="#L1">1</span>
138
+ <span id="LID2" rel="#L2">2</span>
139
+ <span id="LID3" rel="#L3">3</span>
140
+ <span id="LID4" rel="#L4">4</span>
141
+ <span id="LID5" rel="#L5">5</span>
142
+ <span id="LID6" rel="#L6">6</span>
143
+ <span id="LID7" rel="#L7">7</span>
144
+ </pre>
145
+ </td>
146
+ <td width="100%">
147
+
148
+
149
+ <div class="highlight"><pre><div class="line" id="LC1"><span class="k">@namespace</span> <span class="nt">url</span><span class="o">(</span><span class="nt">http</span><span class="o">://</span><span class="nt">www</span><span class="nc">.w3.org</span><span class="o">/</span><span class="nt">1999</span><span class="o">/</span><span class="nt">xhtml</span><span class="o">)</span><span class="p">;</span></div><div class="line" id="LC2">&nbsp;</div><div class="line" id="LC3"><span class="k">@-moz-document</span> <span class="nt">domain</span><span class="o">(</span><span class="s2">&quot;delicious.com&quot;</span><span class="o">)</span> <span class="p">{</span></div><div class="line" id="LC4">&nbsp;&nbsp;<span class="nc">.share</span> <span class="p">{</span></div><div class="line" id="LC5">&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">display</span><span class="o">:</span> <span class="k">none</span> <span class="cp">!important</span><span class="p">;</span></div><div class="line" id="LC6">&nbsp;&nbsp;<span class="p">}</span></div><div class="line" id="LC7"><span class="p">}</span></div></pre></div>
150
+
151
+ </td>
152
+ </tr>
153
+ </table>
154
+
155
+ </div>
156
+
157
+
158
+ </div>
159
+
160
+
161
+
162
+ <!-- cache end -->
163
+
164
+
165
+
166
+ </div>
167
+ </div> <!-- gist_data -->
168
+
169
+ <div id="gist_meta">
170
+
171
+
172
+
173
+ <div id="owner">
174
+ <h3>Owner</h3>
175
+
176
+ <a href="#"><a href="/swdyh">swdyh</a></a>
177
+
178
+ </div>
179
+
180
+
181
+
182
+
183
+
184
+
185
+
186
+ <div id="revisions">
187
+ <h3>Revisions</h3>
188
+ <ul>
189
+
190
+
191
+
192
+ <li class="current">
193
+ <img src="/images/modules/gist/dot_green.png" alt=""/><img src="/images/modules/gist/dot_green.png" alt=""/><img src="/images/modules/gist/dot_green.png" alt=""/><img src="/images/modules/gist/dot_green.png" alt=""/><img src="/images/modules/gist/dot_green.png" alt=""/><img src="/images/modules/gist/dot_green.png" alt=""/><img src="/images/modules/gist/dot_gray.png" alt=""/>
194
+ <a href="http://gist.github.com/24835/a48c0b23c8fe5fe879ba2c21f38deb1f224d43b4" class="id">a48c0b</a>
195
+
196
+
197
+ <a href="/swdyh" class="author">swdyh</a>
198
+
199
+ <span class="date"><abbr class="relatize" title="2008-11-14 01:20:54">Fri Nov 14 01:20:54 -0800 2008</abbr></span>
200
+ </li>
201
+
202
+ </ul>
203
+ </div>
204
+
205
+ </div> <!-- gist_meta -->
206
+
207
+ </div> <!-- site -->
208
+
209
+ <div class="push"></div>
210
+
211
+ </div>
212
+
213
+ <div id="footer">
214
+ <div class="site">
215
+ <div class="info">
216
+ <div style="float: left; margin-right: 2em; margin-top: -.6em;">
217
+ <a href="http://github.com/">
218
+ <img src="/images/modules/header/logo_white.png" alt="GitHub" />
219
+ </a>
220
+ </div>
221
+ <div class="links" style="float: left; width: 18em;">
222
+ <a href="http://github.com/blog"><strong>The Github Blog</strong></a> |
223
+ <a href="http://support.github.com/">Support</a> |
224
+ <a href="http://github.com/contact">Contact Us</a>
225
+ </div>
226
+ <div class="company">
227
+ <span id="_rrt" title="0.07346s from gist.github.com">It's</span>
228
+ <a href="http://logicalawesome.com/">Logical Awesome</a> | &copy;2008
229
+ </div>
230
+ </div>
231
+ <div class="sponsor">
232
+ <a href="http://engineyard.com">Hosting provided by</a>&nbsp;
233
+ <a href="http://engineyard.com">
234
+ <img src="/images/modules/footer/engine_yard_logo.gif" alt="Hosted by Engine Yard" />
235
+ </a>
236
+ </div>
237
+
238
+ </div>
239
+ </div>
240
+ </body>
241
+ </html>