wikian 0.1.11 → 0.2.3

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: 6a043e93eb44e9e28a9ce90970196b4ba1c3a07ed485969b699afa2cdad61591
4
- data.tar.gz: a848bf0d381a11fd3836cb4eb1557f2681933e182ea84fc2243f0bead9a0840f
3
+ metadata.gz: 6044c74a22baf5f757da1f68bc65f0758da46a41ee3567b19b0a61688d3b7034
4
+ data.tar.gz: 415490e2958ed48196c97ddbca6f3a86afff1c7ee535c9d1a1ed39bf3313bce8
5
5
  SHA512:
6
- metadata.gz: 980ee96658d992854345d9a8e411299d6a427358cac77cf1c16d1010140706e296ba44ebac2c266d7eb12cd29635eed5fdf1ab11a102a61b5e9a1f7e651b1708
7
- data.tar.gz: 81a4423049990447c690e60b5294fd0566f0d7de631b4f4083ff05ff89fabc20c5912e729e228c692da3764c4425d53cd986d2f157240d16c1df522c8858b737
6
+ metadata.gz: 3155eb0bc4f6a2a1648eb186072bda807b4af64ef79d9034e0c597900a5b2a9ed7b6d498a469545596673b37a0323360d59eef8f043b2710fcea462bf3ec7b55
7
+ data.tar.gz: cc705511bc328eeb488180ce7940f64eaa2e82f0b8302cbc26cb93e38aeff15b7f6ccd20b3f08d8ea5ec2dd2ab0eedeb9ca4297f01bae0b18a05995e5ec56f3e
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- wikian (0.1.11)
4
+ wikian (0.2.3)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -70,24 +70,28 @@ $ wi post -s 2 Wikipedia:Sandbox.en.wikipedia.org.wiki
70
70
  Article uploaded
71
71
  ```
72
72
 
73
- To search for a pattern in Wikipedia:
73
+ To search for a term in Wikipedia:
74
74
 
75
75
  ```
76
- $ wi search -t
77
- Creating template wiki.yml
78
-
79
- $ wi s
76
+ $ wi s Mr. Fixit
80
77
  Writing to Mr. Fixit.json
81
78
  ```
82
79
 
83
80
  To get your last 10 Wikipedia contributions:
84
81
 
85
82
  ```
86
- $ wi c -t
87
- Creating template wiki.yml
88
-
89
83
  $ wi c
90
84
  Writing to User:Example_User.contributions.en.wikipedia.org.json
