wikian 0.1.0 → 0.1.5

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: 1b0fc9564425d05bbd600b386508385cbbd089f2a9174fcebee5020933aa8e2f
4
- data.tar.gz: d56b498ab07f9fa12a754248560963cf7dfda45874c7540e6840f832bad605df
3
+ metadata.gz: c7641f6124dd8e9db31fa2dc7688146107db693d65d8347af57d45ee40205519
4
+ data.tar.gz: a9def9f5d7d2cc6a00c375f9e690e96aaf193a601359ae98fb1f4abea1f31402
5
5
  SHA512:
6
- metadata.gz: 5eafc016cab2eae0f4ebb8288d41ba5e445562a5d51c9ec923be48a1b332988558ea1874a2f5e7a08a4cd7443e214257f0a1f593b74b8a426373dd26bcfc9895
7
- data.tar.gz: d98f2043ada681f9fc2a88433c7e852908b2af9835efa3da518aa05619b8bb746442c247eda6611991d8209e5833f150b026a578abbcbdc7ebc910272f2d0ada
6
+ metadata.gz: d7887e82d7f20332717314772cba3ca4bbb4d7cb54d5a1dab3235f1c248654949c3427feaa6915324b437117d0e87147c219a2acbed7654ddeb22c89541abc50
7
+ data.tar.gz: 37998e9226c13ddfa504921859e4da1f9f8e96a19edcc617faaf30a7a387d80fff4768e29c868f9ebfb363c168baaada1f3280cbc241c3f91c10c732e378c790
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/
@@ -0,0 +1,21 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ wikian (0.1.5)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ minitest (5.14.2)
10
+ rake (12.3.3)
11
+
12
+ PLATFORMS
13
+ ruby
14
+
15
+ DEPENDENCIES
16
+ minitest (~> 5.0)
17
+ rake (~> 12.0)
18
+ wikian!
19
+
20
+ BUNDLED WITH
21
+ 2.1.4
data/README.md CHANGED
@@ -1,40 +1,66 @@
1
1
  # Wikian
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/wikian`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ Want to be happier while editing wiki files?
4
+ Me too, that's why I use [Wikian](https://rubygems.org/gems/wikian):
4
5
 
5
- TODO: Delete this and the text above, and describe your gem
6
+ ```
7
+ $ gem install wikian
8
+ ```
9
+
10
+ To use it create a Wikipedia account, then define and export the `WIKI_USER` and `SECRET_WIKI_PASS` variables in your `.bashrc`:
6
11
 
7
- ## Installation
12
+ ```bash
13
+ export WIKI_USER='Example_wiki_user_name'
14
+ export SECRET_WIKI_PASS='example_wiki_password'
15
+ ```
8
16
 
9
- Add this line to your application's Gemfile:
17
+ Wikian works across [Wikimedia sites](https://meta.wikimedia.org/wiki/Our_projects) and follows the file naming convention:
10
18
 
11
- ```ruby
12
- gem 'wikian'
13
19
  ```
20
+ <article_name>.<site>.wiki
21
+ ```
22
+
23
+ Some valid file names:
14
24
 
15
- And then execute:
25
+ ```
26
+ Spider_Man.en.wikipedia.org.wiki
27
+ Spider_Man.es.wikipedia.org.wiki
28
+ excelsior.es.wiktionary.org.wiki
29
+ User:Example_User.www.mediawiki.org.wiki
30
+ ```
16
31
 
17
- $ bundle install
32
+ #### Examples
18
33
 
19
- Or install it yourself as:
34
+ To append some text to your Wiktionary user profile:
20
35
 
21
- $ gem install wikian
36
+ ```bash
37
+ $ cat User:$WIKI_USER.en.wikitionary.org.wiki
22
38
 
23
- ## Usage
39
+ == Last section==
40
+ testing
24
41
 
25
- TODO: Write usage instructions here
42
+ $ wi post -p User:$WIKI_USER.en.wikitionary.org.wiki
43
+ Article uploaded
44
+ ```
26
45
 
