mediawiktory 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (243) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile.lock +63 -0
  3. data/README.md +103 -0
  4. data/bin/mediawiktory +13 -0
  5. data/doc/mediawiki_api_types.md +14 -0
  6. data/examples/query.rb +15 -0
  7. data/examples/query_generator.rb +15 -0
  8. data/lib/faraday/naive_cache.rb +40 -0
  9. data/lib/media_wiktory.rb +1 -0
  10. data/lib/mediawiktory/action.rb +48 -0
  11. data/lib/mediawiktory/array_with_keys.rb +41 -0
  12. data/lib/mediawiktory/client.rb +22 -0
  13. data/lib/mediawiktory/generated/abusefiltercheckmatch.rb +9 -0
  14. data/lib/mediawiktory/generated/abusefilterchecksyntax.rb +6 -0
  15. data/lib/mediawiktory/generated/abusefilterevalexpression.rb +6 -0
  16. data/lib/mediawiktory/generated/abusefilters.rb +12 -0
  17. data/lib/mediawiktory/generated/abusefilterunblockautopromote.rb +8 -0
  18. data/lib/mediawiktory/generated/abuselog.rb +14 -0
  19. data/lib/mediawiktory/generated/actions_mixin.rb +313 -0
  20. data/lib/mediawiktory/generated/addstudents.rb +9 -0
  21. data/lib/mediawiktory/generated/allcategories.rb +15 -0
  22. data/lib/mediawiktory/generated/alldeletedrevisions.rb +27 -0
  23. data/lib/mediawiktory/generated/allfileusages.rb +14 -0
  24. data/lib/mediawiktory/generated/allimages.rb +23 -0
  25. data/lib/mediawiktory/generated/alllinks.rb +15 -0
  26. data/lib/mediawiktory/generated/allmessages.rb +19 -0
  27. data/lib/mediawiktory/generated/allpages.rb +21 -0
  28. data/lib/mediawiktory/generated/allredirects.rb +15 -0
  29. data/lib/mediawiktory/generated/alltransclusions.rb +15 -0
  30. data/lib/mediawiktory/generated/allusers.rb +17 -0
  31. data/lib/mediawiktory/generated/antispoof.rb +6 -0
  32. data/lib/mediawiktory/generated/backlinks.rb +14 -0
  33. data/lib/mediawiktory/generated/betafeatures.rb +7 -0
  34. data/lib/mediawiktory/generated/block.rb +18 -0
  35. data/lib/mediawiktory/generated/blocks.rb +16 -0
  36. data/lib/mediawiktory/generated/bouncehandler.rb +7 -0
  37. data/lib/mediawiktory/generated/categories.rb +12 -0
  38. data/lib/mediawiktory/generated/categoryinfo.rb +7 -0
  39. data/lib/mediawiktory/generated/categorymembers.rb +23 -0
  40. data/lib/mediawiktory/generated/centralauthtoken.rb +5 -0
  41. data/lib/mediawiktory/generated/centralnoticechoicedata.rb +7 -0
  42. data/lib/mediawiktory/generated/centralnoticelogs.rb +11 -0
  43. data/lib/mediawiktory/generated/centralnoticequerycampaign.rb +6 -0
  44. data/lib/mediawiktory/generated/checktoken.rb +8 -0
  45. data/lib/mediawiktory/generated/checkuser.rb +14 -0
  46. data/lib/mediawiktory/generated/checkuserlog.rb +13 -0
  47. data/lib/mediawiktory/generated/cirrus-config-dump.rb +5 -0
  48. data/lib/mediawiktory/generated/cirrus-mapping-dump.rb +5 -0
  49. data/lib/mediawiktory/generated/cirrus-settings-dump.rb +5 -0
  50. data/lib/mediawiktory/generated/cirrus-suggest.rb +8 -0
  51. data/lib/mediawiktory/generated/clearhasmsg.rb +5 -0
  52. data/lib/mediawiktory/generated/close-open-topic.rb +10 -0
  53. data/lib/mediawiktory/generated/compare.rb +11 -0
  54. data/lib/mediawiktory/generated/contenttranslation.rb +12 -0
  55. data/lib/mediawiktory/generated/contenttranslationlangtrend.rb +8 -0
  56. data/lib/mediawiktory/generated/contenttranslationstats.rb +5 -0
  57. data/lib/mediawiktory/generated/contenttranslationsuggestions.rb +10 -0
  58. data/lib/mediawiktory/generated/contributors.rb +12 -0
  59. data/lib/mediawiktory/generated/coordinates.rb +12 -0
  60. data/lib/mediawiktory/generated/createaccount.rb +18 -0
  61. data/lib/mediawiktory/generated/cxconfiguration.rb +7 -0
  62. data/lib/mediawiktory/generated/cxdelete.rb +10 -0
  63. data/lib/mediawiktory/generated/cxpublish.rb +18 -0
  64. data/lib/mediawiktory/generated/cxpublishedtranslations.rb +9 -0
  65. data/lib/mediawiktory/generated/cxtoken.rb +7 -0
  66. data/lib/mediawiktory/generated/delete.rb +14 -0
  67. data/lib/mediawiktory/generated/deletedrevisions.rb +22 -0
  68. data/lib/mediawiktory/generated/deletedrevs.rb +20 -0
  69. data/lib/mediawiktory/generated/deleteeducation.rb +10 -0
  70. data/lib/mediawiktory/generated/deleteglobalaccount.rb +9 -0
  71. data/lib/mediawiktory/generated/duplicatefiles.rb +10 -0
  72. data/lib/mediawiktory/generated/echomarkread.rb +10 -0
  73. data/lib/mediawiktory/generated/echomarkseen.rb +8 -0
  74. data/lib/mediawiktory/generated/edit-header.rb +11 -0
  75. data/lib/mediawiktory/generated/edit-post.rb +12 -0
  76. data/lib/mediawiktory/generated/edit-title.rb +10 -0
  77. data/lib/mediawiktory/generated/edit-topic-summary.rb +11 -0
  78. data/lib/mediawiktory/generated/edit.rb +35 -0
  79. data/lib/mediawiktory/generated/editlist.rb +20 -0
  80. data/lib/mediawiktory/generated/editmassmessagelist.rb +10 -0
  81. data/lib/mediawiktory/generated/emailuser.rb +11 -0
  82. data/lib/mediawiktory/generated/embeddedin.rb +13 -0
  83. data/lib/mediawiktory/generated/enlist.rb +13 -0
  84. data/lib/mediawiktory/generated/expandtemplates.rb +11 -0
  85. data/lib/mediawiktory/generated/extlinks.rb +11 -0
  86. data/lib/mediawiktory/generated/extracts.rb +14 -0
  87. data/lib/mediawiktory/generated/exturlusage.rb +13 -0
  88. data/lib/mediawiktory/generated/fancycaptchareload.rb +5 -0
  89. data/lib/mediawiktory/generated/featuredfeed.rb +8 -0
  90. data/lib/mediawiktory/generated/featureusage.rb +10 -0
  91. data/lib/mediawiktory/generated/feedcontributions.rb +15 -0
  92. data/lib/mediawiktory/generated/feedrecentchanges.rb +21 -0
  93. data/lib/mediawiktory/generated/feedwatchlist.rb +14 -0
  94. data/lib/mediawiktory/generated/filearchive.rb +15 -0
  95. data/lib/mediawiktory/generated/filerepoinfo.rb +7 -0
  96. data/lib/mediawiktory/generated/filerevert.rb +10 -0
  97. data/lib/mediawiktory/generated/fileusage.rb +11 -0
  98. data/lib/mediawiktory/generated/flagconfig.rb +5 -0
  99. data/lib/mediawiktory/generated/flagged.rb +5 -0
  100. data/lib/mediawiktory/generated/flow-parsoid-utils.rb +10 -0
  101. data/lib/mediawiktory/generated/flow.rb +8 -0
  102. data/lib/mediawiktory/generated/flowinfo.rb +6 -0
  103. data/lib/mediawiktory/generated/flowthank.rb +8 -0
  104. data/lib/mediawiktory/generated/gadgetcategories.rb +8 -0
  105. data/lib/mediawiktory/generated/gadgets.rb +11 -0
  106. data/lib/mediawiktory/generated/geosearch.rb +15 -0
  107. data/lib/mediawiktory/generated/gettingstartedgetpages.rb +9 -0
  108. data/lib/mediawiktory/generated/globalallusers.rb +14 -0
  109. data/lib/mediawiktory/generated/globalblock.rb +12 -0
  110. data/lib/mediawiktory/generated/globalblocks.rb +14 -0
  111. data/lib/mediawiktory/generated/globalgroups.rb +7 -0
  112. data/lib/mediawiktory/generated/globalusage.rb +10 -0
  113. data/lib/mediawiktory/generated/globaluserinfo.rb +8 -0
  114. data/lib/mediawiktory/generated/globaluserrights.rb +12 -0
  115. data/lib/mediawiktory/generated/help.rb +10 -0
  116. data/lib/mediawiktory/generated/imageinfo.rb +19 -0
  117. data/lib/mediawiktory/generated/imagerotate.rb +5 -0
  118. data/lib/mediawiktory/generated/images.rb +10 -0
  119. data/lib/mediawiktory/generated/imageusage.rb +14 -0
  120. data/lib/mediawiktory/generated/import.rb +15 -0
  121. data/lib/mediawiktory/generated/info.rb +10 -0
  122. data/lib/mediawiktory/generated/iwbacklinks.rb +12 -0
  123. data/lib/mediawiktory/generated/iwlinks.rb +13 -0
  124. data/lib/mediawiktory/generated/jsonconfig.rb +8 -0
  125. data/lib/mediawiktory/generated/langbacklinks.rb +12 -0
  126. data/lib/mediawiktory/generated/langlinks.rb +14 -0
  127. data/lib/mediawiktory/generated/languagesearch.rb +7 -0
  128. data/lib/mediawiktory/generated/links.rb +11 -0
  129. data/lib/mediawiktory/generated/linkshere.rb +11 -0
  130. data/lib/mediawiktory/generated/listmembership.rb +10 -0
  131. data/lib/mediawiktory/generated/listpages.rb +14 -0
  132. data/lib/mediawiktory/generated/lists.rb +15 -0
  133. data/lib/mediawiktory/generated/liststudents.rb +9 -0
  134. data/lib/mediawiktory/generated/lock-topic.rb +10 -0
  135. data/lib/mediawiktory/generated/logevents.rb +19 -0
  136. data/lib/mediawiktory/generated/login.rb +11 -0
  137. data/lib/mediawiktory/generated/logout.rb +5 -0
  138. data/lib/mediawiktory/generated/managetags.rb +11 -0
  139. data/lib/mediawiktory/generated/massmessage.rb +10 -0
  140. data/lib/mediawiktory/generated/mmsites.rb +6 -0
  141. data/lib/mediawiktory/generated/mobileview.rb +21 -0
  142. data/lib/mediawiktory/generated/moderate-post.rb +11 -0
  143. data/lib/mediawiktory/generated/moderate-topic.rb +10 -0
  144. data/lib/mediawiktory/generated/move.rb +18 -0
  145. data/lib/mediawiktory/generated/new-topic.rb +11 -0
  146. data/lib/mediawiktory/generated/notifications.rb +17 -0
  147. data/lib/mediawiktory/generated/oldreviewedpages.rb +15 -0
  148. data/lib/mediawiktory/generated/opensearch.rb +12 -0
  149. data/lib/mediawiktory/generated/options.rb +12 -0
  150. data/lib/mediawiktory/generated/pageimages.rb +10 -0
  151. data/lib/mediawiktory/generated/pagepropnames.rb +8 -0
  152. data/lib/mediawiktory/generated/pageprops.rb +8 -0
  153. data/lib/mediawiktory/generated/pageswithprop.rb +11 -0
  154. data/lib/mediawiktory/generated/pageterms.rb +8 -0
  155. data/lib/mediawiktory/generated/pagetriageaction.rb +11 -0
  156. data/lib/mediawiktory/generated/pagetriagelist.rb +21 -0
  157. data/lib/mediawiktory/generated/pagetriagestats.rb +10 -0
  158. data/lib/mediawiktory/generated/pagetriagetagging.rb +13 -0
  159. data/lib/mediawiktory/generated/pagetriagetemplate.rb +7 -0
  160. data/lib/mediawiktory/generated/paraminfo.rb +11 -0
  161. data/lib/mediawiktory/generated/parse.rb +31 -0
  162. data/lib/mediawiktory/generated/parsoid-batch.rb +6 -0
  163. data/lib/mediawiktory/generated/patrol.rb +9 -0
  164. data/lib/mediawiktory/generated/prefixsearch.rb +10 -0
  165. data/lib/mediawiktory/generated/protect.rb +15 -0
  166. data/lib/mediawiktory/generated/protectedtitles.rb +14 -0
  167. data/lib/mediawiktory/generated/purge.rb +15 -0
  168. data/lib/mediawiktory/generated/query.rb +20 -0
  169. data/lib/mediawiktory/generated/querypage.rb +9 -0
  170. data/lib/mediawiktory/generated/random.rb +11 -0
  171. data/lib/mediawiktory/generated/recentchanges.rb +20 -0
  172. data/lib/mediawiktory/generated/redirects.rb +11 -0
  173. data/lib/mediawiktory/generated/refresheducation.rb +9 -0
  174. data/lib/mediawiktory/generated/reply.rb +11 -0
  175. data/lib/mediawiktory/generated/review.rb +10 -0
  176. data/lib/mediawiktory/generated/reviewactivity.rb +10 -0
  177. data/lib/mediawiktory/generated/revisiondelete.rb +14 -0
  178. data/lib/mediawiktory/generated/revisions.rb +25 -0
  179. data/lib/mediawiktory/generated/rollback.rb +13 -0
  180. data/lib/mediawiktory/generated/rsd.rb +5 -0
  181. data/lib/mediawiktory/generated/scribunto-console.rb +10 -0
  182. data/lib/mediawiktory/generated/search.rb +15 -0
  183. data/lib/mediawiktory/generated/setglobalaccountstatus.rb +12 -0
  184. data/lib/mediawiktory/generated/setnotificationtimestamp.rb +18 -0
  185. data/lib/mediawiktory/generated/siteinfo.rb +11 -0
  186. data/lib/mediawiktory/generated/sitematrix.rb +12 -0
  187. data/lib/mediawiktory/generated/spamblacklist.rb +6 -0
  188. data/lib/mediawiktory/generated/stabilize.rb +12 -0
  189. data/lib/mediawiktory/generated/stashedit.rb +14 -0
  190. data/lib/mediawiktory/generated/stashimageinfo.rb +12 -0
  191. data/lib/mediawiktory/generated/strikevote.rb +10 -0
  192. data/lib/mediawiktory/generated/tag.rb +13 -0
  193. data/lib/mediawiktory/generated/tags.rb +9 -0
  194. data/lib/mediawiktory/generated/templatedata.rb +13 -0
  195. data/lib/mediawiktory/generated/templates.rb +11 -0
  196. data/lib/mediawiktory/generated/thank.rb +9 -0
  197. data/lib/mediawiktory/generated/titleblacklist.rb +9 -0
  198. data/lib/mediawiktory/generated/tokens.rb +6 -0
  199. data/lib/mediawiktory/generated/transcludedin.rb +11 -0
  200. data/lib/mediawiktory/generated/transcodereset.rb +9 -0
  201. data/lib/mediawiktory/generated/transcodestatus.rb +5 -0
  202. data/lib/mediawiktory/generated/ulslocalization.rb +6 -0
  203. data/lib/mediawiktory/generated/unblock.rb +10 -0
  204. data/lib/mediawiktory/generated/undelete.rb +12 -0
  205. data/lib/mediawiktory/generated/undo-edit-header.rb +8 -0
  206. data/lib/mediawiktory/generated/undo-edit-post.rb +8 -0
  207. data/lib/mediawiktory/generated/undo-edit-topic-summary.rb +8 -0
  208. data/lib/mediawiktory/generated/upload.rb +26 -0
  209. data/lib/mediawiktory/generated/usercontribs.rb +18 -0
  210. data/lib/mediawiktory/generated/userdailycontribs.rb +8 -0
  211. data/lib/mediawiktory/generated/userinfo.rb +7 -0
  212. data/lib/mediawiktory/generated/userrights.rb +12 -0
  213. data/lib/mediawiktory/generated/users.rb +9 -0
  214. data/lib/mediawiktory/generated/videoinfo.rb +14 -0
  215. data/lib/mediawiktory/generated/view-header.rb +8 -0
  216. data/lib/mediawiktory/generated/view-post-history.rb +8 -0
  217. data/lib/mediawiktory/generated/view-post.rb +8 -0
  218. data/lib/mediawiktory/generated/view-topic-history.rb +7 -0
  219. data/lib/mediawiktory/generated/view-topic-summary.rb +8 -0
  220. data/lib/mediawiktory/generated/view-topic.rb +7 -0
  221. data/lib/mediawiktory/generated/view-topiclist.rb +15 -0
  222. data/lib/mediawiktory/generated/visualeditor.rb +13 -0
  223. data/lib/mediawiktory/generated/visualeditoredit.rb +19 -0
  224. data/lib/mediawiktory/generated/watch.rb +16 -0
  225. data/lib/mediawiktory/generated/watchlist.rb +20 -0
  226. data/lib/mediawiktory/generated/watchlistraw.rb +16 -0
  227. data/lib/mediawiktory/generated/wikibase.rb +7 -0
  228. data/lib/mediawiktory/generated/wikilove.rb +12 -0
  229. data/lib/mediawiktory/generated/wikisets.rb +10 -0
  230. data/lib/mediawiktory/generated/zeroconfig.rb +7 -0
  231. data/lib/mediawiktory/mw_module.rb +320 -0
  232. data/lib/mediawiktory/query.rb +60 -0
  233. data/lib/mediawiktory/version.rb +3 -0
  234. data/lib/mediawiktory.rb +16 -0
  235. data/lib/nokogiri/more.rb +72 -0
  236. data/mediawiktory.gemspec +30 -0
  237. data/script/data/api.yaml +40239 -0
  238. data/script/lib/api.rb +14 -0
  239. data/script/lib/module.rb +132 -0
  240. data/script/lib/parameter.rb +133 -0
  241. data/script/parse_api.rb +21 -0
  242. data/test/cache.rb +15 -0
  243. metadata +340 -0
