wikian 0.1.11 → 0.2.3
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 +4 -4
 - data/Gemfile.lock +1 -1
 - data/README.md +12 -8
 - data/lib/wikian.rb +35 -18
 - data/lib/wikian/contributions.rb +4 -4
 - data/lib/wikian/get.rb +34 -37
 - data/lib/wikian/monkeypatches.rb +1 -1
 - data/lib/wikian/post.rb +78 -17
 - data/lib/wikian/search.rb +12 -7
 - data/lib/wikian/subcommand.rb +20 -16
 - data/lib/wikian/version.rb +1 -1
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 6044c74a22baf5f757da1f68bc65f0758da46a41ee3567b19b0a61688d3b7034
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 415490e2958ed48196c97ddbca6f3a86afff1c7ee535c9d1a1ed39bf3313bce8
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 3155eb0bc4f6a2a1648eb186072bda807b4af64ef79d9034e0c597900a5b2a9ed7b6d498a469545596673b37a0323360d59eef8f043b2710fcea462bf3ec7b55
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: cc705511bc328eeb488180ce7940f64eaa2e82f0b8302cbc26cb93e38aeff15b7f6ccd20b3f08d8ea5ec2dd2ab0eedeb9ca4297f01bae0b18a05995e5ec56f3e
         
     | 
    
        data/Gemfile.lock
    CHANGED
    
    
    
        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  
     | 
| 
      
 73 
     | 
    
         
            +
            To search for a term in Wikipedia:
         
     | 
| 
       74 
74 
     | 
    
         | 
| 
       75 