27
- ## Development
46
+ To get an article's wikitext:
28
47
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
48
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
49
+ ```
50
+ $ wi get -t
51
+ Creating template wiki.yml
32
52
 
33
- ## Contributing
53
+ $ wi g https://en.wikipedia.org/wiki/Wikipedia:Sandbox
54
+ Writing to Wikipedia:Sandbox.en.wikipedia.org.json
55
+ Writing to Wikipedia:Sandbox.en.wikipedia.org.wiki
56
+ ```
34
57
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/wikian.
58
+ You can then edit the the article in your favorite text editor and uploaded:
36
59
 
60
+ ```bash
61
+ $ wi post Wikipedia:Sandbox.en.wikipedia.org.wiki
62
+ Article uploaded
63
+ ```
37
64
 
38
- ## License
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.
39
66
 
40
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/exe/wi ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
4
+
5
+ require "wikian"
6
+
7
+ Wikian.new(nil).help if ARGV.empty?
8
+
9
+ Wikian.new(*ARGV).run
data/exe/wikian CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
4
-
5
- require "wikian"
3
+ # fall back to `wi` executable
4
+ system("wi #{ARGV.join(' ')}")
File without changes
@@ -1,8 +1,129 @@
1
1
  $LOAD_PATH.unshift __dir__
2
2
 
3
- require "wikian/version"
3
+ require 'wikian/subcommand'
4
+ require 'wikian/get'
5
+ require 'wikian/post'
6
+ require 'wikian/search'
7
+ require 'wikian/version'
4
8
 
5
- module Wikian
6
- class Error < StandardError; end
7
- # Your code goes here...
9
+ # stdlib
10
+ require 'fileutils'
11
+ require 'json'
12
+ require 'net/http'
13
+ require 'open-uri'
14
+ require 'yaml'
15
+
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
+ class Wikian
35
+ class WikianError < StandardError; end
36
+ class UnknownSubcommandError < WikianError; end
37
+
38
+ attr_accessor :subcommand, :args
39
+
40
+ CONFIG_FILE = 'wiki.yml'
41
+ RESPONSE_FORMAT = 'json'
42
+
43
+ def initialize(*args)
44
+ @args = args
45
+ end
46
+
47
+ def run
48
+ if args.have?(%w(-h --help))
49
+ help
50
+ elsif args.have?(%w(-v --version))
51
+ version
52
+ end
53
+
54
+ @subcommand = args.shift
55
+
56
+ raise(UnknownSubcommandError, "Unkown Subcommand") unless %w(g p s get post search).include?(subcommand)
57
+
58
+ if subcommand[0] == 'g'
59
+ api = Wikian::Get.new(args)
60
+ api.doit
61
+ api.extract_wikitext
62
+ elsif subcommand[0] == 's'
63
+ api = Wikian::Search.new(args)
64
+ api.doit
65
+ else
66
+ api = Wikian::Post.new(args)
67
+ api.post
68
+ end
69
+
70
+ rescue UnknownSubcommandError => e
71
+ puts "#{e.class} #{e.message}"
72
+ end
73
+
74
+ def help
75
+ puts <<~eos
76
+ Usage:
77
+ wiki [options] <subcommand> [url|file]
78
+
79
+ Options:
80
+ -a, --append append the input file
81
+ -c, --captcha ID:MESSAGE captcha info
82
+ -d, --debug debug
83
+ -m, --message MESSAGE add a commit message (HIGHLY recommended)
84
+ -p, --prepend prepend the input file
85
+ -r, --remove-cookie remove API cookie
86
+ -t, --template create template configuration file
87
+ -v, --version
88
+
89
+ Subcommands:
90
+ g, get get wikitext file from a wikipedia article
91
+ p, post post wikitext file to a wikipedia article
92
+ s, search search wikitext file to a wikipedia article
93
+
94
+ Examples:
95
+ # create wiki.yml template
96
+ wiki -t
97
+
98
+ # download article and create response and wikitext files
99
+ wiki get https://en.wikipedia.org/wiki/Spider-Man
100
+
101
+ # upload file to English Wikipedia
102
+ wiki post Spider-Man.en.wikipedia.org.wiki
103
+
104
+ # upload file to Spanish Wikipedia
105
+ wiki post Spider-Man.es.wikipedia.org.wiki
106
+
107
+ # upload file to English Wiktionary
108
+ wiki file to Spider-Man.es.wiktionary.org.wiki
109
+
110
+ # append new section to article
111
+ wiki post -a Spider-Man-new-section.wiki
112
+
113
+ # heavy use of the API may require cache validation
114
+ wiki post -c 1234:someMessage spider-Man.wiki
115
+
116
+ Comments:
117
+ Posted files must follow the convention:
118
+ <article_name>.<host>.wiki
119
+ where <host> is a wikimedia site.
120
+ More info at: https://meta.wikimedia.org/wiki/Our_projects
121
+ eos
122
+ exit
123
+ end
124
+
125
+ def version
126
+ puts "wikian #{VERSION}"
127
+ exit
128
+ end
8
129
  end