data/script/lib/api.rb ADDED
@@ -0,0 +1,14 @@
1
+ module ApiParser
2
+ class << self
3
+ def client
4
+ @client ||= Faraday.new('https://en.wikipedia.org') do |builder|
5
+ builder.use Faraday::NaiveCache
6
+ builder.adapter Faraday.default_adapter
7
+ end
8
+ end
9
+ end
10
+
11
+ %w[module parameter].each do |mod|
12
+ require_relative mod
13
+ end
14
+ end
@@ -0,0 +1,132 @@
1
+ module ApiParser
2
+ # API "module": combination of parameters and values with its own sense
3
+ class Module < Hashie::Mash
4
+ class << self
5
+ def from_url(url)
6
+ doc = Nokogiri::HTML(ApiParser.client.get(url).body)
7
+ title, prefix = extract_title(doc)
8
+
9
+ new(
10
+ url: url,
11
+ title: title,
12
+ prefix: prefix,
13
+ description: extract_description(doc),
14
+ flags: extract_flags(doc),
15
+ params: extract_params(doc, prefix)
16
+ )
17
+ end
18
+
19
+ private
20
+
21
+ def extract_title(doc)
22
+ title = doc.at('.apihelp-header').text
23
+ if title =~ /^(.+)\s+\((.+)\)$/
24
+ [$1, $2]
25
+ else
26
+ [title, nil]
27
+ end
28
+ end
29
+
30
+ def extract_description(doc)
31
+ if desc = doc.at('.apihelp-flags + p')
32
+ desc.text.strip
33
+ end
34
+ end
35
+
36
+ def extract_flags(doc)
37
+ doc.at('.apihelp-flags').search('ul li > span').to_a.map{|el|
38
+ {id: el.attr('class'), text: el.text}
39
+ }.map{|h|
40
+ h.merge(role: h[:id].sub(/^apihelp-(flag-)?/, ''))
41
+ }
42
+ end
43
+
44
+ def extract_params(doc, prefix)
45
+ return [] unless doc.at('.apihelp-parameters > dl')
46
+ doc.at('.apihelp-parameters > dl').
47
+ each_term.to_a.
48
+ map{|dts, dds| Parameter.from_html(dts.first, dds, prefix)}
49
+ end
50
+ end
51
+
52
+ def to_yaml
53
+ to_hash.reject{|k,v| !v}.to_yaml
54
+ end
55
+
56
+ def to_ruby(base_path)
57
+ base = case type
58
+ when 'action'
59
+ 'Action'
60
+ else
61
+ 'MWModule'
62
+ end
63
+
64
+ [
65
+ "module MediaWiktory",
66
+ " class #{class_name} < #{base}",
67
+ " symbol #{name.to_sym.inspect}",
68
+ prefix && !prefix.empty? && " prefix #{prefix.inspect}",
69
+ post? && " post!",
70
+ *params.map{|p| p.to_ruby(base_path)},
71
+ " end",
72
+ "end"
73
+ ].reject{|v| !v}.join("\n")
74
+ end
75
+
76
+ def to_generator_ruby
77
+ [
78
+ "require_relative '#{name}'",
79
+ "",
80
+ "module MediaWiktory",
81
+ " class G#{class_name} < #{class_name}",
82
+ " symbol #{('g' + name).to_sym.inspect}",
83
+ " prefix #{('g' + prefix.to_s).inspect}",
84
+ " end",
85
+ "end"
86
+ ].join("\n")
87
+ end
88
+
89
+ def to_mixin_ruby
90
+ [
91
+ "module MediaWiktory",
92
+ " module ActionsMixin",
93
+ *params.detect{|p| p.name == 'action'}.vals.map(&:module).
94
+ map{|mod| " def #{mod.name.gsub('-', '_')}\n #{mod.class_name}.new(self)\n end"},
95
+ " end",
96
+ "end"
97
+ ].join("\n")
98
+ end
99
+
100
+ def name
101
+ title.split('=').last
102
+ end
103
+
104
+ def type
105
+ title.split('=').first
106
+ end
107
+
108
+ def class_name
109
+ name.gsub(/(^|-)\w/){|s| s.sub('-', '').upcase}
110
+ end
111
+
112
+ def write(base_path)
113
+ if title == 'Main module'
114
+ params.detect{|p| p.name == 'action'}.vals.map(&:module).each{|mod|
115
+ mod.write(base_path)
116
+ }
117
+ File.write(File.join(base_path, "actions_mixin.rb"), to_mixin_ruby)
118
+ else
119
+ File.write(File.join(base_path, "#{name}.rb"), to_ruby(base_path))
120
+ #File.write(File.join(base_path, "g#{name}.rb"), to_generator_ruby) if generator?
121
+ end
122
+ end
123
+
124
+ def post?
125
+ flags.detect{|f| f.id == 'apihelp-flag-mustbeposted'}
126
+ end
127
+
128
+ def generator?
129
+ flags.detect{|f| f.id == 'apihelp-flag-generator'}
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,133 @@
1
+ module ApiParser
2
+ # Parameter of some call
3
+ class Parameter < Hashie::Mash
4
+ class << self
5
+ def from_html(dt, dds, prefix = nil)
6
+ new(
7
+ full_name: dt.text,
8
+ name: dt.text.sub(/^#{prefix}/, ''),
9
+ prefix: prefix,
10
+ description: extract_description(dds),
11
+ type: extract_type(dds),
12
+ vals: extract_values(dds),
13
+ default: extract_default(dds)
14
+
15
+ # TODO: limit: extract_limit(dds),
16
+
17
+ # TODO: mandatoriness:
18
+ # * optional
19
+ # * mandatory
20
+ # * this OR that is mandatory
21
+ # * this AND that can't intersect
22
+ # * and so on
23
+ )
24
+ end
25
+
26
+ def extract_description(els)
27
+ if p = els.detect{|e| e.attr('class') == 'description'}.at('p')
28
+ p.text.strip
29
+ end
30
+ end
31
+
32
+ def extract_type(els)
33
+ els.select{|e| e.attr('class') == 'info'}.each do |el|
34
+ case el.text
35
+ when /^Type: ([^\(]+)\s*($|\()/
36
+ return $1.strip
37
+ when /^Values \(separate with \|\):/,
38
+ /^Separate values with \|/
39
+ return 'list'
40
+ when /^One of the following values:/
41
+ return 'enum'
42
+ end
43
+ end
44
+ 'string'
45
+ end
46
+
47
+ def extract_default(els)
48
+ els.each{|el| return $1 if el =~ /^Default:\s*(.+)$/}
49
+ nil
50
+ end
51
+
52
+ def extract_values(els)
53
+ # 1. try dl from definition
54
+ els.detect{|e| e.attr('class') == 'description'}.tap{|d|
55
+ if d.at('dl')
56
+ return d.at('dl').each_term.map{|dts, dds|
57
+ {name: dts.first.text, description: dds.first.text}
58
+ }
59
+ end
60
+ }
61
+
62
+ # 2. ...or take from info
63
+ els.select{|e| e.attr('class') == 'info'}.each do |el|
64
+ if el.text =~ /^(?:One of the following values||Values \(separate with \|\)):\s*(.+)$/
65
+ if el.at('a')
66
+ return el.search('a').map{|a|
67
+ {name: a.text, module: Module.from_url(a.attr('href'))}
68
+ }
69
+ else
70
+ return $1.sub(/^Can be empty, or/, '').split(',').
71
+ map{|s| s.gsub(/[[:space:]]/, '')}.
72
+ map{|n| {name: n}}
73
+ end
74
+ end
75
+ end
76
+
77
+ nil
78
+ end
79
+ end
80
+
81
+ def initialize(hash)
82
+ super(hash.reject{|k,v| !v || v.respond_to?(:empty?) && v.empty?})
83
+ end
84
+
85
+ def to_yaml
86
+ to_hash.to_yaml
87
+ end
88
+
89
+ def to_ruby(base_path)
90
+ type_str = case type
91
+ when 'boolean'
92
+ 'Params::Boolean'
93
+ when 'string', 'user name'
94
+ 'Params::String'
95
+ when 'integer'
96
+ 'Params::Integer'
97
+ when 'integer or max'
98
+ 'Params::IntegerOrMax'
99
+ when 'timestamp'
100
+ 'Params::Timestamp'
101
+ when 'list'
102
+ case
103
+ when !vals
104
+ 'Params::List[Params::String]'
105
+ when vals.first.module
106
+ vals.map(&:module).each{|m| m.write(base_path)}
107
+ "Params::Modules#{vals.map(&:name).map(&:to_sym)}"
108
+ else
109
+ "Params::List[Params::Enum#{vals.map(&:name).map(&:to_s)}]"
110
+ end
111
+ when 'list of integers'
112
+ 'Params::List[Params::Integer]'
113
+ when 'list of timestamps'
114
+ 'Params::List[Params::Timestamp]'
115
+ when 'enum'
116
+ case
117
+ #when name == 'generator'
118
+ #vals.map(&:module).each{|m| m.write(base_path)}
119
+ #"Params::Module#{vals.map(&:name).map{|n| ('g' + n).to_sym}}"
120
+ when vals.first.module
121
+ vals.map(&:module).each{|m| m.write(base_path)}
122
+ "Params::Module#{vals.map(&:name).map(&:to_sym)}"
123
+ else
124
+ "Params::Enum#{vals.map(&:name).map(&:to_s)}"
125
+ end
126
+ else
127
+ fail("Unrecognized param type: #{type}")
128
+ end
129
+ " param #{name.to_sym.inspect}, #{type_str}"
130
+ end
131
+
132
+ end
133
+ end
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'pp'
4
+
5
+ require 'bundler/setup'
6
+ require 'faraday'
7
+ require 'nokogiri'
8
+ require 'hashie'
9
+ require 'yaml'
10
+
11
+ $:.unshift 'lib'
12
+ require 'faraday/naive_cache'
13
+ require 'nokogiri/more'
14
+
15
+ require_relative 'lib/api'
16
+
17
+ # FIXME: with recursivesubmodules=true can export EVERYTHING from a single page
18
+
19
+ main = ApiParser::Module.from_url('/w/api.php?action=help')
20
+ File.write 'script/data/api.yaml', main.to_yaml
21
+ main.write('lib/mediawiktory/generated')
data/test/cache.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'bundler/setup'
2
+ require 'faraday'
3
+ $:.unshift 'lib'
4
+ require 'faraday/naive_cache'
5
+
6
+ c = Faraday.new do |builder|
7
+ builder.use Faraday::NaiveCache
8
+
9
+ builder.adapter Faraday.default_adapter
10
+ end
11
+
12
+ require 'pp'
13
+
14
+ resp = c.get('https://github.com')
15
+ pp resp.status
metadata ADDED
@@ -0,0 +1,340 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mediawiktory
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Victor Shepelev
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-11-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday_middleware
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: hashie
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: addressable
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description:
70
+ email: zverok.offline@gmail.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - Gemfile.lock
76
+ - README.md
77
+ - bin/mediawiktory
78
+ - doc/mediawiki_api_types.md
79
+ - examples/query.rb
80
+ - examples/query_generator.rb
81
+ - lib/faraday/naive_cache.rb
82
+ - lib/media_wiktory.rb
83
+ - lib/mediawiktory.rb
84
+ - lib/mediawiktory/action.rb
85
+ - lib/mediawiktory/array_with_keys.rb
86
+ - lib/mediawiktory/client.rb
87
+ - lib/mediawiktory/generated/abusefiltercheckmatch.rb
88
+ - lib/mediawiktory/generated/abusefilterchecksyntax.rb
89
+ - lib/mediawiktory/generated/abusefilterevalexpression.rb
90
+ - lib/mediawiktory/generated/abusefilters.rb
91
+ - lib/mediawiktory/generated/abusefilterunblockautopromote.rb
92
+ - lib/mediawiktory/generated/abuselog.rb
93
+ - lib/mediawiktory/generated/actions_mixin.rb
94
+ - lib/mediawiktory/generated/addstudents.rb
95
+ - lib/mediawiktory/generated/allcategories.rb
96
+ - lib/mediawiktory/generated/alldeletedrevisions.rb
97
+ - lib/mediawiktory/generated/allfileusages.rb
98
+ - lib/mediawiktory/generated/allimages.rb
99
+ - lib/mediawiktory/generated/alllinks.rb
100
+ - lib/mediawiktory/generated/allmessages.rb
101
+ - lib/mediawiktory/generated/allpages.rb
102
+ - lib/mediawiktory/generated/allredirects.rb
103
+ - lib/mediawiktory/generated/alltransclusions.rb
104
+ - lib/mediawiktory/generated/allusers.rb
105
+ - lib/mediawiktory/generated/antispoof.rb
106
+ - lib/mediawiktory/generated/backlinks.rb
107
+ - lib/mediawiktory/generated/betafeatures.rb
108
+ - lib/mediawiktory/generated/block.rb
109
+ - lib/mediawiktory/generated/blocks.rb
110
+ - lib/mediawiktory/generated/bouncehandler.rb
111
+ - lib/mediawiktory/generated/categories.rb
112
+ - lib/mediawiktory/generated/categoryinfo.rb
113
+ - lib/mediawiktory/generated/categorymembers.rb
114
+ - lib/mediawiktory/generated/centralauthtoken.rb
115
+ - lib/mediawiktory/generated/centralnoticechoicedata.rb
116
+ - lib/mediawiktory/generated/centralnoticelogs.rb
117
+ - lib/mediawiktory/generated/centralnoticequerycampaign.rb
118
+ - lib/mediawiktory/generated/checktoken.rb
119
+ - lib/mediawiktory/generated/checkuser.rb
120
+ - lib/mediawiktory/generated/checkuserlog.rb
121
+ - lib/mediawiktory/generated/cirrus-config-dump.rb
122
+ - lib/mediawiktory/generated/cirrus-mapping-dump.rb
123
+ - lib/mediawiktory/generated/cirrus-settings-dump.rb
124
+ - lib/mediawiktory/generated/cirrus-suggest.rb
125
+ - lib/mediawiktory/generated/clearhasmsg.rb
126
+ - lib/mediawiktory/generated/close-open-topic.rb
127
+ - lib/mediawiktory/generated/compare.rb
128
+ - lib/mediawiktory/generated/contenttranslation.rb
129
+ - lib/mediawiktory/generated/contenttranslationlangtrend.rb
130
+ - lib/mediawiktory/generated/contenttranslationstats.rb
131
+ - lib/mediawiktory/generated/contenttranslationsuggestions.rb
132
+ - lib/mediawiktory/generated/contributors.rb
133
+ - lib/mediawiktory/generated/coordinates.rb
134
+ - lib/mediawiktory/generated/createaccount.rb
135
+ - lib/mediawiktory/generated/cxconfiguration.rb
136
+ - lib/mediawiktory/generated/cxdelete.rb
137
+ - lib/mediawiktory/generated/cxpublish.rb
138
+ - lib/mediawiktory/generated/cxpublishedtranslations.rb
139
+ - lib/mediawiktory/generated/cxtoken.rb
140
+ - lib/mediawiktory/generated/delete.rb
141
+ - lib/mediawiktory/generated/deletedrevisions.rb
142
+ - lib/mediawiktory/generated/deletedrevs.rb
143
+ - lib/mediawiktory/generated/deleteeducation.rb
144
+ - lib/mediawiktory/generated/deleteglobalaccount.rb
145
+ - lib/mediawiktory/generated/duplicatefiles.rb
146
+ - lib/mediawiktory/generated/echomarkread.rb
147
+ - lib/mediawiktory/generated/echomarkseen.rb
148
+ - lib/mediawiktory/generated/edit-header.rb
149
+ - lib/mediawiktory/generated/edit-post.rb
150
+ - lib/mediawiktory/generated/edit-title.rb
151
+ - lib/mediawiktory/generated/edit-topic-summary.rb
152
+ - lib/mediawiktory/generated/edit.rb
153
+ - lib/mediawiktory/generated/editlist.rb
154
+ - lib/mediawiktory/generated/editmassmessagelist.rb
155
+ - lib/mediawiktory/generated/emailuser.rb
156
+ - lib/mediawiktory/generated/embeddedin.rb
157
+ - lib/mediawiktory/generated/enlist.rb
158
+ - lib/mediawiktory/generated/expandtemplates.rb
159
+ - lib/mediawiktory/generated/extlinks.rb
160
+ - lib/mediawiktory/generated/extracts.rb
161
+ - lib/mediawiktory/generated/exturlusage.rb
162
+ - lib/mediawiktory/generated/fancycaptchareload.rb
163
+ - lib/mediawiktory/generated/featuredfeed.rb
164
+ - lib/mediawiktory/generated/featureusage.rb
165
+ - lib/mediawiktory/generated/feedcontributions.rb
166
+ - lib/mediawiktory/generated/feedrecentchanges.rb
167
+ - lib/mediawiktory/generated/feedwatchlist.rb
168
+ - lib/mediawiktory/generated/filearchive.rb
169
+ - lib/mediawiktory/generated/filerepoinfo.rb
170
+ - lib/mediawiktory/generated/filerevert.rb
171
+ - lib/mediawiktory/generated/fileusage.rb
172
+ - lib/mediawiktory/generated/flagconfig.rb
173
+ - lib/mediawiktory/generated/flagged.rb
174
+ - lib/mediawiktory/generated/flow-parsoid-utils.rb
175
+ - lib/mediawiktory/generated/flow.rb
176
+ - lib/mediawiktory/generated/flowinfo.rb
177
+ - lib/mediawiktory/generated/flowthank.rb
178
+ - lib/mediawiktory/generated/gadgetcategories.rb
179
+ - lib/mediawiktory/generated/gadgets.rb
180
+ - lib/mediawiktory/generated/geosearch.rb
181
+ - lib/mediawiktory/generated/gettingstartedgetpages.rb
182
+ - lib/mediawiktory/generated/globalallusers.rb
183
+ - lib/mediawiktory/generated/globalblock.rb
184
+ - lib/mediawiktory/generated/globalblocks.rb
185
+ - lib/mediawiktory/generated/globalgroups.rb
186
+ - lib/mediawiktory/generated/globalusage.rb
187
+ - lib/mediawiktory/generated/globaluserinfo.rb
188
+ - lib/mediawiktory/generated/globaluserrights.rb
189
+ - lib/mediawiktory/generated/help.rb
190
+ - lib/mediawiktory/generated/imageinfo.rb
191
+ - lib/mediawiktory/generated/imagerotate.rb
192
+ - lib/mediawiktory/generated/images.rb
193
+ - lib/mediawiktory/generated/imageusage.rb
194
+ - lib/mediawiktory/generated/import.rb
195
+ - lib/mediawiktory/generated/info.rb
196
+ - lib/mediawiktory/generated/iwbacklinks.rb
197
+ - lib/mediawiktory/generated/iwlinks.rb
198
+ - lib/mediawiktory/generated/jsonconfig.rb
199
+ - lib/mediawiktory/generated/langbacklinks.rb
200
+ - lib/mediawiktory/generated/langlinks.rb
201
+ - lib/mediawiktory/generated/languagesearch.rb
202
+ - lib/mediawiktory/generated/links.rb
203
+ - lib/mediawiktory/generated/linkshere.rb
204
+ - lib/mediawiktory/generated/listmembership.rb
205
+ - lib/mediawiktory/generated/listpages.rb
206
+ - lib/mediawiktory/generated/lists.rb
207
+ - lib/mediawiktory/generated/liststudents.rb
208
+ - lib/mediawiktory/generated/lock-topic.rb
209
+ - lib/mediawiktory/generated/logevents.rb
210
+ - lib/mediawiktory/generated/login.rb
211
+ - lib/mediawiktory/generated/logout.rb
212
+ - lib/mediawiktory/generated/managetags.rb
213
+ - lib/mediawiktory/generated/massmessage.rb
214
+ - lib/mediawiktory/generated/mmsites.rb
215
+ - lib/mediawiktory/generated/mobileview.rb
216
+ - lib/mediawiktory/generated/moderate-post.rb
217
+ - lib/mediawiktory/generated/moderate-topic.rb
218
+ - lib/mediawiktory/generated/move.rb
219
+ - lib/mediawiktory/generated/new-topic.rb
220
+ - lib/mediawiktory/generated/notifications.rb
221
+ - lib/mediawiktory/generated/oldreviewedpages.rb
222
+ - lib/mediawiktory/generated/opensearch.rb
223
+ - lib/mediawiktory/generated/options.rb
224
+ - lib/mediawiktory/generated/pageimages.rb
225
+ - lib/mediawiktory/generated/pagepropnames.rb
226
+ - lib/mediawiktory/generated/pageprops.rb
227
+ - lib/mediawiktory/generated/pageswithprop.rb
228
+ - lib/mediawiktory/generated/pageterms.rb
229
+ - lib/mediawiktory/generated/pagetriageaction.rb
230
+ - lib/mediawiktory/generated/pagetriagelist.rb
231
+ - lib/mediawiktory/generated/pagetriagestats.rb
232
+ - lib/mediawiktory/generated/pagetriagetagging.rb
233
+ - lib/mediawiktory/generated/pagetriagetemplate.rb
234
+ - lib/mediawiktory/generated/paraminfo.rb
235
+ - lib/mediawiktory/generated/parse.rb
236
+ - lib/mediawiktory/generated/parsoid-batch.rb
237
+ - lib/mediawiktory/generated/patrol.rb
238
+ - lib/mediawiktory/generated/prefixsearch.rb
239
+ - lib/mediawiktory/generated/protect.rb
240
+ - lib/mediawiktory/generated/protectedtitles.rb
241
+ - lib/mediawiktory/generated/purge.rb
242
+ - lib/mediawiktory/generated/query.rb
243
+ - lib/mediawiktory/generated/querypage.rb
244
+ - lib/mediawiktory/generated/random.rb
245
+ - lib/mediawiktory/generated/recentchanges.rb
246
+ - lib/mediawiktory/generated/redirects.rb
247
+ - lib/mediawiktory/generated/refresheducation.rb
248
+ - lib/mediawiktory/generated/reply.rb
249
+ - lib/mediawiktory/generated/review.rb
250
+ - lib/mediawiktory/generated/reviewactivity.rb
251
+ - lib/mediawiktory/generated/revisiondelete.rb
252
+ - lib/mediawiktory/generated/revisions.rb
253
+ - lib/mediawiktory/generated/rollback.rb
254
+ - lib/mediawiktory/generated/rsd.rb
255
+ - lib/mediawiktory/generated/scribunto-console.rb
256
+ - lib/mediawiktory/generated/search.rb
257
+ - lib/mediawiktory/generated/setglobalaccountstatus.rb
258
+ - lib/mediawiktory/generated/setnotificationtimestamp.rb
259
+ - lib/mediawiktory/generated/siteinfo.rb
260
+ - lib/mediawiktory/generated/sitematrix.rb
261
+ - lib/mediawiktory/generated/spamblacklist.rb
262
+ - lib/mediawiktory/generated/stabilize.rb
263
+ - lib/mediawiktory/generated/stashedit.rb
264
+ - lib/mediawiktory/generated/stashimageinfo.rb
265
+ - lib/mediawiktory/generated/strikevote.rb
266
+ - lib/mediawiktory/generated/tag.rb
267
+ - lib/mediawiktory/generated/tags.rb
268
+ - lib/mediawiktory/generated/templatedata.rb
269
+ - lib/mediawiktory/generated/templates.rb
270
+ - lib/mediawiktory/generated/thank.rb
271
+ - lib/mediawiktory/generated/titleblacklist.rb
272
+ - lib/mediawiktory/generated/tokens.rb
273
+ - lib/mediawiktory/generated/transcludedin.rb
274
+ - lib/mediawiktory/generated/transcodereset.rb
275
+ - lib/mediawiktory/generated/transcodestatus.rb
276
+ - lib/mediawiktory/generated/ulslocalization.rb
277
+ - lib/mediawiktory/generated/unblock.rb
278
+ - lib/mediawiktory/generated/undelete.rb
279
+ - lib/mediawiktory/generated/undo-edit-header.rb
280
+ - lib/mediawiktory/generated/undo-edit-post.rb
281
+ - lib/mediawiktory/generated/undo-edit-topic-summary.rb
282
+ - lib/mediawiktory/generated/upload.rb
283
+ - lib/mediawiktory/generated/usercontribs.rb
284
+ - lib/mediawiktory/generated/userdailycontribs.rb
285
+ - lib/mediawiktory/generated/userinfo.rb
286
+ - lib/mediawiktory/generated/userrights.rb
287
+ - lib/mediawiktory/generated/users.rb
288
+ - lib/mediawiktory/generated/videoinfo.rb
289
+ - lib/mediawiktory/generated/view-header.rb
290
+ - lib/mediawiktory/generated/view-post-history.rb
291
+ - lib/mediawiktory/generated/view-post.rb
292
+ - lib/mediawiktory/generated/view-topic-history.rb
293
+ - lib/mediawiktory/generated/view-topic-summary.rb
294
+ - lib/mediawiktory/generated/view-topic.rb
295
+ - lib/mediawiktory/generated/view-topiclist.rb
296
+ - lib/mediawiktory/generated/visualeditor.rb
297
+ - lib/mediawiktory/generated/visualeditoredit.rb
298
+ - lib/mediawiktory/generated/watch.rb
299
+ - lib/mediawiktory/generated/watchlist.rb
300
+ - lib/mediawiktory/generated/watchlistraw.rb
301
+ - lib/mediawiktory/generated/wikibase.rb
302
+ - lib/mediawiktory/generated/wikilove.rb
303
+ - lib/mediawiktory/generated/wikisets.rb
304
+ - lib/mediawiktory/generated/zeroconfig.rb
305
+ - lib/mediawiktory/mw_module.rb
306
+ - lib/mediawiktory/query.rb
307
+ - lib/mediawiktory/version.rb
308
+ - lib/nokogiri/more.rb
309
+ - mediawiktory.gemspec
310
+ - script/data/api.yaml
311
+ - script/lib/api.rb
312
+ - script/lib/module.rb
313
+ - script/lib/parameter.rb
314
+ - script/parse_api.rb
315
+ - test/cache.rb
316
+ homepage: https://github.com/molybdenum-99/mediawiktory
317
+ licenses:
318
+ - MIT
319
+ metadata: {}
320
+ post_install_message:
321
+ rdoc_options: []
322
+ require_paths:
323
+ - lib
324
+ required_ruby_version: !ruby/object:Gem::Requirement
325
+ requirements:
326
+ - - ">="
327
+ - !ruby/object:Gem::Version
328
+ version: '0'
329
+ required_rubygems_version: !ruby/object:Gem::Requirement
330
+ requirements:
331
+ - - ">="
332
+ - !ruby/object:Gem::Version
333
+ version: '0'
334
+ requirements: []
335
+ rubyforge_project:
336
+ rubygems_version: 2.4.6
337
+ signing_key:
338
+ specification_version: 4
339
+ summary: Full-featured MediaWiki client with Arel-like queries
340
+ test_files: []