75 
     | 
    
         
             
            ```
         
     | 
| 
       76 
     | 
    
         
            -
            $ wi  
     | 
| 
       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.
         
     | 
    
        data/lib/wikian.rb
    CHANGED
    
    | 
         @@ -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                 
     | 
| 
      
 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 
     | 
| 
       79 
     | 
    
         
            -
                    g, get                  get wikitext  
     | 
| 
       80 
     | 
    
         
            -
                    p, post                 post wikitext  
     | 
| 
       81 
     | 
    
         
            -
                    s, search               search wikitext  
     | 
| 
      
 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 
     | 
    
         
            -
                     
     | 
| 
      
 98 
     | 
    
         
            +
                    wi g -t
         
     | 
| 
       86 
99 
     | 
    
         | 
| 
       87 
     | 
    
         
            -
                    # download article 
     | 
| 
       88 
     | 
    
         
            -
                     
     | 
| 
      
 100 
     | 
    
         
            +
                    # download article
         
     | 
| 
      
 101 
     | 
    
         
            +
                    wi get -t
         
     | 
| 
      
 102 
     | 
    
         
            +
                    wi get https://en.wikipedia.org/wiki/Wikipedia:Sandbox
         
     | 
| 
       89 
103 
     | 
    
         | 
| 
       90 
     | 
    
         
            -
                    # upload file 
     | 
| 
       91 
     | 
    
         
            -
                     
     | 
| 
      
 104 
     | 
    
         
            +
                    # upload file
         
     | 
| 
      
 105 
     | 
    
         
            +
                    wi post Wikipedia:Sandbox.en.wikipedia.org.wiki
         
     | 
| 
       92 
106 
     | 
    
         | 
| 
       93 
107 
     | 
    
         
             
                    # upload file to Spanish Wikipedia
         
     | 
| 
       94 
     | 
    
         
            -
                     
     | 
| 
      
 108 
     | 
    
         
            +
                    wi post Wikipedia:Sandbox.es.wikipedia.org.wiki
         
     | 
| 
       95 
109 
     | 
    
         | 
| 
       96 
110 
     | 
    
         
             
                    # upload file to English Wiktionary
         
     | 
| 
       97 
     | 
    
         
            -
                     
     | 
| 
      
 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 
     | 
    
         
            -
                    #  
     | 
| 
       100 
     | 
    
         
            -
                     
     | 
| 
      
 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 
     | 
    
         
            -
                     
     | 
| 
      
 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>.< 
     | 
| 
       108 
     | 
    
         
            -
                    where < 
     | 
| 
      
 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
         
     | 
    
        data/lib/wikian/contributions.rb
    CHANGED
    
    | 
         @@ -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  
     | 
| 
      
 14 
     | 
    
         
            +
                  raise(BadUrlError, "Try passing the '-t' option") unless config['meta']['site']
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
     | 
    
         
            -
                  @output_file = 'User:' +  ENV['WIKI_USER'] + '.contributions.' +  
     | 
| 
      
 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://#{ 
     | 
| 
      
 22 
     | 
    
         
            +
                  @api_url = URI("https://#{config['meta']['site']}/w/api.php?#{query}")
         
     | 
| 
       23 
23 
     | 
    
         
             
                rescue => e
         
     | 
| 
       24 
     | 
    
         
            -
                  puts "#{e.class} in #{__FILE__} 
     | 
| 
      
 24 
     | 
    
         
            +
                  puts "#{e.class} in #{__FILE__}", e.message
         
     | 
| 
       25 
25 
     | 
    
         
             
                  exit
         
     | 
| 
       26 
26 
     | 
    
         
             
                end
         
     | 
| 
       27 
27 
     | 
    
         | 
    
        data/lib/wikian/get.rb
    CHANGED
    
    | 
         @@ -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__} 
     | 
| 
      
 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 
     | 
    
         
            -
                   
     | 
| 
       37 
     | 
    
         
            -
                    raise ExtractWikiError, 'JSON response has no pages'
         
     | 
| 
       38 
     | 
    
         
            -
                  end
         
     | 
| 
      
 35 
     | 
    
         
            +
                  pages = JSON.parse(res_body).dig('query','pages')
         
     | 
| 
       39 
36 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
                   
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
                   
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
                     
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
       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: 
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
      
 82 
     | 
    
         
            +
                        - timestamp
         
     | 
| 
      
 83 
     | 
    
         
            +
                     #rvsection: # get specific sections
         
     | 
| 
      
 84 
     | 
    
         
            +
                     #  - 0
         
     | 
| 
      
 85 
     | 
    
         
            +
                     #  - 2
         
     | 
| 
       89 
86 
     | 
    
         
             
                      rvslots:
         
     | 
| 
       90 
87 
     | 
    
         
             
                        - main
         
     | 
| 
       91 
88 
     | 
    
         
             
                      formatversion:
         
     | 
    
        data/lib/wikian/monkeypatches.rb
    CHANGED
    
    
    
        data/lib/wikian/post.rb
    CHANGED
    
    | 
         @@ -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, 
     | 
| 
      
 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 
     | 
| 
      
 29 
     | 
    
         
            +
                  @debug = (args & %w(-d)).length > 0 ? true : false
         
     | 
| 
       25 
30 
     | 
    
         
             
                rescue => e
         
     | 
| 
       26 
     | 
    
         
            -
                  puts "#{e.class} in #{__FILE__} 
     | 
| 
      
 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 
     | 
| 
      
 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& 
     | 
| 
      
 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 
     | 
| 
      
 138 
     | 
    
         
            +
                  if args.have?(%w(-a))
         
     | 
| 
       103 
139 
     | 
    
         
             
                    params['appendtext'] = wikitext
         
     | 
| 
       104 
     | 
    
         
            -
                  elsif args.have?(%w(-p 
     | 
| 
      
 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 
     | 
| 
      
 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 
     | 
| 
      
 149 
     | 
    
         
            +
                  if args.have?(%w(-m))
         
     | 
| 
       114 
150 
     | 
    
         
             
                    params['summary'] = args[args.index('-m')+1]
         
     | 
| 
       115 
151 
     | 
    
         
             
                  end
         
     | 
| 
       116 
     | 
    
         
            -
                  if args.have?(%w(-s 
     | 
| 
      
 152 
     | 
    
         
            +
                  if args.have?(%w(-s))
         
     | 
| 
       117 
153 
     | 
    
         
             
                    params['section'] = args[args.index('-s')+1]
         
     | 
| 
       118 
154 
     | 
    
         
             
                  end
         
     | 
| 
       119 
     | 
    
         
            -
             
     | 
| 
      
 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
         
     | 
    
        data/lib/wikian/search.rb
    CHANGED
    
    | 
         @@ -1,20 +1,24 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            class Wikian
         
     | 
| 
       2 
2 
     | 
    
         
             
              class WikianGetError < StandardError; end
         
     | 
| 
       3 
     | 
    
         
            -
              class  
     | 
| 
      
 3 
     | 
    
         
            +
              class MissingSearchTermError < WikianGetError; end
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              class Search < Subcommand
         
     | 
| 
       6 
6 
     | 
    
         
             
                def initialize(args)
         
     | 
| 
       7 
7 
     | 
    
         
             
                  super
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
                   
     | 
| 
      
 9 
     | 
    
         
            +
                  srsearch =  non_opt_args.join(' ')
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
                   
     | 
| 
      
 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://#{ 
     | 
| 
      
 19 
     | 
    
         
            +
                  @api_url = URI("https://#{config['meta']['site']}/w/api.php?#{query}")
         
     | 
| 
       16 
20 
     | 
    
         
             
                rescue => e
         
     | 
| 
       17 
     | 
    
         
            -
                  puts "#{e.class} in #{__FILE__} 
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
      
 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
         
     | 
    
        data/lib/wikian/subcommand.rb
    CHANGED
    
    | 
         @@ -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, : 
     | 
| 
      
 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 
     | 
    
         
            -
                   
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
      
 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[ 
     | 
| 
      
 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( 
     | 
| 
      
 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 
     | 
    
         
            -
                   
     | 
| 
       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 
     | 
| 
      
 69 
     | 
    
         
            +
                  @res_body = res.read
         
     | 
| 
       66 
70 
     | 
    
         | 
| 
       67 
71 
     | 
    
         
             
                  write_response
         
     | 
| 
       68 
72 
     | 
    
         
             
                rescue => e
         
     | 
| 
       69 
     | 
    
         
            -
                  puts "#{e.class} in #{__FILE__} 
     | 
| 
      
 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
         
     | 
    
        data/lib/wikian/version.rb
    CHANGED
    
    
    
        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. 
     | 
| 
      
 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- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2020-09-16 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies: []
         
     | 
| 
       13 
13 
     | 
    
         
             
            description: Get and update Wikipedia articles
         
     | 
| 
       14 
14 
     | 
    
         
             
            email:
         
     |