Class: WikiData::Category

Inherits:
WikiData show all
Defined in:
lib/wikidata/category.rb

Instance Method Summary collapse

Methods inherited from WikiData

ids_from_pages

Constructor Details

#initialize(page, lang = 'en') ⇒ Category

Returns a new instance of Category.



5
6
7
8
# File 'lib/wikidata/category.rb', line 5

def initialize(page, lang = 'en')
  @_page = page
  @_lang = lang
end

Instance Method Details

#_categorymembers_search(args = {}) ⇒ Object



14
15
16
17
18
19
20
21
22
# File 'lib/wikidata/category.rb', line 14

def _categorymembers_search(args = {})
  cat_args = {
    cmtitle:    @_page,
    token_type: false,
    list:       'categorymembers',
    cmlimit:    '500',
  }.merge(args)
  client.action :query, cat_args
end

#clientObject



10
11
12
# File 'lib/wikidata/category.rb', line 10

def client
  @_client ||= MediawikiApi::Client.new "https://#{@_lang}.wikipedia.org/w/api.php"
end

#member_idsObject



40
41
42
# File 'lib/wikidata/category.rb', line 40

def member_ids
  members.map { |m| m['pageid'] }.sort
end

#member_titlesObject



44
45
46
# File 'lib/wikidata/category.rb', line 44

def member_titles
  members.map { |m| m['title'] }.sort
end

#membersObject



24
25
26
27
28
29
30
31
32
# File 'lib/wikidata/category.rb', line 24

def members
  search = _categorymembers_search
  all = search.data['categorymembers']
  while search['continue']
    search = _categorymembers_search(cmcontinue: search['continue']['cmcontinue'])
    all << search.data['categorymembers']
  end
  all.flatten.select { |m| (m['ns']).zero? }
end

#subcategoriesObject



34
35
36
37
38
# File 'lib/wikidata/category.rb', line 34

def subcategories
  search = _categorymembers_search
  all = search.data['categorymembers']
  all.flatten.select { |m| m['ns'] == 14 }.map { |m| m['title'] }
end

#wikidata_idsObject



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/wikidata/category.rb', line 48

def wikidata_ids
  member_ids.compact.each_slice(50).map do |ids|
    page_args = {
      prop:       'pageprops',
      ppprop:     'wikibase_item',
      redirects:  1,
      pageids:    ids.join('|'),
      token_type: false,
    }
    response = client.action :query, page_args
    response.data['pages'].find_all { |p| p.last.key? 'pageprops' }.map { |p| p.last['pageprops']['wikibase_item'] }
  end.flatten
end