wpps 0.2.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/bin/pwrslv +119 -0
- data/bin/wp +92 -0
- data/lib/extensions.rb +138 -0
- data/lib/whiplash/version.rb +3 -0
- data/lib/wputils.rb +53 -0
- metadata +162 -0
data/bin/pwrslv
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'twitter'
|
5
|
+
require 'pastie-api'
|
6
|
+
require 'optparse'
|
7
|
+
require 'nokogiri'
|
8
|
+
require 'wputils'
|
9
|
+
require 'whiplash/version'
|
10
|
+
|
11
|
+
usage = "Usage: pwrslv [OPTIONS]"
|
12
|
+
|
13
|
+
options = { :maxtweets => 1,
|
14
|
+
:interative => false,
|
15
|
+
:verbose => 0
|
16
|
+
}
|
17
|
+
OptionParser.new do |opt|
|
18
|
+
opt.banner = usage
|
19
|
+
opt.version = Whiplash::VERSION
|
20
|
+
opt.separator ""
|
21
|
+
opt.separator "Specific options:"
|
22
|
+
opt.on('-i',
|
23
|
+
'--interactive',
|
24
|
+
'This version is not yet implemented'
|
25
|
+
) { |o| options [:interactive] = true }
|
26
|
+
opt.on('-m',
|
27
|
+
'--max MAX',
|
28
|
+
Integer,
|
29
|
+
'Maximum number of tweets retrieve from',
|
30
|
+
'a specific TAG'
|
31
|
+
) { |o| options[:maxtweets] = o.to_i }
|
32
|
+
opt.on('-t',
|
33
|
+
'--tag TAG',
|
34
|
+
String,
|
35
|
+
'A TAG that identifies a group',
|
36
|
+
'of persons interested on the message'
|
37
|
+
) { |o| options[:tag] = o }
|
38
|
+
opt.on('--verbose LEVEL') do |o|
|
39
|
+
options[:verbose] = o.to_i
|
40
|
+
unless 0 <= options[:verbose] and options[:verbose] <= 2
|
41
|
+
puts opt.help
|
42
|
+
exit 1
|
43
|
+
end
|
44
|
+
end
|
45
|
+
opt.on('-v', '--version') do |o|
|
46
|
+
puts 'pwrslv version "' + opt.version + '"'
|
47
|
+
exit 0
|
48
|
+
end
|
49
|
+
opt.on('-h', '--help') do
|
50
|
+
puts opt.help
|
51
|
+
exit 0
|
52
|
+
end
|
53
|
+
end.parse!
|
54
|
+
|
55
|
+
unless ARGV.empty? then
|
56
|
+
puts usage
|
57
|
+
exit 1
|
58
|
+
end
|
59
|
+
|
60
|
+
usertwitter=ARGV[0]
|
61
|
+
|
62
|
+
yamlconf = getPScfgFile()
|
63
|
+
client = get_tweeter_client(yamlconf)
|
64
|
+
|
65
|
+
begin
|
66
|
+
tag = getWPTag(options)
|
67
|
+
tweets = client.search(tag)
|
68
|
+
|
69
|
+
nro = 0
|
70
|
+
tweets.each do |tw|
|
71
|
+
nro += 1
|
72
|
+
# puts "Tweet text: #{tw.text}"
|
73
|
+
uri = /http:\/\/t.co\/.*/.match(tw.text)
|
74
|
+
unless uri == nil
|
75
|
+
# puts "Getting uri: #{uri[0]} short uri:"
|
76
|
+
unless uri[0] == nil
|
77
|
+
ruri = resolve_redirects(uri[0])
|
78
|
+
idinfo = /http:\/\/pastie\.org\/(\d+)/.match(ruri)
|
79
|
+
# puts "Processing idinfo: #{idinfo[0]}"
|
80
|
+
unless idinfo[1] == nil
|
81
|
+
# puts "Getting Pastie: #{idinfo[1]}"
|
82
|
+
p = Pastie.get(idinfo[1])
|
83
|
+
# puts "Pastie: #{p}"
|
84
|
+
unless p == nil
|
85
|
+
doc = Nokogiri::HTML(p.content)
|
86
|
+
src = doc.at('body').at('pre').
|
87
|
+
inner_html.gsub("<br>", "\n").gsub("<br/>", "\n").
|
88
|
+
gsub("<","<").gsub(">",">").gsub("&", "&")
|
89
|
+
lines = src.split(/\n/)
|
90
|
+
lastLine = lines[lines.length - 1]
|
91
|
+
psflnm = /.*filename: (.*)/.match(lines[lines.length - 1])
|
92
|
+
if psflnm[1] == nil
|
93
|
+
puts "Cannot get filename from pastie link. Process ends"
|
94
|
+
exit 1
|
95
|
+
end
|
96
|
+
filename = psflnm[1]
|
97
|
+
print "Start writing #{filename}"
|
98
|
+
$stdout.flush
|
99
|
+
begin
|
100
|
+
file = File.open(filename, "w+")
|
101
|
+
nwlines = lines.first(lines.length - 1)
|
102
|
+
nwlines.each do |line|
|
103
|
+
file.puts(line)
|
104
|
+
end
|
105
|
+
rescue Exception => e
|
106
|
+
puts "\nError writting #{filename} due: #{e}"
|
107
|
+
exit 1
|
108
|
+
end
|
109
|
+
puts " End writing #{filename}"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
break if nro == options[:maxtweets]
|
115
|
+
end
|
116
|
+
rescue Exception => e
|
117
|
+
puts e
|
118
|
+
exit 1
|
119
|
+
end
|
data/bin/wp
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'twitter'
|
5
|
+
require 'pastie-api'
|
6
|
+
require 'optparse'
|
7
|
+
require 'extensions'
|
8
|
+
require 'wputils'
|
9
|
+
require 'whiplash/version'
|
10
|
+
|
11
|
+
usage = "Usage: wp [OPTIONS]"
|
12
|
+
|
13
|
+
options = {}
|
14
|
+
OptionParser.new do |opt|
|
15
|
+
opt.banner = usage
|
16
|
+
opt.version = Whiplash::VERSION
|
17
|
+
opt.separator ""
|
18
|
+
opt.separator "Specific options:"
|
19
|
+
opt.on('-m',
|
20
|
+
'--message MESSAGE',
|
21
|
+
String,
|
22
|
+
'A MESSAGE to be sent') { |o| options[:message] = o }
|
23
|
+
opt.on('-t',
|
24
|
+
'--tag TAG',
|
25
|
+
String,
|
26
|
+
'A TAG that identifies a group',
|
27
|
+
'of persons interested on the message'
|
28
|
+
) { |o| options[:tag] = o }
|
29
|
+
opt.on('-v', '--version') do |o|
|
30
|
+
puts 'wp version "' + opt.version + '"'
|
31
|
+
exit 0
|
32
|
+
end
|
33
|
+
opt.on('-h', '--help') do |o|
|
34
|
+
puts opt.help
|
35
|
+
exit
|
36
|
+
end
|
37
|
+
end.parse!
|
38
|
+
|
39
|
+
if ARGV.empty? or ARGV.length > 1 then
|
40
|
+
puts usage
|
41
|
+
exit 1
|
42
|
+
end
|
43
|
+
|
44
|
+
sendfile=ARGV[0]
|
45
|
+
unless options[:message] == nil
|
46
|
+
user_message = options[:message]
|
47
|
+
else
|
48
|
+
user_message = ""
|
49
|
+
end
|
50
|
+
|
51
|
+
yamlconf = getWPcfgFile()
|
52
|
+
|
53
|
+
# Reading a file
|
54
|
+
unless File::exist? sendfile or File::readable? sendfile
|
55
|
+
puts "Error: file #{sendfile} does not exist or not readable"
|
56
|
+
exit 1
|
57
|
+
end
|
58
|
+
|
59
|
+
file = File.new(sendfile, "r")
|
60
|
+
conts = ""
|
61
|
+
file.each_line do |line|
|
62
|
+
conts += line
|
63
|
+
end
|
64
|
+
file.close
|
65
|
+
|
66
|
+
# Create a new paste
|
67
|
+
le = LangExtensions.instance
|
68
|
+
lang = le.getLangDesc(File.extname sendfile)
|
69
|
+
exts = File.extname sendfile
|
70
|
+
comm = lang.prodComment('filename: ' + (File.basename sendfile))
|
71
|
+
conts = conts + comm
|
72
|
+
p = Pastie.create(conts, false, lang.name)
|
73
|
+
|
74
|
+
# Getting environment variables that contains the tag info
|
75
|
+
tag = getWPTag(options)
|
76
|
+
|
77
|
+
# Setting twitter client
|
78
|
+
client = get_tweeter_client(yamlconf)
|
79
|
+
|
80
|
+
# Send a twitter with new file info
|
81
|
+
begin
|
82
|
+
tweet_message = tag + " " + user_message + " " + p.link
|
83
|
+
if tweet_message.length > 240
|
84
|
+
puts "wp cannot send message: #{tweet_message} because too long: #{tweet_emssage.length}"
|
85
|
+
exit 1
|
86
|
+
end
|
87
|
+
tweet = client.update(tweet_message)
|
88
|
+
puts "Tweet id: #{tweet.id}"
|
89
|
+
rescue Exception => e
|
90
|
+
puts "wp could not sent message send due: #{e.message}"
|
91
|
+
exit 1
|
92
|
+
end
|
data/lib/extensions.rb
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
LangDescr = Class.new do
|
4
|
+
attr_accessor :name, :ext
|
5
|
+
attr_writer :genComment
|
6
|
+
|
7
|
+
def prodComment(str)
|
8
|
+
@genComment.call(str)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
$hashComment = Proc.new do |str|
|
13
|
+
"# " + str + "\n"
|
14
|
+
end
|
15
|
+
|
16
|
+
$dashComment = Proc.new do |str|
|
17
|
+
"-- " + str + "\n"
|
18
|
+
end
|
19
|
+
|
20
|
+
$backComment = Proc.new do |str|
|
21
|
+
"// " + str + "\n"
|
22
|
+
end
|
23
|
+
|
24
|
+
$backAstComment = Proc.new do |str|
|
25
|
+
"/* " + str + " */" + "\n"
|
26
|
+
end
|
27
|
+
|
28
|
+
$smlComment = Proc.new do |str|
|
29
|
+
"(* " + str + " *)" + "\n"
|
30
|
+
end
|
31
|
+
|
32
|
+
$plainComment = Proc.new do |str|
|
33
|
+
">> " + str + "\n"
|
34
|
+
end
|
35
|
+
|
36
|
+
LangExtensions = Class.new do
|
37
|
+
include Singleton
|
38
|
+
|
39
|
+
def initialize()
|
40
|
+
rubyLang = LangDescr.new.tap do |r|
|
41
|
+
r.name = "ruby"
|
42
|
+
r.ext = [".rb"]
|
43
|
+
r.genComment = $hashComment
|
44
|
+
end
|
45
|
+
|
46
|
+
haskellLang = LangDescr.new.tap do |h|
|
47
|
+
h.name = "Haskell"
|
48
|
+
h.ext = [".hs", ".lhs"]
|
49
|
+
h.genComment = $dashComment
|
50
|
+
end
|
51
|
+
|
52
|
+
cLang = LangDescr.new.tap do |c|
|
53
|
+
c.name = "c"
|
54
|
+
c.ext = [".c"]
|
55
|
+
c.genComment = $backComment
|
56
|
+
end
|
57
|
+
|
58
|
+
cppLang = LangDescr.new.tap do |cpp|
|
59
|
+
cpp.name = "c"
|
60
|
+
cpp.ext = [".cc", ".cpp", ".cxx", ".C"]
|
61
|
+
cpp.genComment = $backComment
|
62
|
+
end
|
63
|
+
|
64
|
+
prologLang = LangDescr.new.tap do |pl|
|
65
|
+
pl.name = "prolog"
|
66
|
+
pl.ext = [".pl"]
|
67
|
+
pl.genComment = $backAstComment
|
68
|
+
end
|
69
|
+
|
70
|
+
smlLang = LangDescr.new.tap do |sml|
|
71
|
+
sml.name = "Standard sml"
|
72
|
+
sml.ext = [".sml"]
|
73
|
+
sml.genComment = $smlComment
|
74
|
+
end
|
75
|
+
|
76
|
+
javaLang = LangDescr.new.tap do |j|
|
77
|
+
j.name = "java"
|
78
|
+
j.ext = [".java"]
|
79
|
+
j.genComment = $backComment
|
80
|
+
end
|
81
|
+
|
82
|
+
eweLang = LangDescr.new.tap do |e|
|
83
|
+
e.name = "ewe"
|
84
|
+
e.ext = [".ewe"]
|
85
|
+
e.genComment = $hashComment
|
86
|
+
end
|
87
|
+
|
88
|
+
tclLang = LangDescr.new.tap do |t|
|
89
|
+
t.name = "tcl"
|
90
|
+
t.ext = [".tcl"]
|
91
|
+
t.genComment = $hashComment
|
92
|
+
end
|
93
|
+
|
94
|
+
bashLang = LangDescr.new.tap do |b|
|
95
|
+
b.name = "bash"
|
96
|
+
b.ext = [".bs"]
|
97
|
+
b.genComment = $hashComment
|
98
|
+
end
|
99
|
+
|
100
|
+
textLang = LangDescr.new.tap do |t|
|
101
|
+
t.name = "plain text"
|
102
|
+
t.ext = [".txt"]
|
103
|
+
t.genComment = $plainComment
|
104
|
+
end
|
105
|
+
|
106
|
+
# puts "Lenguaje: #{rubyLang.ext[0]} objeto: #{rubyLang}"
|
107
|
+
|
108
|
+
@filexts = { rubyLang.ext[0] => rubyLang,
|
109
|
+
haskellLang.ext[0] => haskellLang,
|
110
|
+
haskellLang.ext[1] => haskellLang,
|
111
|
+
cLang.ext[0] => cLang,
|
112
|
+
cppLang.ext[0] => cppLang,
|
113
|
+
cppLang.ext[1] => cppLang,
|
114
|
+
cppLang.ext[2] => cppLang,
|
115
|
+
cppLang.ext[3] => cppLang,
|
116
|
+
prologLang.ext[0] => prologLang,
|
117
|
+
smlLang.ext[0] => smlLang,
|
118
|
+
bashLang.ext[0] => bashLang,
|
119
|
+
eweLang.ext[0] => eweLang,
|
120
|
+
javaLang.ext[0] => javaLang,
|
121
|
+
textLang.ext[0] => textLang
|
122
|
+
}
|
123
|
+
end
|
124
|
+
|
125
|
+
def getLangDesc(ext)
|
126
|
+
if @filexts[ext] == nil
|
127
|
+
ext = ".txt"
|
128
|
+
end
|
129
|
+
@filexts[ext]
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# Testing
|
134
|
+
# le = LangExtensions.instance
|
135
|
+
# lang = le.getLangDesc('.hs')
|
136
|
+
# comm = lang.prodComment('Hola mundo')
|
137
|
+
#
|
138
|
+
# puts "extensions"
|
data/lib/wputils.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'twitter'
|
3
|
+
require 'yaml'
|
4
|
+
require 'faraday'
|
5
|
+
require 'faraday_middleware'
|
6
|
+
|
7
|
+
def resolve_redirects(url)
|
8
|
+
response = fetch_response(url, method= :head)
|
9
|
+
if response
|
10
|
+
return response.to_hash[:url].to_s
|
11
|
+
else
|
12
|
+
return nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def fetch_response(url, method= :get)
|
17
|
+
conn = Faraday.new do |b|
|
18
|
+
b.use FaradayMiddleware::FollowRedirects;
|
19
|
+
b.adapter :net_http
|
20
|
+
end
|
21
|
+
return conn.send method, url
|
22
|
+
rescue Faraday::Error, Faraday::Error::ConnectionFailed => e
|
23
|
+
return nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def getWPcfgFile()
|
27
|
+
filepath=ENV["HOME"] + "/" + ".whiplash"
|
28
|
+
YAML.load_file(filepath)
|
29
|
+
end
|
30
|
+
|
31
|
+
def getPScfgFile()
|
32
|
+
filepath=ENV["HOME"] + "/" + ".powerslave"
|
33
|
+
YAML.load_file(filepath)
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_tweeter_client(yamlconf)
|
37
|
+
client = Twitter::REST::Client.new do |config|
|
38
|
+
config.consumer_key = yamlconf['consumer_key']
|
39
|
+
config.consumer_secret = yamlconf['consumer_secret']
|
40
|
+
config.access_token = yamlconf['access_token']
|
41
|
+
config.access_token_secret = yamlconf['access_token_secret']
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def getWPTag(options)
|
46
|
+
pTag="NOTAGDEF"
|
47
|
+
if options[:tag] != nil
|
48
|
+
pTag = options[:tag]
|
49
|
+
elsif ENV["WPTAG"] != nil
|
50
|
+
pTag = ENV["WPTAG"]
|
51
|
+
end
|
52
|
+
return ("#" + pTag)
|
53
|
+
end
|
metadata
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wpps
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.3
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Juan Francisco Cardona McCormick
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2015-08-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: twitter
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 5.14.0
|
22
|
+
- - ! '>='
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 5.14.0
|
25
|
+
type: :runtime
|
26
|
+
prerelease: false
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 5.14.0
|
33
|
+
- - ! '>='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 5.14.0
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: pastie-api
|
38
|
+
requirement: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.2.1
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 0.2.1
|
47
|
+
type: :runtime
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.2.1
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 0.2.1
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: faraday
|
60
|
+
requirement: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 0.9.1
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.9.1
|
69
|
+
type: :runtime
|
70
|
+
prerelease: false
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ~>
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 0.9.1
|
77
|
+
- - ! '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 0.9.1
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: faraday_middleware
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ~>
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: 0.10.0
|
88
|
+
- - ! '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 0.10.0
|
91
|
+
type: :runtime
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ~>
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: 0.10.0
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.10.0
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: nokogiri
|
104
|
+
requirement: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.6.6.2
|
110
|
+
- - ! '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 1.6.6.2
|
113
|
+
type: :runtime
|
114
|
+
prerelease: false
|
115
|
+
version_requirements: !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ~>
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: 1.6.6.2
|
121
|
+
- - ! '>='
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: 1.6.6.2
|
124
|
+
description: Share snippets of code with a group of persons by twitter
|
125
|
+
email: jfcmacro@gmail.com
|
126
|
+
executables:
|
127
|
+
- wp
|
128
|
+
- pwrslv
|
129
|
+
extensions: []
|
130
|
+
extra_rdoc_files: []
|
131
|
+
files:
|
132
|
+
- lib/extensions.rb
|
133
|
+
- lib/wputils.rb
|
134
|
+
- lib/whiplash/version.rb
|
135
|
+
- bin/wp
|
136
|
+
- bin/pwrslv
|
137
|
+
homepage: https://github.com/jfcmacro/whiplash
|
138
|
+
licenses:
|
139
|
+
- ARTISTIC
|
140
|
+
post_install_message:
|
141
|
+
rdoc_options: []
|
142
|
+
require_paths:
|
143
|
+
- lib
|
144
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
|
+
none: false
|
152
|
+
requirements:
|
153
|
+
- - ! '>='
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: '0'
|
156
|
+
requirements: []
|
157
|
+
rubyforge_project:
|
158
|
+
rubygems_version: 1.8.23
|
159
|
+
signing_key:
|
160
|
+
specification_version: 3
|
161
|
+
summary: The whip hand
|
162
|
+
test_files: []
|