91
85
  ```
92
86
 
87
+ To tune the request parameters create a config file with any of these:
88
+ ```
89
+ $ wi g -t
90
+
91
+ $ wi c -t
92
+
93
+ $ wi s -t
94
+ ```
95
+
96
+
93
97
  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.
@@ -13,6 +13,7 @@ require 'fileutils'
13
13
  require 'json'
14
14
  require 'net/http'
15
15
  require 'open-uri'
16
+ require 'tempfile'
16
17
  require 'yaml'
17
18
 
18
19
  class Wikian
@@ -43,6 +44,7 @@ class Wikian
43
44
  api = Wikian::Get.new(args)
44
45
  api.doit
45
46
  api.extract_wikitext
47
+ api.save_metadata
46
48
  elsif subcommand[0] == 's'
47
49
  api = Wikian::Search.new(args)
48
50
  api.doit
@@ -58,6 +60,15 @@ class Wikian
58
60
  puts "#{e.class} #{e.message} in #{__FILE__}"
59
61
  end
60
62
 
63
+ def self.meta_dir
64
+ '.wikian'
65
+ end
66
+
67
+ # file to store metadata of fetched articles
68
+ def self.meta_file
69
+ File.join(meta_dir, 'meta.yml')
70
+ end
71
+
61
72
  def help
62
73
  puts <<~eos
63
74
  Usage:
@@ -66,46 +77,52 @@ class Wikian
66
77
  Options:
67
78
  -a, --append append the input file
68
79
  -c, --captcha ID:MESSAGE captcha info
69
- -d, --debug debug
80
+ -d, --debug print debugging messages
81
+ -f, --force force post (this ignores edit conflicts)
82
+ -h, --help print this help message
70
83
  -m, --message MESSAGE add a commit message (HIGHLY recommended)
71
84
  -p, --prepend prepend the input file
72
85
  -r, --remove-cookie remove API cookie
73
86
  -s, --section NUMBER section to edit
74
87
  -t, --template create template configuration file
75
- -v, --version
88
+ -v, --version print version number
76
89
 
77
90
  Subcommands:
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
+ c, contributions [N] get user last N contributions (defaults to #{Contributions::DEFAULT_MAX_CONTRIBUTIONS})
92
+ g, get get wikitext from a Wikipedia article
93
+ p, post post wikitext to a Wikipedia article
94
+ s, search search wikitext in Wikipedia
82
95
 
83
96
  Examples:
84
97
  # create wiki.yml template
85
- wiki -t
98
+ wi g -t
86
99
 
87
- # download article and create response and wikitext files
88
- wiki get https://en.wikipedia.org/wiki/Spider-Man
100
+ # download article
101
+ wi get -t
102
+ wi get https://en.wikipedia.org/wiki/Wikipedia:Sandbox
89
103
 
90
- # upload file to English Wikipedia
91
- wiki post Spider-Man.en.wikipedia.org.wiki
104
+ # upload file
105
+ wi post Wikipedia:Sandbox.en.wikipedia.org.wiki
92
106
 
93
107
  # upload file to Spanish Wikipedia
94
- wiki post Spider-Man.es.wikipedia.org.wiki
108
+ wi post Wikipedia:Sandbox.es.wikipedia.org.wiki
95
109
 
96
110
  # upload file to English Wiktionary
97
- wiki file to Spider-Man.es.wiktionary.org.wiki
111
+ wi post Wikipedia:Sandbox.en.wiktionary.org.wiki
112
+
113
+ # append wikitext to section 2 of the article
114
+ wi post -a -s 2 Wikipedia:Sandbox.en.wikipedia.org.wiki
98
115
 
99
- # append new section to article
100
- wiki post -a Spider-Man-new-section.wiki
116
+ # search for multiple terms in Wikipedia
117
+ wi search term 1:term 2:term 3
101
118
 
102
119
  # heavy use of the API may require cache validation
103
- wiki post -c 1234:someMessage spider-Man.wiki
120
+ wi post -c 1234:someMessage spider-Man.wiki
104
121
 
105
122
  Comments:
106
123
  Posted files must follow the convention:
107
- <article_name>.<host>.wiki
108
- where <host> is a wikimedia site.
124
+ <article_name>.<site>.wiki
125
+ where <site> is a wikimedia site.
109
126
  More info at: https://meta.wikimedia.org/wiki/Our_projects
110
127
  eos
111
128
  exit
@@ -11,17 +11,17 @@ class Wikian
11
11
 
12
12
  max_contributions = args.find(&:numeric?) || DEFAULT_MAX_CONTRIBUTIONS
13
13
 
14
- raise(BadUrlError, "Try passing the '-t' option") unless yaml['meta']['site']
14
+ raise(BadUrlError, "Try passing the '-t' option") unless config['meta']['site']
15
15
 
16
- @output_file = 'User:' + ENV['WIKI_USER'] + '.contributions.' + yaml['meta']['site']
16
+ @output_file = 'User:' + ENV['WIKI_USER'] + '.contributions.' + config['meta']['site']
17
17
 
18
18
  @params.merge!('ucuser' => ENV['WIKI_USER'], 'uclimit' => max_contributions, 'format' => Wikian::RESPONSE_FORMAT)
19
19
 
20
20
  @query = @params.to_query
21
21
 
22
- @api_url = URI("https://#{yaml['meta']['site']}/w/api.php?#{query}")
22
+ @api_url = URI("https://#{config['meta']['site']}/w/api.php?#{query}")
23
23
  rescue => e
24
- puts "#{e.class} in #{__FILE__}. #{e.message}"
24
+ puts "#{e.class} in #{__FILE__}", e.message
25
25
  exit
26
26
  end
27
27
 
@@ -1,17 +1,16 @@
1
1
  class Wikian
2
2
  class WikianGetError < StandardError; end
3
- class ExtractWikiError < WikianGetError; end
4
3
  class ArgumentRequiredError < WikianGetError; end
5
4
 
6
5
  class Get < Subcommand
7
- attr_accessor :title
6
+ attr_accessor :title, :url, :latest_revision
8
7
 
9
8
  def initialize(args)
10
9
  raise ArgumentRequiredError if args.empty?
11
10
 
12
11
  super
13
12
 
14
- url = URI(args.find{|arg| arg =~ URI.regexp})
13
+ @url = URI(args.find{|arg| arg =~ URI.regexp})
15
14
 
16
15
  raise BadUrlError unless url.path
17
16
 
@@ -25,7 +24,7 @@ class Wikian
25
24
 
26
25
  @api_url = URI("https://#{url.host}/w/api.php?#{query}")
27
26
  rescue => e
28
- puts "#{e.class} in #{__FILE__}. #{e.message}"
27
+ puts "#{e.class} in #{__FILE__}", e.message
29
28
  exit
30
29
  end
31
30
 
@@ -33,46 +32,43 @@ class Wikian
33
32
  #
34
33
  # return: nil
35
34
  def extract_wikitext
36
- if !res['content-type'].match?('json') || !(pages = JSON.parse(res.body).dig('query','pages'))
37
- raise ExtractWikiError, 'JSON response has no pages'
38
- end
35
+ pages = JSON.parse(res_body).dig('query','pages')
39
36
 
40
- create_wiki = -> (title, revisions) do
41
- revisions.each do |revision|
42
- wiki_file= File.basename(response_file, File.extname(response_file)) + '.wiki'
43
- if revision['revid'].nil? && revisions.size > 1
44
- STDERR.puts "Warning: you should specify 'revid' in #{Wikian::CONFIG_FILE} to prevent overriding different revisions"
45
- end
46
- File.open(wiki_file,'w') do |f|
47
- content = revision.dig('slots', 'main', 'content') ||
48
- revision.dig('slots', '*') ||
49
- revision.dig('*')
50
- STDERR.puts "Warning: nil 'content' in #{Wikian::CONFIG_FILE}" unless content
51
- STDERR.puts "Writing to #{wiki_file}"
52
- f.puts content
53
- end
54
- end
55
- end
37
+ # Wikipedia is inconsistent in their value for 'pages', it's sometimes a hash, sometimes an array
38
+ @latest_revision = (pages.respond_to?(:keys) ? pages.values.first : pages.first)['revisions'].first
39
+
40
+ content = latest_revision.dig('slots', 'main', 'content') ||
41
+ latest_revision.dig('slots', '*') ||
42
+ latest_revision.dig('*')
56
43
 
57
- # this is ugly, but Wikipedia is inconsistent in their JSON value for 'pages'. Sometimes it's a hash, sometimes it's an array.
58
- if pages.respond_to? :keys
59
- create_wiki.call(pages.values.first['title'], pages.values.first['revisions'])
60
- else
61
- pages.each do |page|
62
- create_wiki.call(page['title'], page['revisions'])
63
- end
44
+ wiki_file= File.basename(response_file, File.extname(response_file)) + '.wiki'
45
+
46
+ File.open(wiki_file,'w') do |f|
47
+ STDERR.puts "Warning: nil 'content' in #{Wikian::CONFIG_FILE}" unless content
48
+ STDERR.puts "Writing to #{wiki_file}"
49
+ f.puts content
64
50
  end
65
51
 
66
52
  rescue => e
67
- puts "An error occurred while extracting the wikitext",
68
- "Try using a new config file by pasing the '-t' option.",
69
- "Or pass the '-d' option for debugging"
53
+ puts "An error occurred while extracting the wikitext"
70
54
  exit
71
55
  end
72
56
 
57
+ # save article metadata
58
+ #
59
+ # metadata like article timestamp is used to solve edit conflicts
60
+ def save_metadata
61
+ FileUtils.mkdir_p(Wikian.meta_dir)
62
+
63
+ metadata = File.exist?(Wikian.meta_file) ? YAML.load(File.open(Wikian.meta_file)) : {'meta' => {}}
64
+ metadata['meta'].merge!(title => {'timestamp' => latest_revision['timestamp']})
65
+
66
+ File.write(Wikian.meta_file, YAML.dump(metadata))
67
+ end
68
+
73
69
  def template
74
70
  <<~eos
75
- # for a list of parameters to use here see: https://www.mediawiki.org/wiki/API:Get_the_contents_of_a_page
71
+ # for a list of parameters to use here see: https://www.mediawiki.org/wiki/API:Revisions
76
72
  meta:
77
73
  headers:
78
74
  user-agent: Wikian
@@ -83,9 +79,10 @@ class Wikian
83
79
  - revisions
84
80
  rvprop:
85
81
  - content
86
- #rvsection: # get specific sections
87
- # - 0
88
- # - 2
82
+ - timestamp
83
+ #rvsection: # get specific sections
84
+ # - 0
85
+ # - 2
89
86
  rvslots:
90
87
  - main
91
88
  formatversion:
@@ -9,7 +9,7 @@ end
9
9
  class Hash
10
10
  # return a query string representation of a hash
11
11
  def to_query
12
- URI.decode(URI.encode_www_form(self))
12
+ URI::DEFAULT_PARSER.unescape(URI.encode_www_form(self))
13
13
  end
14
14
  end
15
15
 
@@ -1,19 +1,24 @@
1
1
  class Wikian
2
2
  class WikianPostError < StandardError; end
3
3
  class WikiFileError < WikianPostError; end
4
+ class WikiFileNameError < WikianPostError; end
5
+ class WikiMergeError < WikianPostError; end
4
6
 
5
7
  class Post
6
8
  attr_accessor :args, :baseurl, :header, :input_file, :debug, :login_token,
7
- :login_cookie, :csrf_token, :csrf_cookie, :query, :body_text, :username
9
+ :login_cookie, :csrf_token, :csrf_cookie, :query, :body_text,
10
+ :username, :params, :latest_revision, :latest_content, :metadata
8
11
 
9
12
  def initialize(args)
10
13
  @args = args
11
14
 
15
+ long_to_short_options
16
+
12
17
  # input wikitext file
13
- @input_file = args.find{|f| File.exist? f}
14
- raise WikiFileError unless input_file
18
+ raise WikiFileError unless @input_file = args.find{|f| File.exist? f}
15
19
 
16
- site = input_file.match(/\.(.*)\.wiki/)[1]
20
+ site = input_file.match(/\.(.*)\.wiki/)&.[](1)
21
+ raise(WikiFileNameError, "Use the Input file name convention <article_name>.<site>.wiki") unless site
17
22
 
18
23
  @baseurl = "https://#{site}/w/api.php"
19
24
 
@@ -21,15 +26,20 @@ class Wikian
21
26
 
22
27
  @username = ENV['WIKI_USER']
23
28
 
24
- @debug = (args & %w(-d --debug)).length > 0 ? true : false
29
+ @debug = (args & %w(-d)).length > 0 ? true : false
25
30
  rescue => e
26
- puts "#{e.class} in #{__FILE__}. #{e.message}"
31
+ puts "#{e.class} in #{__FILE__}", e.message
27
32
  exit
28
33
  end
29
34
 
35
+ # transform long options like '--message' to short options like '-m'
36
+ def long_to_short_options
37
+ args.map! {|opt| opt[0,2] == '--' ? opt[1,2] : opt}
38
+ end
39
+
30
40
  def post
31
41
  # remove expired cookie
32
- if expired_cookie? || args.have?(%w(-r --remove-cookie))
42
+ if expired_cookie? || args.have?(%w(-r))
33
43
  FileUtils.rm_f(csrf_cookie_file)
34
44
  end
35
45
 
@@ -41,10 +51,17 @@ class Wikian
41
51
 
42
52
  get_csrf_cookie
43
53
  end
44
- get_csrf_token
45
-
46
54
  build_query_string
47
55
 
56
+ get_latest_revision
57
+
58
+ if !args.include?('-f') && @body_text && Time.parse(params['starttimestamp']) < Time.parse(params['basetimestamp'])
59
+ puts "Edit conflict detected"
60
+ merge_versions(@body_text, latest_content)
61
+ end
62
+
63
+ get_csrf_token
64
+
48
65
  upload_article
49
66
  end
50
67
 
@@ -84,9 +101,19 @@ class Wikian
84
101
  puts(res.body) if debug
85
102
  end
86
103
 
104
+ def get_latest_revision
105
+ res = URI.open("#{baseurl}?action=query&prop=revisions&titles=#{params['title']}&rvslots=main&rvprop=content|timestamp&format=json")
106
+ @latest_revision = JSON.parse(res.read).dig('query', 'pages').values.first.dig('revisions').first
107
+ params['basetimestamp'] = latest_revision['timestamp']
108
+ @latest_content = latest_revision.dig('slots', 'main', 'content') ||
109
+ latest_revision.dig('slots', 'main', '*') ||
110
+ latest_revision.dig('slots', '*') ||
111
+ latest_revision.dig('*')
112
+ end
113
+
87
114
  def get_csrf_token
88
115
  puts("\nGetting csrf token using csrf cookies") if debug
89
- url = URI("#{baseurl}?action=query&meta=tokens&format=json&type=csrf")
116
+ url = URI("#{baseurl}?action=query&meta=tokens&format=json&prop=info|revisions&rvprop=timestamp")
90
117
  res = URI.open(url, header.merge('cookie' => csrf_cookie))
91
118
  json = JSON.parse(res.read)
92
119
  @csrf_token = json.dig('query','tokens','csrftoken')
@@ -94,32 +121,65 @@ class Wikian
94
121
  end
95
122
 
96
123
  def build_query_string
97
- params={}
124
+ @params={}
98
125
  params['action'] = 'edit'
99
126
  params['format'] = Wikian::RESPONSE_FORMAT
100
127
  params['title'] = input_file.sub(/\..*/,'')
128
+ @metadata = File.exist?(Wikian.meta_file) ? YAML.load(File.open(Wikian.meta_file)) : {}
129
+ params['starttimestamp'] =
130
+ if timestamp = metadata.dig('meta', params['title'], 'timestamp')
131
+ timestamp
132
+ else
133
+ FileUtils.mkdir_p(Wikian.meta_dir)
134
+ metadata = {'meta' => {params['title'] => {'timestamp' => File.mtime(input_file).utc.iso8601}}}
135
+ File.write(Wikian.meta_file, YAML.dump(metadata))
136
+ end
101
137
  wikitext = File.read(input_file)
102
- if args.have?(%w(-a --append))
138
+ if args.have?(%w(-a))
103
139
  params['appendtext'] = wikitext
104
- elsif args.have?(%w(-p --prepend))
140
+ elsif args.have?(%w(-p))
105
141
  params['prependtext'] = wikitext
106
142
  else
107
143
  # pass the wikitext in request body
108
144
  @body_text = wikitext
109
145
  end
110
- if args.have?(%w(-c --captcha))
146
+ if args.have?(%w(-c))
111
147
  params['captchaid'], params['captchaword'] = args[args.index('-c')+1].split(':')
112
148
  end
113
- if args.have?(%w(-m --message))
149
+ if args.have?(%w(-m))
114
150
  params['summary'] = args[args.index('-m')+1]
115
151
  end
116
- if args.have?(%w(-s --section))
152
+ if args.have?(%w(-s))
117
153
  params['section'] = args[args.index('-s')+1]
118
154
  end
119
- @query = URI.encode_www_form(params)
155
+ end
156
+
157
+ # merge two version with diff.
158
+ # TODO the merge command is ADDING differences, but it should MERGE differences.
159
+ def merge_versions(content_one, content_two)
160
+ tmp_local = Tempfile.open {|f| f.write content_one; f}
161
+ tmp_latest = Tempfile.open {|f| f.write content_two; f}
162
+
163
+ diff_cmd = "diff #{tmp_local.path} #{tmp_latest.path}"
164
+ system("#{diff_cmd}")
165
+
166
+ # raise error until the above TODO is solved
167
+ raise WikiMergeError, "Please merge with latest version and try again"
168
+
169
+ merge_cmd = "diff --line-format %L #{tmp_local.path} #{tmp_latest.path}"
170
+ @body_text = %x(#{merge_cmd})
171
+ rescue => e
172
+ puts "#{e.class} in #{__FILE__}", e.message
173
+ exit
174
+ end
175
+
176
+ def update_metadata
177
+ metadata['meta'].merge!(params['title'] => {'timestamp' => Time.now.utc.iso8601})
178
+ File.write(Wikian.meta_file, YAML.dump(metadata))
120
179
  end
121
180
 
122
181
  def upload_article
182
+ @query = URI.encode_www_form(params)
123
183
  puts("\nUploading the wiki article using csrf token #{csrf_token}") if debug
124
184
  url = URI("#{baseurl}?#{query}")
125
185
  req = Net::HTTP::Post.new(url, header.merge('cookie' => csrf_cookie, 'content-type' => 'application/x-www-form-urlencoded'))
@@ -136,6 +196,7 @@ class Wikian
136
196
  "Try pasing the '-r' option to remove '#{csrf_cookie_file}'",
137
197
  "Or pass '-d' option for debugging"
138
198
  else
199
+ update_metadata
139
200
  puts "Article uploaded"
140
201
  end
141
202
  end
@@ -1,20 +1,24 @@
1
1
  class Wikian
2
2
  class WikianGetError < StandardError; end
3
- class ArgumentRequiredError < WikianGetError; end
3
+ class MissingSearchTermError < WikianGetError; end
4
4
 
5
5
  class Search < Subcommand
6
6
  def initialize(args)
7
7
  super
8
8
 
9
- @output_file = yaml['api']['srsearch'].first
9
+ srsearch = non_opt_args.join(' ')
10
10
 
11
- @params.merge!('format' => Wikian::RESPONSE_FORMAT)
11
+ raise MissingSearchTermError if srsearch.empty?
12
+
13
+ @params.merge!('srsearch' => srsearch, 'format' => Wikian::RESPONSE_FORMAT)
14
+
15
+ @output_file = srsearch
12
16
 
13
17
  @query = @params.to_query
14
18
 
15
- @api_url = URI("https://#{yaml['meta']['site']}/w/api.php?#{query}")
19
+ @api_url = URI("https://#{config['meta']['site']}/w/api.php?#{query}")
16
20
  rescue => e
17
- puts "#{e.class} in #{__FILE__}. #{e.message}"
21
+ puts "#{e.class} in #{__FILE__}", e.message
18
22
  exit
19
23
  end
20
24
 
@@ -30,8 +34,9 @@ class Wikian
30
34
  - query
31
35
  list:
32
36
  - search
33
- srsearch: # text to search for. You can use multiple
34
- - Mr. Fixit
37
+ #srsearch: # text to search for. You can use multiple
38
+ # - Mr. Fixit
39
+ # - Term 2
35
40
  eos
36
41
  end
37
42
  end
@@ -1,12 +1,11 @@
1
- #!/usr/bin/env -S ruby -W0
2
1
  class Wikian
3
2
  class WikianSubcommandError < StandardError; end
4
- class MissingConfigFileError < WikianSubcommandError; end
5
3
  class BadUrlError < WikianSubcommandError; end
6
4
 
7
5
  # class to be inherited by other Wikian classes
8
6
  class Subcommand
9
- attr_accessor :args, :res, :yaml, :query, :title, :api_url, :debug, :output_file
7
+ attr_accessor :args, :res, :config, :query, :title, :api_url,
8
+ :debug, :output_file, :res_body
10
9
 
11
10
  def initialize(args)
12
11
  @args = args
@@ -19,11 +18,15 @@ class Wikian
19
18
 
20
19
  @debug = (args & %w(-d --debug)).length > 0 ? true : false
21
20
 
22
- raise MissingConfigFileError unless File.exist?(Wikian::CONFIG_FILE)
23
- @yaml=YAML.load(File.open(Wikian::CONFIG_FILE))
21
+ @config =
22
+ if File.exist?(Wikian::CONFIG_FILE)
23
+ YAML.load(File.open(Wikian::CONFIG_FILE))
24
+ else
25
+ YAML.load(template)
26
+ end
24
27
 
25
28
  # some params like 'titles' can contain multiple entries joined by '|'. More info in Wikipedia API docs
26
- @params = Hash[yaml['api'].keys.zip(yaml['api'].values.map{|arr| arr.join("|")})]
29
+ @params = Hash[config['api'].keys.zip(config['api'].values.map{|arr| arr.join("|")})]
27
30
  rescue MissingConfigFileError => e
28
31
  puts "#{e.class} try passing the '-t' option to generate #{Wikian::CONFIG_FILE} in #{__FILE__}"
29
32
  exit
@@ -40,33 +43,34 @@ class Wikian
40
43
  exit
41
44
  end
42
45
 
46
+ # return args that dont start with '-'
47
+ def non_opt_args
48
+ args.reject {|p| p[0] == '-'}
49
+ end
50
+
43
51
  # HTTP response file name. Its extension depends on the 'content-type' header
44
52
  def response_file
45
- output_file + '.' + res['content-type'].split('/').last.sub(/;.*/,'')
53
+ output_file + '.' + res.meta['content-type'].split('/').last.sub(/;.*/,'')
46
54
  end
47
55
 
48
56
  # write response in to `response_file`
49
57
  def write_response
50
58
  STDERR.puts "Writing to #{response_file}"
51
59
  File.open(response_file, 'w') do |f|
52
- f.puts prettify(res.body)
60
+ f.puts prettify(res_body)
53
61
  end
54
62
  end
55
63
 
56
64
  def doit
57
65
  puts api_url if debug
58
66
 
59
- req = Net::HTTP::Get.new(api_url, yaml['meta']['headers'])
60
-
61
- http = Net::HTTP.new(api_url.host, api_url.port)
62
-
63
- http.use_ssl = true
67
+ @res=URI.open(api_url, config['meta']['headers'])
64
68
 
65
- @res=http.request(req)
69
+ @res_body = res.read
66
70
 
67
71
  write_response
68
72
  rescue => e
69
- puts "#{e.class} in #{__FILE__}. #{e.message}"
73
+ puts "#{e.class} in #{__FILE__}", e.message
70
74
  exit
71
75
  end
72
76
 
@@ -74,7 +78,7 @@ class Wikian
74
78
 
75
79
  # if response is JSON prettify it, otherwise return it unchanged
76
80
  def prettify(str)
77
- res['content-type'].match?('json') ? JSON.pretty_generate(JSON.parse(str)) : str
81
+ res.meta['content-type'].match?('json') ? JSON.pretty_generate(JSON.parse(str)) : str
78
82
  end
79
83
  end
80
84
  end
@@ -1,3 +1,3 @@
1
1
  class Wikian
2
- VERSION = "0.1.11"
2
+ VERSION = "0.2.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wikian
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.2.3
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-13 00:00:00.000000000 Z
11
+ date: 2020-09-16 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Get and update Wikipedia articles
14
14
  email: