wikian 0.1.2 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -18
- data/Gemfile.lock +1 -1
- data/README.md +32 -5
- data/lib/wikian.rb +19 -23
- data/lib/wikian/contributions.rb +49 -0
- data/lib/wikian/get.rb +7 -8
- data/lib/wikian/monkeypatches.rb +24 -0
- data/lib/wikian/post.rb +6 -3
- data/lib/wikian/search.rb +3 -5
- data/lib/wikian/subcommand.rb +9 -1
- data/lib/wikian/version.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4365188a029e7d0d76f906b95ed64da8c5a8e6bdca0f31aa7b6fabde41d228be
|
4
|
+
data.tar.gz: 464993485465534f4d43fc7162d224780ed11ccf40bad13c0d66dda6e3de0b14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b7393793bb7f0c62d1e1a3910a1a99e39c7abd4e0e2374eaf7e376f2cbc125734543feb3a16cda505668b7cb09dd90d35903c87367293d82afc9c408d9768d6
|
7
|
+
data.tar.gz: 3c2ccd2cb6a1b753175a9b0a9bd0b545ea6ea3346418a17bd555df28e9bce88b4c236fab0a800018a9839c0a3e76c21abcff3e62acfdfd140c043e2b6cbb91bd
|
data/.gitignore
CHANGED
@@ -1,15 +1,6 @@
|
|
1
|
-
# files without extensions except directories
|
2
|
-
*
|
3
|
-
!/**/
|
4
|
-
!?*.*
|
5
|
-
|
6
1
|
# directories
|
7
|
-
.bundle/
|
8
|
-
_yardoc/
|
9
|
-
coverage/
|
10
2
|
doc/
|
11
3
|
pkg/
|
12
|
-
spec/reports/
|
13
4
|
tmp/
|
14
5
|
vendor/
|
15
6
|
|
@@ -22,6 +13,7 @@ vendor/
|
|
22
13
|
.*.swp
|
23
14
|
.DS_Store
|
24
15
|
.byebug
|
16
|
+
.byebugrc
|
25
17
|
.idea
|
26
18
|
.project
|
27
19
|
.rake*
|
@@ -46,12 +38,3 @@ secrets.yml
|
|
46
38
|
![MR]akefile
|
47
39
|
!bin/**/[^.]*
|
48
40
|
!exe/**/[^.]*
|
49
|
-
|
50
|
-
/.bundle/
|
51
|
-
/.yardoc
|
52
|
-
/_yardoc/
|
53
|
-
/coverage/
|
54
|
-
/doc/
|
55
|
-
/pkg/
|
56
|
-
/spec/reports/
|
57
|
-
/tmp/
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# Wikian
|
2
2
|
|
3
|
-
Want to be happier
|
4
|
-
Me too, that's why I use [Wikian](https://rubygems.org/gems/wikian)
|
3
|
+
Want to be a happier [Wikipedian](https://en.wikipedia.org/wiki/Wikipedia:Wikipedians)?
|
4
|
+
Me too, that's why I use [Wikian](https://rubygems.org/gems/wikian) which lets me edit wikipedia pages locally, with my favorite text editor.
|
5
|
+
To install it:
|
5
6
|
|
6
7
|
```
|
7
8
|
$ gem install wikian
|
@@ -39,7 +40,7 @@ $ cat User:$WIKI_USER.en.wikitionary.org.wiki
|
|
39
40
|
== Last section==
|
40
41
|
testing
|
41
42
|
|
42
|
-
$ wi post -
|
43
|
+
$ wi post -a User:$WIKI_USER.en.wikitionary.org.wiki
|
43
44
|
Article uploaded
|
44
45
|
```
|
45
46
|
|
@@ -55,12 +56,38 @@ Writing to Wikipedia:Sandbox.en.wikipedia.org.json
|
|
55
56
|
Writing to Wikipedia:Sandbox.en.wikipedia.org.wiki
|
56
57
|
```
|
57
58
|
|
58
|
-
|
59
|
+
Then edit the the article in your favorite text editor and upload it:
|
59
60
|
|
60
61
|
```bash
|
61
62
|
$ wi post Wikipedia:Sandbox.en.wikipedia.org.wiki
|
62
63
|
Article uploaded
|
63
64
|
```
|
64
65
|
|
65
|
-
|
66
|
+
To append wikitext to section 2:
|
67
|
+
|
68
|
+
```bash
|
69
|
+
$ wi post -s 2 Wikipedia:Sandbox.en.wikipedia.org.wiki
|
70
|
+
Article uploaded
|
71
|
+
```
|
72
|
+
|
73
|
+
To search for a pattern in Wikipedia:
|
74
|
+
|
75
|
+
```
|
76
|
+
$ wi search -t
|
77
|
+
Creating template wiki.yml
|
66
78
|
|
79
|
+
$ wi s
|
80
|
+
Writing to Mr. Fixit.json
|
81
|
+
```
|
82
|
+
|
83
|
+
To get your last 10 wikipedia contributions:
|
84
|
+
|
85
|
+
```
|
86
|
+
$ wi c -t
|
87
|
+
Creating template wiki.yml
|
88
|
+
|
89
|
+
$ wi c
|
90
|
+
Writing to User:Example_User.contributions.en.wikipedia.org.json
|
91
|
+
```
|
92
|
+
|
93
|
+
Vim users should try out [mediawiki.vim](https://en.wikipedia.org/wiki/Help:Text_editor_support#Vim) which defines syntax highlighting and abbreviations for wikitext files.
|
data/lib/wikian.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
$LOAD_PATH.unshift __dir__
|
2
2
|
|
3
3
|
require 'wikian/subcommand'
|
4
|
+
require 'wikian/contributions'
|
4
5
|
require 'wikian/get'
|
6
|
+
require 'wikian/monkeypatches'
|
5
7
|
require 'wikian/post'
|
6
8
|
require 'wikian/search'
|
7
9
|
require 'wikian/version'
|
@@ -13,24 +15,6 @@ require 'net/http'
|
|
13
15
|
require 'open-uri'
|
14
16
|
require 'yaml'
|
15
17
|
|
16
|
-
# external libraries
|
17
|
-
require 'byebug'
|
18
|
-
|
19
|
-
class Array
|
20
|
-
# return true if `self` and `elms` have any element in common
|
21
|
-
def have?(elms)
|
22
|
-
(self & elms).length > 0 ? true : false
|
23
|
-
end
|
24
|
-
alias_method :has?, :have?
|
25
|
-
end
|
26
|
-
|
27
|
-
class Hash
|
28
|
-
# return a query string representation of a hash
|
29
|
-
def to_query
|
30
|
-
URI.decode(URI.encode_www_form(self))
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
18
|
class Wikian
|
35
19
|
class WikianError < StandardError; end
|
36
20
|
class UnknownSubcommandError < WikianError; end
|
@@ -47,11 +31,13 @@ class Wikian
|
|
47
31
|
def run
|
48
32
|
if args.have?(%w(-h --help))
|
49
33
|
help
|
34
|
+
elsif args.have?(%w(-v --version))
|
35
|
+
version
|
50
36
|
end
|
51
37
|
|
52
38
|
@subcommand = args.shift
|
53
39
|
|
54
|
-
raise(UnknownSubcommandError, "Unkown Subcommand") unless %w(g p s get post search).include?(subcommand)
|
40
|
+
raise(UnknownSubcommandError, "Unkown Subcommand") unless %w(c g p s contributions get post search).include?(subcommand)
|
55
41
|
|
56
42
|
if subcommand[0] == 'g'
|
57
43
|
api = Wikian::Get.new(args)
|
@@ -60,13 +46,16 @@ class Wikian
|
|
60
46
|
elsif subcommand[0] == 's'
|
61
47
|
api = Wikian::Search.new(args)
|
62
48
|
api.doit
|
49
|
+
elsif subcommand[0] == 'c'
|
50
|
+
api = Wikian::Contributions.new(args)
|
51
|
+
api.doit
|
63
52
|
else
|
64
53
|
api = Wikian::Post.new(args)
|
65
54
|
api.post
|
66
55
|
end
|
67
56
|
|
68
57
|
rescue UnknownSubcommandError => e
|
69
|
-
puts "#{e.class} #{e.message}"
|
58
|
+
puts "#{e.class} #{e.message} in #{__FILE__}"
|
70
59
|
end
|
71
60
|
|
72
61
|
def help
|
@@ -81,13 +70,15 @@ class Wikian
|
|
81
70
|
-m, --message MESSAGE add a commit message (HIGHLY recommended)
|
82
71
|
-p, --prepend prepend the input file
|
83
72
|
-r, --remove-cookie remove API cookie
|
73
|
+
-s, --section NUMBER section to edit
|
84
74
|
-t, --template create template configuration file
|
85
75
|
-v, --version
|
86
76
|
|
87
77
|
Subcommands:
|
88
|
-
|
89
|
-
|
90
|
-
|
78
|
+
c, contributions [N] get user last N contributions. N defaults to 20
|
79
|
+
g, get get wikitext file from a wikipedia article
|
80
|
+
p, post post wikitext file to a wikipedia article
|
81
|
+
s, search search wikitext file to a wikipedia article
|
91
82
|
|
92
83
|
Examples:
|
93
84
|
# create wiki.yml template
|
@@ -119,4 +110,9 @@ class Wikian
|
|
119
110
|
eos
|
120
111
|
exit
|
121
112
|
end
|
113
|
+
|
114
|
+
def version
|
115
|
+
puts "wikian #{VERSION}"
|
116
|
+
exit
|
117
|
+
end
|
122
118
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class Wikian
|
2
|
+
class WikianGetError < StandardError; end
|
3
|
+
class ExtractWikiError < WikianGetError; end
|
4
|
+
class ArgumentRequiredError < WikianGetError; end
|
5
|
+
|
6
|
+
class Contributions < Subcommand
|
7
|
+
DEFAULT_MAX_CONTRIBUTIONS = 20
|
8
|
+
|
9
|
+
def initialize(args)
|
10
|
+
super
|
11
|
+
|
12
|
+
max_contributions = args.find(&:numeric?) || DEFAULT_MAX_CONTRIBUTIONS
|
13
|
+
|
14
|
+
raise(BadUrlError, "Try passing the '-t' option") unless yaml['meta']['site']
|
15
|
+
|
16
|
+
@output_file = 'User:' + ENV['WIKI_USER'] + '.contributions.' + yaml['meta']['site']
|
17
|
+
|
18
|
+
@params.merge!('ucuser' => ENV['WIKI_USER'], 'uclimit' => max_contributions, 'format' => Wikian::RESPONSE_FORMAT)
|
19
|
+
|
20
|
+
@query = @params.to_query
|
21
|
+
|
22
|
+
@api_url = URI("https://#{yaml['meta']['site']}/w/api.php?#{query}")
|
23
|
+
rescue => e
|
24
|
+
puts "#{e.class} in #{__FILE__}. #{e.message}"
|
25
|
+
exit
|
26
|
+
end
|
27
|
+
|
28
|
+
def template
|
29
|
+
<<~eos
|
30
|
+
meta:
|
31
|
+
http_method: get
|
32
|
+
site: en.wikipedia.org
|
33
|
+
headers:
|
34
|
+
#accept-encoding: gzip
|
35
|
+
user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
|
36
|
+
api:
|
37
|
+
action:
|
38
|
+
- query
|
39
|
+
list:
|
40
|
+
- usercontribs
|
41
|
+
ucprop:
|
42
|
+
- title
|
43
|
+
- comment
|
44
|
+
- timestamp
|
45
|
+
- sizediff
|
46
|
+
eos
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/wikian/get.rb
CHANGED
@@ -13,6 +13,8 @@ class Wikian
|
|
13
13
|
|
14
14
|
url = URI(args.find{|arg| arg =~ URI.regexp})
|
15
15
|
|
16
|
+
raise BadUrlError unless url.path
|
17
|
+
|
16
18
|
@title = File.basename(url.path)
|
17
19
|
|
18
20
|
@output_file = title + '.' + url.host
|
@@ -23,7 +25,7 @@ class Wikian
|
|
23
25
|
|
24
26
|
@api_url = URI("https://#{url.host}/w/api.php?#{query}")
|
25
27
|
rescue => e
|
26
|
-
puts "#{e.class} #{
|
28
|
+
puts "#{e.class} in #{__FILE__}. #{e.message}"
|
27
29
|
exit
|
28
30
|
end
|
29
31
|
|
@@ -54,7 +56,6 @@ class Wikian
|
|
54
56
|
|
55
57
|
# this is ugly, but Wikipedia is inconsistent in their JSON value for 'pages'. Sometimes it's a hash, sometimes it's an array.
|
56
58
|
if pages.respond_to? :keys
|
57
|
-
byebug
|
58
59
|
create_wiki.call(pages.values.first['title'], pages.values.first['revisions'])
|
59
60
|
else
|
60
61
|
pages.each do |page|
|
@@ -65,7 +66,7 @@ class Wikian
|
|
65
66
|
rescue => e
|
66
67
|
puts "An error occurred while extracting the wikitext",
|
67
68
|
"Try using a new config file by pasing the '-t' option.",
|
68
|
-
"Or pass '-d' option for debugging"
|
69
|
+
"Or pass the '-d' option for debugging"
|
69
70
|
exit
|
70
71
|
end
|
71
72
|
|
@@ -81,15 +82,13 @@ class Wikian
|
|
81
82
|
- revisions
|
82
83
|
rvprop:
|
83
84
|
- content
|
84
|
-
|
85
|
-
|
86
|
-
|
85
|
+
#rvsection: # get specific sections
|
86
|
+
# - 0
|
87
|
+
# - 2
|
87
88
|
rvslots:
|
88
89
|
- main
|
89
90
|
formatversion:
|
90
91
|
- 2
|
91
|
-
format:
|
92
|
-
- json
|
93
92
|
eos
|
94
93
|
end
|
95
94
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Array
|
2
|
+
# return true if `self` and `elms` have any element in common
|
3
|
+
def have?(elms)
|
4
|
+
(self & elms).length > 0 ? true : false
|
5
|
+
end
|
6
|
+
alias_method :has?, :have?
|
7
|
+
end
|
8
|
+
|
9
|
+
class Hash
|
10
|
+
# return a query string representation of a hash
|
11
|
+
def to_query
|
12
|
+
URI.decode(URI.encode_www_form(self))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class String
|
17
|
+
# check is a string is numeric
|
18
|
+
#
|
19
|
+
# usage: 'asdf'.numeric? # => false
|
20
|
+
# '5.1'.numeric? # => true
|
21
|
+
def numeric?
|
22
|
+
Float(self) != nil rescue false
|
23
|
+
end
|
24
|
+
end
|
data/lib/wikian/post.rb
CHANGED
@@ -23,7 +23,7 @@ class Wikian
|
|
23
23
|
|
24
24
|
@debug = (args & %w(-d --debug)).length > 0 ? true : false
|
25
25
|
rescue => e
|
26
|
-
puts "#{e.class} in #{__FILE__}"
|
26
|
+
puts "#{e.class} in #{__FILE__}. #{e.message}"
|
27
27
|
exit
|
28
28
|
end
|
29
29
|
|
@@ -107,12 +107,15 @@ class Wikian
|
|
107
107
|
# pass the wikitext in request body
|
108
108
|
@body_text = wikitext
|
109
109
|
end
|
110
|
-
if args.
|
110
|
+
if args.have?(%w(-c --captcha))
|
111
111
|
params['captchaid'], params['captchaword'] = args[args.index('-c')+1].split(':')
|
112
112
|
end
|
113
|
-
if args.
|
113
|
+
if args.have?(%w(-m --message))
|
114
114
|
params['summary'] = args[args.index('-m')+1]
|
115
115
|
end
|
116
|
+
if args.have?(%w(-s --section))
|
117
|
+
params['section'] = args[args.index('-s')+1]
|
118
|
+
end
|
116
119
|
@query = URI.encode_www_form(params)
|
117
120
|
end
|
118
121
|
|
data/lib/wikian/search.rb
CHANGED
@@ -14,7 +14,7 @@ class Wikian
|
|
14
14
|
|
15
15
|
@api_url = URI("https://#{yaml['meta']['site']}/w/api.php?#{query}")
|
16
16
|
rescue => e
|
17
|
-
puts "#{e.class} #{
|
17
|
+
puts "#{e.class} in #{__FILE__}. #{e.message}"
|
18
18
|
exit
|
19
19
|
end
|
20
20
|
|
@@ -30,10 +30,8 @@ class Wikian
|
|
30
30
|
- query
|
31
31
|
list:
|
32
32
|
- search
|
33
|
-
srsearch:
|
34
|
-
-
|
35
|
-
format:
|
36
|
-
- json
|
33
|
+
srsearch: # text to search for. You can use multiple
|
34
|
+
- Mr. Fixit
|
37
35
|
eos
|
38
36
|
end
|
39
37
|
end
|
data/lib/wikian/subcommand.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
#!/usr/bin/env -S ruby -W0
|
2
2
|
class Wikian
|
3
|
+
class WikianSubcommandError < StandardError; end
|
4
|
+
class MissingConfigFileError < WikianSubcommandError; end
|
5
|
+
class BadUrlError < WikianSubcommandError; end
|
6
|
+
|
3
7
|
# class to be inherited by other Wikian classes
|
4
8
|
class Subcommand
|
5
9
|
attr_accessor :args, :res, :yaml, :query, :title, :api_url, :debug, :output_file
|
@@ -15,10 +19,14 @@ class Wikian
|
|
15
19
|
|
16
20
|
@debug = (args & %w(-d --debug)).length > 0 ? true : false
|
17
21
|
|
22
|
+
raise MissingConfigFileError unless File.exist?(Wikian::CONFIG_FILE)
|
18
23
|
@yaml=YAML.load(File.open(Wikian::CONFIG_FILE))
|
19
24
|
|
20
25
|
# some params like 'titles' can contain multiple entries joined by '|'. More info in Wikipedia API docs
|
21
26
|
@params = Hash[yaml['api'].keys.zip(yaml['api'].values.map{|arr| arr.join("|")})]
|
27
|
+
rescue MissingConfigFileError => e
|
28
|
+
puts "#{e.class} try passing the '-t' option to generate #{Wikian::CONFIG_FILE} in #{__FILE__}"
|
29
|
+
exit
|
22
30
|
end
|
23
31
|
|
24
32
|
def make_template
|
@@ -60,7 +68,7 @@ class Wikian
|
|
60
68
|
|
61
69
|
write_response
|
62
70
|
rescue => e
|
63
|
-
puts "#{e.class} #{
|
71
|
+
puts "#{e.class} in #{__FILE__}. #{e.message}"
|
64
72
|
exit
|
65
73
|
end
|
66
74
|
|
data/lib/wikian/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wikian
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sergioro
|
@@ -32,7 +32,9 @@ files:
|
|
32
32
|
- exe/wikian
|
33
33
|
- lib/.gitignore
|
34
34
|
- lib/wikian.rb
|
35
|
+
- lib/wikian/contributions.rb
|
35
36
|
- lib/wikian/get.rb
|
37
|
+
- lib/wikian/monkeypatches.rb
|
36
38
|
- lib/wikian/post.rb
|
37
39
|
- lib/wikian/search.rb
|
38
40
|
- lib/wikian/subcommand.rb
|