@@ -0,0 +1,99 @@
1
+ class Wikian
2
+ class WikianGetError < StandardError; end
3
+ class ExtractWikiError < WikianGetError; end
4
+ class ArgumentRequiredError < WikianGetError; end
5
+ class BadUrlError < WikianGetError; end
6
+
7
+ class Get < Subcommand
8
+ attr_accessor :title
9
+
10
+ def initialize(args)
11
+ raise ArgumentRequiredError if args.empty?
12
+
13
+ super
14
+
15
+ url = URI(args.find{|arg| arg =~ URI.regexp})
16
+
17
+ raise BadUrlError unless url.path
18
+
19
+ @title = File.basename(url.path)
20
+
21
+ @output_file = title + '.' + url.host
22
+
23
+ @params.merge!('titles' => title, 'format' => Wikian::RESPONSE_FORMAT)
24
+
25
+ @query = @params.to_query
26
+
27
+ @api_url = URI("https://#{url.host}/w/api.php?#{query}")
28
+ rescue => e
29
+ puts "#{e.class} #{e.message} in #{__FILE__}"
30
+ exit
31
+ end
32
+
33
+ # extract wikitext from the response file and save it into a `.wiki` file
34
+ #
35
+ # return: nil
36
+ def extract_wikitext
37
+ if !res['content-type'].match?('json') || !(pages = JSON.parse(res.body).dig('query','pages'))
38
+ raise ExtractWikiError, 'JSON response has no pages'
39
+ end
40
+
41
+ create_wiki = -> (title, revisions) do
42
+ revisions.each do |revision|
43
+ wiki_file= File.basename(response_file, File.extname(response_file)) + '.wiki'
44
+ if revision['revid'].nil? && revisions.size > 1
45
+ STDERR.puts "Warning: you should specify 'revid' in #{Wikian::CONFIG_FILE} to prevent overriding different revisions"
46
+ end
47
+ File.open(wiki_file,'w') do |f|
48
+ content = revision.dig('slots', 'main', 'content') ||
49
+ revision.dig('slots', '*') ||
50
+ revision.dig('*')
51
+ STDERR.puts "Warning: nil 'content' in #{Wikian::CONFIG_FILE}" unless content
52
+ STDERR.puts "Writing to #{wiki_file}"
53
+ f.puts content
54
+ end
55
+ end
56
+ end
57
+
58
+ # this is ugly, but Wikipedia is inconsistent in their JSON value for 'pages'. Sometimes it's a hash, sometimes it's an array.
59
+ if pages.respond_to? :keys
60
+ byebug
61
+ create_wiki.call(pages.values.first['title'], pages.values.first['revisions'])
62
+ else
63
+ pages.each do |page|
64
+ create_wiki.call(page['title'], page['revisions'])
65
+ end
66
+ end
67
+
68
+ rescue => e
69
+ puts "An error occurred while extracting the wikitext",
70
+ "Try using a new config file by pasing the '-t' option.",
71
+ "Or pass '-d' option for debugging"
72
+ exit
73
+ end
74
+
75
+ def template
76
+ <<~eos
77
+ meta:
78
+ headers:
79
+ user-agent: Wikian
80
+ api:
81
+ action:
82
+ - query
83
+ prop:
84
+ - revisions
85
+ rvprop:
86
+ - content
87
+ #rvsection:
88
+ # - 0
89
+ # - 2
90
+ rvslots:
91
+ - main
92
+ formatversion:
93
+ - 2
94
+ format:
95
+ - json
96
+ eos
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,140 @@
1
+ class Wikian
2
+ class WikianPostError < StandardError; end
3
+ class WikiFileError < WikianPostError; end
4
+
5
+ class Post
6
+ attr_accessor :args, :baseurl, :header, :input_file, :debug, :login_token,
7
+ :login_cookie, :csrf_token, :csrf_cookie, :query, :body_text, :username
8
+
9
+ def initialize(args)
10
+ @args = args
11
+
12
+ # input wikitext file
13
+ @input_file = args.find{|f| File.exist? f}
14
+ raise WikiFileError unless input_file
15
+
16
+ site = input_file.match(/\.(.*)\.wiki/)[1]
17
+
18
+ @baseurl = "https://#{site}/w/api.php"
19
+
20
+ @header = {}
21
+
22
+ @username = ENV['WIKI_USER']
23
+
24
+ @debug = (args & %w(-d --debug)).length > 0 ? true : false
25
+ rescue => e
26
+ puts "#{e.class} in #{__FILE__}"
27
+ exit
28
+ end
29
+
30
+ def post
31
+ # remove expired cookie
32
+ if expired_cookie? || args.have?(%w(-r --remove-cookie))
33
+ FileUtils.rm_f(csrf_cookie_file)
34
+ end
35
+
36
+ # csrf_cookie can be reused among multiple requests. But csrf_token must be updated on each request
37
+ if File.exist?(csrf_cookie_file)
38
+ @csrf_cookie = File.read(csrf_cookie_file)
39
+ else
40
+ get_login_token
41
+
42
+ get_csrf_cookie
43
+ end
44
+ get_csrf_token
45
+
46
+ build_query_string
47
+
48
+ upload_article
49
+ end
50
+
51
+ # check if the cookie is expired (older than an hour)
52
+ def expired_cookie?
53
+ File.exist?(csrf_cookie_file) && ((Time.now - File.open(csrf_cookie_file).stat.ctime)/3600 > 1)
54
+ end
55
+
56
+ def csrf_cookie_file
57
+ 'csrf_cookie'
58
+ end
59
+
60
+ def remove_cookie_metadata(cookie)
61
+ cookie.gsub(/secure;|path=.*?[,;]|httponly[;,]|samesite=.*?[;,]|expires=.....*?[,;]|domain=.*?;|max-age=.*?[;,]/i,'').squeeze(' ')
62
+ end
63
+
64
+ def get_login_token
65
+ puts("Getting login token/cookie") if debug
66
+ url = URI("#{baseurl}?action=query&meta=tokens&format=json&type=login")
67
+ res = URI.open(url)
68
+ json = JSON.parse(res.read)
69
+ @login_token = json.dig('query','tokens','logintoken')
70
+ @login_cookie = remove_cookie_metadata(res.meta['set-cookie'])
71
+ puts(json) if debug
72
+ end
73
+
74
+ def get_csrf_cookie
75
+ puts("\nGetting csrf cookie using token #{login_token}") if debug
76
+ url = URI("#{baseurl}?action=login&lgname=#{username}&format=json")
77
+ req = Net::HTTP::Post.new(url, header.merge('cookie' => login_cookie, 'content-type' => 'application/x-www-form-urlencoded'))
78
+ req.set_form_data('lgpassword' => ENV['SECRET_WIKI_PASS'], 'lgtoken' => login_token)
79
+ http = Net::HTTP.new(url.host, url.port)
80
+ http.use_ssl = true
81
+ res=http.request(req)
82
+ @csrf_cookie = remove_cookie_metadata(res['set-cookie'])
83
+ File.write(csrf_cookie_file, @csrf_cookie)
84
+ puts(res.body) if debug
85
+ end
86
+
87
+ def get_csrf_token
88
+ puts("\nGetting csrf token using csrf cookies") if debug
89
+ url = URI("#{baseurl}?action=query&meta=tokens&format=json&type=csrf")
90
+ res = URI.open(url, header.merge('cookie' => csrf_cookie))
91
+ json = JSON.parse(res.read)
92
+ @csrf_token = json.dig('query','tokens','csrftoken')
93
+ puts(json) if debug
94
+ end
95
+
96
+ def build_query_string
97
+ params={}
98
+ params['action'] = 'edit'
99
+ params['format'] = Wikian::RESPONSE_FORMAT
100
+ params['title'] = input_file.sub(/\..*/,'')
101
+ wikitext = File.read(input_file)
102
+ if args.have?(%w(-a --append))
103
+ params['appendtext'] = wikitext
104
+ elsif args.have?(%w(-p --prepend))
105
+ params['prependtext'] = wikitext
106
+ else
107
+ # pass the wikitext in request body
108
+ @body_text = wikitext
109
+ end
110
+ if args.include?('-c')
111
+ params['captchaid'], params['captchaword'] = args[args.index('-c')+1].split(':')
112
+ end
113
+ if args.include?('-m')
114
+ params['summary'] = args[args.index('-m')+1]
115
+ end
116
+ @query = URI.encode_www_form(params)
117
+ end
118
+
119
+ def upload_article
120
+ puts("\nUploading the wiki article using csrf token #{csrf_token}") if debug
121
+ url = URI("#{baseurl}?#{query}")
122
+ req = Net::HTTP::Post.new(url, header.merge('cookie' => csrf_cookie, 'content-type' => 'application/x-www-form-urlencoded'))
123
+ http = Net::HTTP.new(url.host, url.port)
124
+ req_body = body_text.nil? ? {token: csrf_token} : {token: csrf_token, text: body_text}
125
+ req.set_form_data(req_body)
126
+ http = Net::HTTP.new(url.host, url.port)
127
+ http.use_ssl = true
128
+ res=http.request(req)
129
+ json = JSON.parse(res.body)
130
+ puts(json) if debug
131
+ if json.dig('error')
132
+ puts "An error occurred while uploding the file",
133
+ "Try pasing the '-r' option to remove '#{csrf_cookie_file}'",
134
+ "Or pass '-d' option for debugging"
135
+ else
136
+ puts "Article uploaded"
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,40 @@
1
+ class Wikian
2
+ class WikianGetError < StandardError; end
3
+ class ArgumentRequiredError < WikianGetError; end
4
+
5
+ class Search < Subcommand
6
+ def initialize(args)
7
+ super
8
+
9
+ @output_file = yaml['api']['srsearch'].first
10
+
11
+ @params.merge!('format' => Wikian::RESPONSE_FORMAT)
12
+
13
+ @query = @params.to_query
14
+
15
+ @api_url = URI("https://#{yaml['meta']['site']}/w/api.php?#{query}")
16
+ rescue => e
17
+ puts "#{e.class} #{e.message} in #{__FILE__}"
18
+ exit
19
+ end
20
+
21
+ def template
22
+ <<~eos
23
+ # Get last 5 revisions of the Main Page.
24
+ meta:
25
+ site: en.wikipedia.org
26
+ headers:
27
+ user-agent: Wikian
28
+ api:
29
+ action:
30
+ - query
31
+ list:
32
+ - search
33
+ srsearch:
34
+ - Craig Noone
35
+ format:
36
+ - json
37
+ eos
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env -S ruby -W0
2
+ class Wikian
3
+ # class to be inherited by other Wikian classes
4
+ class Subcommand
5
+ attr_accessor :args, :res, :yaml, :query, :title, :api_url, :debug, :output_file
6
+
7
+ def initialize(args)
8
+ @args = args
9
+
10
+ if args.have?(%w(-t --template))
11
+ puts "Creating template #{Wikian::CONFIG_FILE}"
12
+ make_template
13
+ exit
14
+ end
15
+
16
+ @debug = (args & %w(-d --debug)).length > 0 ? true : false
17
+
18
+ @yaml=YAML.load(File.open(Wikian::CONFIG_FILE))
19
+
20
+ # some params like 'titles' can contain multiple entries joined by '|'. More info in Wikipedia API docs
21
+ @params = Hash[yaml['api'].keys.zip(yaml['api'].values.map{|arr| arr.join("|")})]
22
+ end
23
+
24
+ def make_template
25
+ if File.exist?(CONFIG_FILE)
26
+ puts "Overwrite existing '#{CONFIG_FILE}'? [yn]"
27
+ answer = STDIN.gets.chomp
28
+ (puts 'Bye'; exit) if answer != 'y'
29
+ end
30
+
31
+ File.open(CONFIG_FILE, 'w') do |f|
32
+ f.write template
33
+ end
34
+ exit
35
+ end
36
+
37
+ # HTTP response file name. Its extension depends on the 'content-type' header
38
+ def response_file
39
+ output_file + '.' + res['content-type'].split('/').last.sub(/;.*/,'')
40
+ end
41
+
42
+ # write response in to `response_file`
43
+ def write_response
44
+ STDERR.puts "Writing to #{response_file}"
45
+ File.open(response_file, 'w') do |f|
46
+ f.puts prettify(res.body)
47
+ end
48
+ end
49
+
50
+ def doit
51
+ puts api_url if debug
52
+
53
+ req = Net::HTTP::Get.new(api_url, yaml['meta']['headers'])
54
+
55
+ http = Net::HTTP.new(api_url.host, api_url.port)
56
+
57
+ http.use_ssl = true
58
+
59
+ @res=http.request(req)
60
+
61
+ write_response
62
+ rescue => e
63
+ puts "#{e.class} #{e.message} in #{__FILE__}"
64
+ exit
65
+ end
66
+
67
+ private
68
+
69
+ # if response is JSON prettify it, otherwise return it unchanged
70
+ def prettify(str)
71
+ res['content-type'].match?('json') ? JSON.pretty_generate(JSON.parse(str)) : str
72
+ end
73
+ end
74
+ end
@@ -1,3 +1,3 @@
1
- module Wikian
2
- VERSION = "0.1.0"
1
+ class Wikian
2
+ VERSION = "0.1.5"
3
3
  end
metadata CHANGED
@@ -1,19 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wikian
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.5
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-03 00:00:00.000000000 Z
11
+ date: 2020-09-11 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Get and edit wikipedia articles
14
14
  email:
15
15
  - yo@sergioro.com
16
16
  executables:
17
+ - wi
17
18
  - wikian
18
19
  extensions: []
19
20
  extra_rdoc_files: []
@@ -21,13 +22,20 @@ files:
21
22
  - ".gitignore"
22
23
  - ".travis.yml"
23
24
  - Gemfile
25
+ - Gemfile.lock
24
26
  - LICENSE.txt
25
27
  - README.md
26
28
  - Rakefile
27
29
  - bin/console
28
30
  - bin/setup
31
+ - exe/wi
29
32
  - exe/wikian
33
+ - lib/.gitignore
30
34
  - lib/wikian.rb
35
+ - lib/wikian/get.rb
36
+ - lib/wikian/post.rb
37
+ - lib/wikian/search.rb
38
+ - lib/wikian/subcommand.rb
31
39
  - lib/wikian/version.rb
32
40
  - wikian.gemspec
33
41
  homepage: