userscripts_org 0.0.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/ChangeLog +4 -0
- data/README +36 -0
- data/Rakefile +136 -0
- data/bin/userjs +205 -0
- data/lib/userscripts_org.rb +103 -0
- data/test/test_helper.rb +3 -0
- data/test/userscripts_org_test.rb +11 -0
- metadata +88 -0
data/ChangeLog
ADDED
data/README
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
= userscripts_org
|
3
|
+
|
4
|
+
|
5
|
+
== Description
|
6
|
+
|
7
|
+
This is manipulating library for userscripts.org.
|
8
|
+
|
9
|
+
|
10
|
+
== Installation
|
11
|
+
|
12
|
+
=== Archive Installation
|
13
|
+
|
14
|
+
rake install
|
15
|
+
|
16
|
+
=== Gem Installation
|
17
|
+
|
18
|
+
gem install userscripts_org
|
19
|
+
|
20
|
+
|
21
|
+
== Features/Problems
|
22
|
+
|
23
|
+
|
24
|
+
== Synopsis
|
25
|
+
|
26
|
+
This gem install "userjs" command for manipulating.
|
27
|
+
|
28
|
+
See:
|
29
|
+
$ userjs help
|
30
|
+
$ userjs help subcommand
|
31
|
+
|
32
|
+
== Copyright
|
33
|
+
|
34
|
+
Author:: cho45 <cho45@lowreal.net>
|
35
|
+
Copyright:: Copyright (c) 2008 cho45
|
36
|
+
License:: Ruby's
|
data/Rakefile
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require "shipit"
|
3
|
+
require 'rake'
|
4
|
+
require 'rake/clean'
|
5
|
+
require 'rake/testtask'
|
6
|
+
require 'rake/packagetask'
|
7
|
+
require 'rake/gempackagetask'
|
8
|
+
require 'rake/rdoctask'
|
9
|
+
require 'rake/contrib/rubyforgepublisher'
|
10
|
+
require 'rake/contrib/sshpublisher'
|
11
|
+
require 'fileutils'
|
12
|
+
include FileUtils
|
13
|
+
|
14
|
+
$LOAD_PATH.unshift "lib"
|
15
|
+
require "userscripts_org"
|
16
|
+
|
17
|
+
NAME = "userscripts_org"
|
18
|
+
AUTHOR = "cho45"
|
19
|
+
EMAIL = "cho45@lowreal.net"
|
20
|
+
DESCRIPTION = "Manipulate userscripts.org"
|
21
|
+
RUBYFORGE_PROJECT = "lowreal"
|
22
|
+
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
23
|
+
BIN_FILES = %w( userjs )
|
24
|
+
VERS = "0.0.0"
|
25
|
+
|
26
|
+
REV = File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
|
27
|
+
CLEAN.include ['**/.*.sw?', '*.gem', '.config']
|
28
|
+
RDOC_OPTS = [
|
29
|
+
'--title', "#{NAME} documentation",
|
30
|
+
"--charset", "utf-8",
|
31
|
+
"--opname", "index.html",
|
32
|
+
"--line-numbers",
|
33
|
+
"--main", "README",
|
34
|
+
"--inline-source",
|
35
|
+
]
|
36
|
+
|
37
|
+
task :default => [:test]
|
38
|
+
task :package => [:clean]
|
39
|
+
|
40
|
+
Rake::TestTask.new("test") do |t|
|
41
|
+
t.libs << "test"
|
42
|
+
t.pattern = "test/**/*_test.rb"
|
43
|
+
t.verbose = true
|
44
|
+
end
|
45
|
+
|
46
|
+
spec = Gem::Specification.new do |s|
|
47
|
+
s.name = NAME
|
48
|
+
s.version = VERS
|
49
|
+
s.platform = Gem::Platform::RUBY
|
50
|
+
s.has_rdoc = true
|
51
|
+
s.extra_rdoc_files = ["README", "ChangeLog"]
|
52
|
+
s.rdoc_options += RDOC_OPTS + ['--exclude', '^(examples|extras)/']
|
53
|
+
s.summary = DESCRIPTION
|
54
|
+
s.description = DESCRIPTION
|
55
|
+
s.author = AUTHOR
|
56
|
+
s.email = EMAIL
|
57
|
+
s.homepage = HOMEPATH
|
58
|
+
s.executables = BIN_FILES
|
59
|
+
s.rubyforge_project = RUBYFORGE_PROJECT
|
60
|
+
s.bindir = "bin"
|
61
|
+
s.require_path = "lib"
|
62
|
+
s.autorequire = ""
|
63
|
+
s.test_files = Dir["test/test_*.rb"]
|
64
|
+
|
65
|
+
s.add_dependency('pit')
|
66
|
+
s.add_dependency('mechanize')
|
67
|
+
#s.add_dependency('activesupport', '>=1.3.1')
|
68
|
+
#s.required_ruby_version = '>= 1.8.2'
|
69
|
+
|
70
|
+
s.files = %w(README ChangeLog Rakefile) +
|
71
|
+
Dir.glob("{bin,doc,test,lib,templates,generator,extras,website,script}/**/*") +
|
72
|
+
Dir.glob("ext/**/*.{h,c,rb}") +
|
73
|
+
Dir.glob("examples/**/*.rb") +
|
74
|
+
Dir.glob("tools/*.rb")
|
75
|
+
|
76
|
+
s.extensions = FileList["ext/**/extconf.rb"].to_a
|
77
|
+
end
|
78
|
+
|
79
|
+
Rake::GemPackageTask.new(spec) do |p|
|
80
|
+
p.need_tar = true
|
81
|
+
p.gem_spec = spec
|
82
|
+
end
|
83
|
+
|
84
|
+
task :install do
|
85
|
+
name = "#{NAME}-#{VERS}.gem"
|
86
|
+
sh %{rake package}
|
87
|
+
sh %{sudo gem install pkg/#{name}}
|
88
|
+
end
|
89
|
+
|
90
|
+
task :uninstall => [:clean] do
|
91
|
+
sh %{sudo gem uninstall #{NAME}}
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
Rake::RDocTask.new do |rdoc|
|
96
|
+
rdoc.rdoc_dir = 'html'
|
97
|
+
rdoc.options += RDOC_OPTS
|
98
|
+
rdoc.template = "resh"
|
99
|
+
#rdoc.template = "#{ENV['template']}.rb" if ENV['template']
|
100
|
+
if ENV['DOC_FILES']
|
101
|
+
rdoc.rdoc_files.include(ENV['DOC_FILES'].split(/,\s*/))
|
102
|
+
else
|
103
|
+
rdoc.rdoc_files.include('README', 'ChangeLog')
|
104
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
105
|
+
rdoc.rdoc_files.include('ext/**/*.c')
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
desc "Publish to RubyForge"
|
110
|
+
task :rubyforge => [:rdoc, :package] do
|
111
|
+
require 'rubyforge'
|
112
|
+
@local_dir = "html"
|
113
|
+
@host = "cho45@rubyforge.org"
|
114
|
+
@remote_dir = "/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/#{NAME}"
|
115
|
+
sh %{rsync -r --delete --verbose #{@local_dir}/ #{@host}:#{@remote_dir}}
|
116
|
+
end
|
117
|
+
|
118
|
+
Rake::ShipitTask.new do |s|
|
119
|
+
s.Step.new {
|
120
|
+
system("svn", "up")
|
121
|
+
}.and {}
|
122
|
+
s.Task :rubyforge
|
123
|
+
s.Step.new {
|
124
|
+
raise "changelog-with-hatenastar.rb is not found" unless system("which", "changelog-with-hatenastar.rb")
|
125
|
+
}.and {
|
126
|
+
system("changelog-with-hatenastar.rb")
|
127
|
+
}
|
128
|
+
s.ChangeVersion "lib/userscripts_org.rb", "VERSION"
|
129
|
+
s.Commit
|
130
|
+
s.Skip
|
131
|
+
s.Task :clean, :package
|
132
|
+
s.RubyForge
|
133
|
+
s.Tag
|
134
|
+
s.Twitter
|
135
|
+
end
|
136
|
+
|
data/bin/userjs
ADDED
@@ -0,0 +1,205 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# vim:ft=ruby:
|
3
|
+
|
4
|
+
require "optparse"
|
5
|
+
require "pathname"
|
6
|
+
require "userscripts_org"
|
7
|
+
|
8
|
+
class UserjsCommand
|
9
|
+
VERSION = UserscriptsOrg::VERSION
|
10
|
+
NAME = "user.js"
|
11
|
+
|
12
|
+
def self.run(argv)
|
13
|
+
new(argv.dup).run
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(argv)
|
17
|
+
@argv = argv
|
18
|
+
|
19
|
+
@subparsers = {
|
20
|
+
"help" => OptionParser.new { |opts|
|
21
|
+
opts.banner = <<-EOB.gsub(/^\t+/, "")
|
22
|
+
Usage: #{NAME} help <subcommand>
|
23
|
+
|
24
|
+
Show help of subcommand.
|
25
|
+
EOB
|
26
|
+
},
|
27
|
+
|
28
|
+
"list" => OptionParser.new { |opts|
|
29
|
+
opts.banner = <<-EOB.gsub(/^\t+/, "")
|
30
|
+
Usage: #{NAME} list
|
31
|
+
|
32
|
+
List your scripts.
|
33
|
+
EOB
|
34
|
+
},
|
35
|
+
|
36
|
+
"update" => OptionParser.new { |opts|
|
37
|
+
opts.banner = <<-EOB.gsub(/^\t+/, "")
|
38
|
+
Usage: #{NAME} update <filename>
|
39
|
+
|
40
|
+
Update <filename> script.
|
41
|
+
EOB
|
42
|
+
},
|
43
|
+
|
44
|
+
"create" => OptionParser.new { |opts|
|
45
|
+
opts.banner = <<-EOB.gsub(/^\t+/, "")
|
46
|
+
Usage: #{NAME} create <filename>
|
47
|
+
|
48
|
+
Create entry on userscripts.org with <filename> script.
|
49
|
+
EOB
|
50
|
+
},
|
51
|
+
|
52
|
+
"install" => OptionParser.new { |opts|
|
53
|
+
opts.banner = <<-EOB.gsub(/^\t+/, "")
|
54
|
+
Usage: #{NAME} install [opts] <filename>
|
55
|
+
|
56
|
+
Install <filename> script.
|
57
|
+
EOB
|
58
|
+
|
59
|
+
opts.separator ""
|
60
|
+
|
61
|
+
opts.separator "Options:"
|
62
|
+
opts.on('-l', '--symlink', "Replace installed file with symlink.") do
|
63
|
+
@symlink = true
|
64
|
+
end
|
65
|
+
},
|
66
|
+
|
67
|
+
}
|
68
|
+
|
69
|
+
@parser = OptionParser.new do |parser|
|
70
|
+
parser.banner = <<-EOB.gsub(/^\t+/, "")
|
71
|
+
Usage: #{NAME} <subcommand> <args>
|
72
|
+
|
73
|
+
EOB
|
74
|
+
|
75
|
+
parser.separator ""
|
76
|
+
|
77
|
+
parser.separator "Subcommands:"
|
78
|
+
@subparsers.keys.sort.each do |k|
|
79
|
+
parser.separator "#{parser.summary_indent} #{k}"
|
80
|
+
end
|
81
|
+
|
82
|
+
parser.separator ""
|
83
|
+
|
84
|
+
parser.separator "Options:"
|
85
|
+
parser.on('--version', "Show version string `#{VERSION}'") do
|
86
|
+
puts VERSION
|
87
|
+
exit
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def run
|
93
|
+
@parser.order!(@argv)
|
94
|
+
if @argv.empty?
|
95
|
+
puts @parser.help
|
96
|
+
exit
|
97
|
+
else
|
98
|
+
@subcommand = @argv.shift
|
99
|
+
method_name = "cmd_#{@subcommand}"
|
100
|
+
if self.respond_to?(method_name)
|
101
|
+
@subparsers[@subcommand].parse!(@argv)
|
102
|
+
self.send(method_name)
|
103
|
+
else
|
104
|
+
puts "Not implemented subcommand: `#{@subcommand}'."
|
105
|
+
puts
|
106
|
+
puts @parser.help
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def cmd_help
|
112
|
+
subcommand, = @argv
|
113
|
+
if subcommand
|
114
|
+
if @subparsers.key? subcommand
|
115
|
+
puts @subparsers[subcommand].help
|
116
|
+
else
|
117
|
+
puts "No such subcommand `#{subcommand}'"
|
118
|
+
puts @parser.help
|
119
|
+
end
|
120
|
+
else
|
121
|
+
puts @parser.help
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def cmd_list
|
126
|
+
usorg = login()
|
127
|
+
usorg.list.each do |s|
|
128
|
+
puts "%8d: %s" % [s.uid, s.name]
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def cmd_update
|
133
|
+
abort @subparsers[@subcommand].help if @argv.empty?
|
134
|
+
content = File.read(@argv.first)
|
135
|
+
name = content[/@name\s+(.+)\s*/, 1]
|
136
|
+
|
137
|
+
usorg = login()
|
138
|
+
warn "Update..."
|
139
|
+
usorg.update(name, content)
|
140
|
+
end
|
141
|
+
|
142
|
+
def cmd_create
|
143
|
+
abort @subparsers[@subcommand].help if @argv.empty?
|
144
|
+
content = File.read(@argv.first)
|
145
|
+
|
146
|
+
usorg = login()
|
147
|
+
warn "Update..."
|
148
|
+
usorg.create(content)
|
149
|
+
end
|
150
|
+
|
151
|
+
def cmd_install
|
152
|
+
abort @subparsers[@subcommand].help if @argv.empty?
|
153
|
+
file = Pathname.new(@argv.first).realpath
|
154
|
+
prev = scan
|
155
|
+
install_userjs(file)
|
156
|
+
installed = catch(:break) {
|
157
|
+
loop do
|
158
|
+
scan.each do |f,time|
|
159
|
+
if prev.key?(f)
|
160
|
+
throw :break, f unless prev[f] == time
|
161
|
+
else
|
162
|
+
throw :break, f
|
163
|
+
end
|
164
|
+
end
|
165
|
+
sleep 1
|
166
|
+
end
|
167
|
+
}
|
168
|
+
puts "#{file} was installed as #{installed}."
|
169
|
+
puts "#{installed} will be replaced with symlink to #{file}."
|
170
|
+
|
171
|
+
FileUtils.symlink(file, installed, :force => true)
|
172
|
+
puts "done"
|
173
|
+
end
|
174
|
+
|
175
|
+
|
176
|
+
private
|
177
|
+
def login
|
178
|
+
warn "Logging in..."
|
179
|
+
UserscriptsOrg.new(Pit.get("userscripts.org", :require => {
|
180
|
+
"username" => "username",
|
181
|
+
"password" => "password"
|
182
|
+
})).login
|
183
|
+
end
|
184
|
+
|
185
|
+
def profile_dir
|
186
|
+
home = Pathname.new ENV["HOME"]
|
187
|
+
home + "Library/Application Support/Firefox/Profiles"
|
188
|
+
end
|
189
|
+
|
190
|
+
def scan
|
191
|
+
Pathname.glob(profile_dir + "*/gm_scripts/**/*.user.js").inject({}) {|r,i|
|
192
|
+
r[i] = i.mtime
|
193
|
+
r
|
194
|
+
}
|
195
|
+
end
|
196
|
+
|
197
|
+
def install_userjs(path)
|
198
|
+
system("open", "-a", "Firefox", path.to_s)
|
199
|
+
puts "Complete the install on Firefox"
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
|
204
|
+
UserjsCommand.run(ARGV)
|
205
|
+
|
@@ -0,0 +1,103 @@
|
|
1
|
+
|
2
|
+
require "rubygems"
|
3
|
+
require "mechanize"
|
4
|
+
require "pit"
|
5
|
+
require "yaml"
|
6
|
+
require "pathname"
|
7
|
+
require "ostruct"
|
8
|
+
require "uri"
|
9
|
+
|
10
|
+
class UserscriptsOrg
|
11
|
+
VERSION = "0.0.1"
|
12
|
+
|
13
|
+
class UserscriptsOrgError < StandardError; end
|
14
|
+
class NotLoggedinError < UserscriptsOrgError; end
|
15
|
+
|
16
|
+
BASE = URI("http://userscripts.org/")
|
17
|
+
|
18
|
+
def initialize(config)
|
19
|
+
@config = OpenStruct.new(config)
|
20
|
+
@agent = WWW::Mechanize.new
|
21
|
+
@uid = nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def logined?
|
25
|
+
!!@uid
|
26
|
+
end
|
27
|
+
|
28
|
+
def login
|
29
|
+
# Login
|
30
|
+
@agent.get(BASE + "/login")
|
31
|
+
form = @agent.page.forms.with.action("/sessions").first
|
32
|
+
form.login = @config.username
|
33
|
+
form.password = @config.password
|
34
|
+
@agent.submit(form, form.buttons.name("commit"))
|
35
|
+
|
36
|
+
# Retreive user id
|
37
|
+
@uid = @agent.page.links.text("Your scripts").first.href[%r|/users/(\d+)/scripts|, 1].to_i
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
41
|
+
def list
|
42
|
+
check
|
43
|
+
@agent.get(BASE + "/users/#{@uid}/scripts")
|
44
|
+
@agent.page.links.map {|i|
|
45
|
+
uid = i.href[%r|/scripts/show/(\d+)|, 1]
|
46
|
+
uid ? Script.new(
|
47
|
+
:uid => uid.to_i,
|
48
|
+
:name => i.text
|
49
|
+
) : nil
|
50
|
+
}.compact
|
51
|
+
end
|
52
|
+
|
53
|
+
def update(name, content)
|
54
|
+
script = list.find {|i|
|
55
|
+
i == name || i.name == name || i.uid == name
|
56
|
+
}
|
57
|
+
raise UserscriptsOrgError, "Script named #{name} is not found." if script.nil?
|
58
|
+
@agent.get BASE + "/scripts/edit_src/#{script.uid}"
|
59
|
+
|
60
|
+
form = @agent.page.forms.first
|
61
|
+
form["which_source"] = "textarea"
|
62
|
+
form["script[src]"] = content
|
63
|
+
|
64
|
+
@agent.submit(form, form.buttons.name("commit"))
|
65
|
+
if (@agent.page.root/"//p[text() = 'a few seconds ago.']").to_a.empty?
|
66
|
+
raise UserscriptsOrgError, "Update may failed"
|
67
|
+
end
|
68
|
+
script
|
69
|
+
end
|
70
|
+
|
71
|
+
def get(script)
|
72
|
+
uid = script.respond_to?(:uid) ? script.uid : script
|
73
|
+
@agent.get BASE + "/scripts/source/#{uid}.user.js"
|
74
|
+
content = @agent.page.content
|
75
|
+
Script.new({
|
76
|
+
:uid => uid,
|
77
|
+
:name => content[/@name\s+(.+)/, 1].chomp,
|
78
|
+
:content => content,
|
79
|
+
})
|
80
|
+
end
|
81
|
+
|
82
|
+
def create(content)
|
83
|
+
@agent.get BASE + "/scripts/new"
|
84
|
+
form = @agent.page.forms.first
|
85
|
+
form["which_source"] = "textarea"
|
86
|
+
form["script[src]"] = content
|
87
|
+
@agent.submit(form, form.buttons.name("commit"))
|
88
|
+
|
89
|
+
get(@agent.page.uri.to_s[%r|/scripts/show/(\d+)|, 1])
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
def check
|
94
|
+
unless logined?
|
95
|
+
raise NotLoggedinError, "Not Logged in. Please call 'login' method and check username and password"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
class Script < OpenStruct
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
class UserscriptsOrgTest < Test::Unit::TestCase
|
5
|
+
def test_login
|
6
|
+
usorg = UserscriptsOrg.new(Pit.get("userscripts.org", :require => {
|
7
|
+
"username" => "username",
|
8
|
+
"password" => "password"
|
9
|
+
})).login
|
10
|
+
end
|
11
|
+
end
|
metadata
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: userscripts_org
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- cho45
|
8
|
+
autorequire: ""
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-01-11 00:00:00 +09:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: pit
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: "0"
|
23
|
+
version:
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: mechanize
|
26
|
+
version_requirement:
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: "0"
|
32
|
+
version:
|
33
|
+
description: Manipulate userscripts.org
|
34
|
+
email: cho45@lowreal.net
|
35
|
+
executables:
|
36
|
+
- userjs
|
37
|
+
extensions: []
|
38
|
+
|
39
|
+
extra_rdoc_files:
|
40
|
+
- README
|
41
|
+
- ChangeLog
|
42
|
+
files:
|
43
|
+
- README
|
44
|
+
- ChangeLog
|
45
|
+
- Rakefile
|
46
|
+
- bin/userjs
|
47
|
+
- test/test_helper.rb
|
48
|
+
- test/userscripts_org_test.rb
|
49
|
+
- lib/userscripts_org.rb
|
50
|
+
has_rdoc: true
|
51
|
+
homepage: http://lowreal.rubyforge.org
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options:
|
54
|
+
- --title
|
55
|
+
- userscripts_org documentation
|
56
|
+
- --charset
|
57
|
+
- utf-8
|
58
|
+
- --opname
|
59
|
+
- index.html
|
60
|
+
- --line-numbers
|
61
|
+
- --main
|
62
|
+
- README
|
63
|
+
- --inline-source
|
64
|
+
- --exclude
|
65
|
+
- ^(examples|extras)/
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: "0"
|
73
|
+
version:
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: "0"
|
79
|
+
version:
|
80
|
+
requirements: []
|
81
|
+
|
82
|
+
rubyforge_project: lowreal
|
83
|
+
rubygems_version: 1.0.1
|
84
|
+
signing_key:
|
85
|
+
specification_version: 2
|
86
|
+
summary: Manipulate userscripts.org
|
87
|
+
test_files:
|
88
|
+
- test/test_helper.rb
|