wikian 0.1.4 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +32 -5
- data/lib/wikian.rb +12 -23
- data/lib/wikian/contributions.rb +49 -0
- data/lib/wikian/get.rb +6 -10
- 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
- data/wikian.gemspec +3 -3
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c4f98b37baede27b1b4fbdddf337011f5b88de76cb84d9d6cccdbefb680f77f
|
4
|
+
data.tar.gz: 37c9ba12fc7dbcf9e5be14be87839ab88a22142b1249df3780fd325173c745ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d6270dac039bed670b05acfc0f4015435df75ca7b3436ccd49e3d8272135fa192f0759bbc1ee8f59eaee6efd1bd7d4fea6d76f664e9b8e5ea36d721a601b58f
|
7
|
+
data.tar.gz: 527e8c9f88925db6cd9bfa889165ef1043ce8d6c2e029249d1b1edbaae62f896ce34a5f82efd0500ee1d0441639d98a65964a16f85b891b8168ba026da227bd1
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# Wikian
|
2
2
|
|
3
|
-
Want to be happier
|
4
|
-
|
3
|
+
Want to be a happier [Wikipedian](https://en.wikipedia.org/wiki/Wikipedia:Wikipedians)?
|
4
|
+
Then you want [Wikian](https://rubygems.org/gems/wikian), which lets you edit Wikipedia pages locally, with your 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 article 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:
|
66
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
|
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 [mediawiki.vim](https://en.wikipedia.org/wiki/Help:Text_editor_support#Vim) which adds 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
|
@@ -53,7 +37,7 @@ class Wikian
|
|
53
37
|
|
54
38
|
@subcommand = args.shift
|
55
39
|
|
56
|
-
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)
|
57
41
|
|
58
42
|
if subcommand[0] == 'g'
|
59
43
|
api = Wikian::Get.new(args)
|
@@ -62,13 +46,16 @@ class Wikian
|
|
62
46
|
elsif subcommand[0] == 's'
|
63
47
|
api = Wikian::Search.new(args)
|
64
48
|
api.doit
|
49
|
+
elsif subcommand[0] == 'c'
|
50
|
+
api = Wikian::Contributions.new(args)
|
51
|
+
api.doit
|
65
52
|
else
|
66
53
|
api = Wikian::Post.new(args)
|
67
54
|
api.post
|
68
55
|
end
|
69
56
|
|
70
57
|
rescue UnknownSubcommandError => e
|
71
|
-
puts "#{e.class} #{e.message}"
|
58
|
+
puts "#{e.class} #{e.message} in #{__FILE__}"
|
72
59
|
end
|
73
60
|
|
74
61
|
def help
|
@@ -83,13 +70,15 @@ class Wikian
|
|
83
70
|
-m, --message MESSAGE add a commit message (HIGHLY recommended)
|
84
71
|
-p, --prepend prepend the input file
|
85
72
|
-r, --remove-cookie remove API cookie
|
73
|
+
-s, --section NUMBER section to edit
|
86
74
|
-t, --template create template configuration file
|
87
75
|
-v, --version
|
88
76
|
|
89
77
|
Subcommands:
|
90
|
-
|
91
|
-
|
92
|
-
|
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
|
93
82
|
|
94
83
|
Examples:
|
95
84
|
# create wiki.yml template
|
@@ -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
@@ -2,7 +2,6 @@ class Wikian
|
|
2
2
|
class WikianGetError < StandardError; end
|
3
3
|
class ExtractWikiError < WikianGetError; end
|
4
4
|
class ArgumentRequiredError < WikianGetError; end
|
5
|
-
class BadUrlError < WikianGetError; end
|
6
5
|
|
7
6
|
class Get < Subcommand
|
8
7
|
attr_accessor :title
|
@@ -14,7 +13,7 @@ class Wikian
|
|
14
13
|
|
15
14
|
url = URI(args.find{|arg| arg =~ URI.regexp})
|
16
15
|
|
17
|
-
raise BadUrlError unless url
|
16
|
+
raise BadUrlError unless url.path
|
18
17
|
|
19
18
|
@title = File.basename(url.path)
|
20
19
|
|
@@ -26,7 +25,7 @@ class Wikian
|
|
26
25
|
|
27
26
|
@api_url = URI("https://#{url.host}/w/api.php?#{query}")
|
28
27
|
rescue => e
|
29
|
-
puts "#{e.class} #{
|
28
|
+
puts "#{e.class} in #{__FILE__}. #{e.message}"
|
30
29
|
exit
|
31
30
|
end
|
32
31
|
|
@@ -57,7 +56,6 @@ class Wikian
|
|
57
56
|
|
58
57
|
# this is ugly, but Wikipedia is inconsistent in their JSON value for 'pages'. Sometimes it's a hash, sometimes it's an array.
|
59
58
|
if pages.respond_to? :keys
|
60
|
-
byebug
|
61
59
|
create_wiki.call(pages.values.first['title'], pages.values.first['revisions'])
|
62
60
|
else
|
63
61
|
pages.each do |page|
|
@@ -68,7 +66,7 @@ class Wikian
|
|
68
66
|
rescue => e
|
69
67
|
puts "An error occurred while extracting the wikitext",
|
70
68
|
"Try using a new config file by pasing the '-t' option.",
|
71
|
-
"Or pass '-d' option for debugging"
|
69
|
+
"Or pass the '-d' option for debugging"
|
72
70
|
exit
|
73
71
|
end
|
74
72
|
|
@@ -84,15 +82,13 @@ class Wikian
|
|
84
82
|
- revisions
|
85
83
|
rvprop:
|
86
84
|
- content
|
87
|
-
|
88
|
-
|
89
|
-
|
85
|
+
#rvsection: # get specific sections
|
86
|
+
# - 0
|
87
|
+
# - 2
|
90
88
|
rvslots:
|
91
89
|
- main
|
92
90
|
formatversion:
|
93
91
|
- 2
|
94
|
-
format:
|
95
|
-
- json
|
96
92
|
eos
|
97
93
|
end
|
98
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
data/wikian.gemspec
CHANGED
@@ -6,9 +6,9 @@ Gem::Specification.new do |spec|
|
|
6
6
|
spec.authors = ["sergioro"]
|
7
7
|
spec.email = ["yo@sergioro.com"]
|
8
8
|
|
9
|
-
spec.summary = %q{Get and
|
10
|
-
spec.description = %q{Get and
|
11
|
-
|
9
|
+
spec.summary = %q{Get and update Wikipedia articles}
|
10
|
+
spec.description = %q{Get and update Wikipedia articles}
|
11
|
+
spec.homepage = "https://sergioro.mx/posts/wikian"
|
12
12
|
spec.license = "MIT"
|
13
13
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
14
14
|
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
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.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sergioro
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-09-
|
11
|
+
date: 2020-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description: Get and
|
13
|
+
description: Get and update Wikipedia articles
|
14
14
|
email:
|
15
15
|
- yo@sergioro.com
|
16
16
|
executables:
|
@@ -32,13 +32,15 @@ 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
|
39
41
|
- lib/wikian/version.rb
|
40
42
|
- wikian.gemspec
|
41
|
-
homepage:
|
43
|
+
homepage: https://sergioro.mx/posts/wikian
|
42
44
|
licenses:
|
43
45
|
- MIT
|
44
46
|
metadata: {}
|
@@ -60,5 +62,5 @@ requirements: []
|
|
60
62
|
rubygems_version: 3.1.4
|
61
63
|
signing_key:
|
62
64
|
specification_version: 4
|
63
|
-
summary: Get and
|
65
|
+
summary: Get and update Wikipedia articles
|
64
66
|
test_files: []
|