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 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