wikian 0.1.2 → 0.1.7

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c71c17137f4f13b8c1ac7da558e1219fd50a4fc425fc22fa2d7d2060c10af91
4
- data.tar.gz: 579e18baa7d5c2a3fd3c0639561401212eac11ed6e623de3de7f8f200d0f2d3e
3
+ metadata.gz: 4365188a029e7d0d76f906b95ed64da8c5a8e6bdca0f31aa7b6fabde41d228be
4
+ data.tar.gz: 464993485465534f4d43fc7162d224780ed11ccf40bad13c0d66dda6e3de0b14
5
5
  SHA512:
6
- metadata.gz: 89a90e0003596d229cc1cf3dfffb3f6313cd76e475c943bcfbb0c7b3b9755d0a0eec32e4857ebca2cd90fc81254ac46212358ad975590516c132eeeda7c7aa22
7
- data.tar.gz: 73090be30a37ed6a8319e2bde35ec3301a6196bd747fbc95089125f01cc0a8ebed731c2675f08d4df3d602a937b233693020109b29abacadc4168b6db757f34c
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/
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- wikian (0.1.2)
4
+ wikian (0.1.7)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  # Wikian
2
2
 
3
- Want to be happier while editing wiki files?
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 -p User:$WIKI_USER.en.wikitionary.org.wiki
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
- You can then edit the the article in your favorite text editor and uploaded:
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
- 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.
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.
@@ -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
- g, get get wikitext file from a wikipedia article
89
- p, post post wikitext file to a wikipedia article
90
- s, search search wikitext file to a wikipedia article
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
@@ -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} #{e.message} in #{__FILE__}"
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
- #rvsection:
85
- # - 0
86
- # - 2
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
@@ -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.include?('-c')
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.include?('-m')
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
 
@@ -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} #{e.message} in #{__FILE__}"
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
- - Craig Noone
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
@@ -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} #{e.message} in #{__FILE__}"
71
+ puts "#{e.class} in #{__FILE__}. #{e.message}"
64
72
  exit
65
73
  end
66
74
 
@@ -1,3 +1,3 @@
1
1
  class Wikian
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.7"
3
3
  end
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.2
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