cliff 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.
- data/LICENSE +20 -0
- data/README.md +35 -0
- data/bin/cliff +68 -0
- data/lib/cliff.rb +121 -0
- data/test/helper.rb +9 -0
- data/test/test_cliff.rb +7 -0
- metadata +78 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 Sebastian Cohnen
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# What's this about?
|
2
|
+
Cliff is a CLI-Client for [friendpaste.com][fp]. You can paste stuff to Friendpaste by piping it to cliff or fetch contents of a existing paste. It's not yet finished but should work fine. Currently only getting existing and creating new snippets is supported. Updates, Diffs, Versioning, etc. will soon follow!
|
3
|
+
|
4
|
+
And btw: [friendpaste.com][fp] is powered by [CouchDB][couch] :)
|
5
|
+
|
6
|
+
# Usage
|
7
|
+
|
8
|
+
cliff [--help | --list-languages | --refresh]
|
9
|
+
|
10
|
+
`--help` should be pretty self-explanatory. `--list-languages` prints a list of all available languages for syntax highlighting from friendpaste. `--refresh` fetches a new list from friendpaste.com and stores it in `$HOME/.friendpaste_languages`.
|
11
|
+
|
12
|
+
cliff [FILE] [LANGUAGE]
|
13
|
+
cliff [SOME_EXISTING_SNIPPET_ID]
|
14
|
+
|
15
|
+
Upload stuff from stdin
|
16
|
+
|
17
|
+
echo "Hello world!" | cliff
|
18
|
+
|
19
|
+
Upload contents from file
|
20
|
+
|
21
|
+
cliff < file.txt
|
22
|
+
cliff myrubyscript.rb rb
|
23
|
+
|
24
|
+
Fetch a paste
|
25
|
+
|
26
|
+
cliff SOME_SNIPPET_ID > output.txt
|
27
|
+
|
28
|
+
# Notes
|
29
|
+
When creating a new snippet, the complete URL is copied to your clipboard for direct usage on IRC and co.
|
30
|
+
|
31
|
+
This CLI-Tool is heavily inspired by http://github.com/defunkt/gist.
|
32
|
+
|
33
|
+
|
34
|
+
[fp]: http://friendpaste.com/
|
35
|
+
[couch]: http://couchdb.apache.org/
|
data/bin/cliff
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "rubygems"
|
4
|
+
require "cliff"
|
5
|
+
require "trollop"
|
6
|
+
|
7
|
+
# Define some command-line options
|
8
|
+
opts = Trollop.options do
|
9
|
+
version "v0.2 (by) Sebastian Cohnen, 2010"
|
10
|
+
banner <<-BANNER
|
11
|
+
Cliff is a CLI-Client for friendpaste.com. It's not yet finished but
|
12
|
+
should work. Currently only getting existing and creating new snippets
|
13
|
+
is supported. Updates, Diffs, Versioning, etc. will soon follow!
|
14
|
+
|
15
|
+
http://github.com/tisba/cliff
|
16
|
+
|
17
|
+
Example usage:
|
18
|
+
# echo "Hello world!" | cliff
|
19
|
+
# cliff < file.txt
|
20
|
+
# cliff someexistingfile.txt
|
21
|
+
# cliff SOME_SNIPPET_ID > output.txt
|
22
|
+
|
23
|
+
Note:
|
24
|
+
When creating a new snippet, the complete URL is copied to your
|
25
|
+
clipboard for direct usage on IRC and co.
|
26
|
+
|
27
|
+
Cliff is heavily inspired by the CLI-Clients for gist :-)
|
28
|
+
|
29
|
+
Options:
|
30
|
+
BANNER
|
31
|
+
opt :list_languages, "List all available languages for syntax highlighting on friendpaste", :default => false
|
32
|
+
opt :refresh, "Refresh available languages", :default => false
|
33
|
+
opt :language, "Specify the language for highlighting purposes on fp", :default => "text"
|
34
|
+
|
35
|
+
if ARGV.empty? && STDIN.tty?
|
36
|
+
educate
|
37
|
+
exit
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# List all available languages
|
42
|
+
if opts[:list_languages]
|
43
|
+
Cliff.languages.each { |lang| puts lang.join(': ') }
|
44
|
+
exit
|
45
|
+
end
|
46
|
+
|
47
|
+
# Refresh available languages
|
48
|
+
if opts[:refresh]
|
49
|
+
Cliff::Helpers.refresh_languages_cache
|
50
|
+
exit
|
51
|
+
end
|
52
|
+
|
53
|
+
# Let's rock!
|
54
|
+
|
55
|
+
# Let's see if our first param could be an existing file...
|
56
|
+
if ARGV.first and File.exists?(ARGV.first)
|
57
|
+
input = File.read(ARGV.first)
|
58
|
+
opts = {"language" => ARGV[1]} if Cliff::Helpers.is_language?(ARGV[1])
|
59
|
+
puts Cliff.create(input, opts).snippet_id
|
60
|
+
exit
|
61
|
+
end
|
62
|
+
|
63
|
+
if STDIN.tty?
|
64
|
+
puts Cliff.get(ARGV.first).snippet
|
65
|
+
else
|
66
|
+
opts = {"language" => ARGV.first} if Cliff::Helpers.is_language?(ARGV.first)
|
67
|
+
puts Cliff.create(STDIN.read, opts).snippet_id
|
68
|
+
end
|
data/lib/cliff.rb
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require 'open-uri'
|
4
|
+
require 'net/http'
|
5
|
+
|
6
|
+
begin
|
7
|
+
require 'yajl/json'
|
8
|
+
rescue LoadError
|
9
|
+
require 'json'
|
10
|
+
end
|
11
|
+
|
12
|
+
class Cliff
|
13
|
+
|
14
|
+
class <<self
|
15
|
+
def languages
|
16
|
+
@languages ||= Helpers.load_languages_from_cache
|
17
|
+
end
|
18
|
+
|
19
|
+
def create(content, params)
|
20
|
+
snippet = Snippet.new(content, params)
|
21
|
+
snippet.save
|
22
|
+
Helpers.copy(snippet.url)
|
23
|
+
return snippet
|
24
|
+
end
|
25
|
+
|
26
|
+
def get(doc_id)
|
27
|
+
headers = {"Accept" => "application/json"}
|
28
|
+
raw = open("#{FP_URL}/#{doc_id}", headers).read
|
29
|
+
Snippet.new(JSON.parse(raw))
|
30
|
+
end
|
31
|
+
|
32
|
+
def fp_url
|
33
|
+
"http://www.friendpaste.com/"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class Helpers
|
38
|
+
class << self
|
39
|
+
def is_language?(opt)
|
40
|
+
Cliff.languages.flatten.include?(opt)
|
41
|
+
end
|
42
|
+
|
43
|
+
def cache_file_name
|
44
|
+
File.join(ENV['HOME'], ".friendpaste_languages")
|
45
|
+
end
|
46
|
+
|
47
|
+
def refresh_languages_cache
|
48
|
+
languages = fetch_languages
|
49
|
+
File.open(cache_file_name, 'w+') {|f| f.write(languages) }
|
50
|
+
JSON.parse(languages)
|
51
|
+
end
|
52
|
+
|
53
|
+
def load_languages_from_cache
|
54
|
+
if File.exists?(cache_file_name)
|
55
|
+
JSON.parse(File.read(cache_file_name))
|
56
|
+
else
|
57
|
+
refresh_languages_cache
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def fetch_languages
|
62
|
+
open("#{fp_url}/_all_languages").read
|
63
|
+
end
|
64
|
+
|
65
|
+
# Copy content to clipboard
|
66
|
+
def copy(content)
|
67
|
+
case RUBY_PLATFORM
|
68
|
+
when /darwin/
|
69
|
+
return content if `which pbcopy`.strip == ''
|
70
|
+
IO.popen('pbcopy', 'r+') { |clip| clip.print content }
|
71
|
+
when /linux/
|
72
|
+
return content if `which xclip 2> /dev/null`.strip == ''
|
73
|
+
IO.popen('xclip', 'r+') { |clip| clip.print content }
|
74
|
+
when /i386-cygwin/
|
75
|
+
return content if `which putclip`.strip == ''
|
76
|
+
IO.popen('putclip', 'r+') { |clip| clip.print content }
|
77
|
+
end
|
78
|
+
|
79
|
+
content
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Class for representing a snippet
|
85
|
+
class Snippet
|
86
|
+
attr_reader :snippet_id
|
87
|
+
|
88
|
+
def initialize(data, params = {})
|
89
|
+
data = {"snippet" => data} unless data.kind_of? Hash
|
90
|
+
|
91
|
+
@data = { "title" => "",
|
92
|
+
"language" => "text"
|
93
|
+
}.merge(data).merge(params)
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.create(data)
|
97
|
+
snippet = new(data)
|
98
|
+
snippet.save
|
99
|
+
end
|
100
|
+
|
101
|
+
def url
|
102
|
+
"#{Cliff::fp_url}#{@snippet_id}"
|
103
|
+
end
|
104
|
+
|
105
|
+
def method_missing(meth, *args, &blk)
|
106
|
+
super unless @data.keys.include?(meth.to_s)
|
107
|
+
@data[meth.to_s]
|
108
|
+
end
|
109
|
+
|
110
|
+
def save
|
111
|
+
uri = URI.parse(Cliff::fp_url)
|
112
|
+
headers = {"Content-Type" => "application/json", "Accept" => "application/json"}
|
113
|
+
res = Net::HTTP.new(uri.host, uri.port).post(uri.path, @data.to_json, headers)
|
114
|
+
if res.kind_of? Net::HTTPSuccess
|
115
|
+
@snippet_id = JSON.parse(res.body)["id"]
|
116
|
+
else
|
117
|
+
puts "Something went wrong #{res.code.inspect}"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
data/test/helper.rb
ADDED
data/test/test_cliff.rb
ADDED
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cliff
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sebastian Cohnen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-02-13 00:00:00 +01:00
|
13
|
+
default_executable: cliff
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: trollop
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: json
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
description: Cliff is a CLI client written in ruby for friendpaste.com
|
36
|
+
email: sebastian.cohnen@gmx.net
|
37
|
+
executables:
|
38
|
+
- cliff
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- LICENSE
|
43
|
+
- README.md
|
44
|
+
files:
|
45
|
+
- README.md
|
46
|
+
- lib/cliff.rb
|
47
|
+
- LICENSE
|
48
|
+
has_rdoc: true
|
49
|
+
homepage: http://github.com/tisba/cliff
|
50
|
+
licenses: []
|
51
|
+
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options:
|
54
|
+
- --charset=UTF-8
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: "0"
|
62
|
+
version:
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: "0"
|
68
|
+
version:
|
69
|
+
requirements: []
|
70
|
+
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 1.3.5
|
73
|
+
signing_key:
|
74
|
+
specification_version: 3
|
75
|
+
summary: CLI client in ruby for friendpaste.com
|
76
|
+
test_files:
|
77
|
+
- test/helper.rb
|
78
|
+
- test/test_cliff.rb
|