wikipedia-client 1.9.0 → 1.13.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 806d743adba4ad0839bbc288a7167e4b15ef7524c0ab9d6dabeaa463cb0960e6
4
- data.tar.gz: 9e0a592a25a19f1581ecb2840bffffe17616e2fa01d7ba3ad66a9dc636f9cc8e
3
+ metadata.gz: 5089a0eafa00495327e1d0376c3a9868ed0fe41277e5371717cd7acdc04175b5
4
+ data.tar.gz: '073885a731ca1cdc1f145e8b67438bf3e781dddc543c970b4a6ad79ea2a0fd43'
5
5
  SHA512:
6
- metadata.gz: 0aea030eca0258d932a780d0c9608f6e0d0dbdf0f1290b5b9d88e818888c04b06a994c077b30ec3b4d3f8d395f9b40b99df66f01c5e57db24fd9cba055ad1f45
7
- data.tar.gz: 1b05e6e5908b44cf5955288c5222fe12716c3955b51ba24d0cec3504c2d9a2a04a65732d5d27ad6043ae6b2b464ab2732b1937544a6f94aaf96e66d6461ede09
6
+ metadata.gz: 6a825bbd64b3c51b01a72a402a2919be96e52c4c32f345193105942738f0d580874b3f06f974cd654a64f86409d3e8439e5f20e0dc9c829be2b9376fc56274bc
7
+ data.tar.gz: 156a18e8075a1289ffdc9875edb01d1a91e07d2354eb5649c704b15b20c233e33ef983ea1666bb8a68d81798da78540c0001b499491926e7aaf6b556e551c357
@@ -0,0 +1,27 @@
1
+ name: Test
2
+ on:
3
+ pull_request:
4
+ push: { branches: master }
5
+
6
+ jobs:
7
+ test:
8
+ name: Ruby ${{ matrix.ruby }}
9
+ runs-on: ubuntu-latest
10
+ strategy:
11
+ matrix: { ruby: ['2.5', '2.6', '2.7', '3.0'] }
12
+
13
+ steps:
14
+ - name: Checkout code
15
+ uses: actions/checkout@v2
16
+
17
+ - name: Setup Ruby
18
+ uses: ruby/setup-ruby@v1
19
+ with:
20
+ ruby-version: '${{ matrix.ruby }}'
21
+ bundler-cache: true
22
+
23
+ - name: Run tests
24
+ run: bundle exec rspec
25
+
26
+ - name: Run rubocop
27
+ run: bundle exec rubocop
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  pkg/*
8
8
  coverage/
9
9
  rdoc/
10
+ Gemfile.lock
data/Gemfile CHANGED
@@ -1,2 +1,12 @@
1
1
  source 'https://rubygems.org'
2
+
3
+ gem 'jeweler'
4
+ gem 'pry'
5
+ gem 'rake'
6
+ gem 'rdoc'
7
+ gem 'rspec'
8
+ # FIXME: Remove rubocop version restriction and fix or disable cops
9
+ gem 'rubocop', '= 0.48.1'
10
+ gem 'thoughtbot-shoulda'
11
+
2
12
  gemspec
data/README.textile CHANGED
@@ -86,7 +86,11 @@ page.coordinates
86
86
 
87
87
  page.templates
88
88
 
89
- => [..., "Template:About", ...]</code></pre>
89
+ => [..., "Template:About", ...]
90
+
91
+ page.langlinks
92
+
93
+ => {..., "de"=>"Getting Things Done", "eo"=>"Igi aferojn finitaj", "zh"=>"尽管去做", ...}</code></pre>
90
94
 
91
95
  h2. Configuration
92
96
 
@@ -150,6 +154,7 @@ cdr-data <b_rhettbarber@yahoo.com>
150
154
  Christian Hellsten <christian.hellsten@gmail.com>
151
155
  Christopher Quackenbush <christopher@quackenbush.me>
152
156
  Cyril David
157
+ Danny Ben Shitrit <db@dannyben.com>
153
158
  Francesco Serra <afnecors@gmail.com>
154
159
  Harman Singh
155
160
  ivobenedito <ivobenedito@gmail.com>
@@ -161,3 +166,4 @@ Pietro F. Menna <pietromenna@yahoo.com>
161
166
  Sophie Rapoport <sfrapoport@gmail.com>
162
167
  tsukasaoishi <tsukasa.oishi@gmail.com>
163
168
  V <thevalentino@gmail.com>
169
+ Ilgiz Mustafin <ilgimustafin@gmail.com>
data/lib/wikipedia.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  Dir[File.dirname(__FILE__) + '/wikipedia/**/*.rb'].each { |f| require f }
2
2
 
3
- require 'uri'
4
-
5
3
  module Wikipedia
6
4
  # Examples :
7
5
  # page = Wikipedia.find('Rails')
@@ -1,7 +1,13 @@
1
+ require 'addressable'
2
+ require 'cgi'
3
+ require 'open-uri'
4
+ require 'set'
5
+
1
6
  module Wikipedia
2
7
  class Client
3
8
  # see http://en.wikipedia.org/w/api.php
4
- BASE_URL = ':protocol://:domain/:path?action=:action&format=json'.freeze
9
+ BASE_URL_TEMPLATE = '%{protocol}://%{domain}/%{path}?action=%{action}&format=json'.freeze
10
+ BASE_URL_OPTIONS = Set.new([:protocol, :domain, :path, :action])
5
11
 
6
12
  attr_accessor :follow_redirects
7
13
 
@@ -34,11 +40,12 @@ module Wikipedia
34
40
  def request_page( title, options = {} )
35
41
  request( {
36
42
  action: 'query',
37
- prop: %w[info revisions links extlinks images categories coordinates templates extracts pageimages],
43
+ prop: %w[info revisions links extlinks images categories coordinates templates extracts pageimages langlinks],
38
44
  rvprop: 'content',
39
45
  inprop: 'url',
40
46
  pithumbsize: 200,
41
47
  explaintext: '',
48
+ lllimit: 500,
42
49
  titles: title
43
50
  }.merge( options ) )
44
51
  end
@@ -65,7 +72,6 @@ module Wikipedia
65
72
  end
66
73
 
67
74
  def request( options )
68
- require 'open-uri'
69
75
  URI.parse( url_for( options ) ).read( 'User-Agent' => Configuration[:user_agent] )
70
76
  end
71
77
 
@@ -79,36 +85,33 @@ module Wikipedia
79
85
  }
80
86
  end
81
87
 
82
- def url_for( options )
83
- url = BASE_URL.dup
88
+ def url_for(options)
84
89
  options = configuration_options.merge( options )
85
- options.each do |key, val|
86
- value = urlify_value( val )
87
- if url.include?( ":#{key}" )
88
- url.sub! ":#{key}", value
89
- else
90
- url << "&#{key}=#{value}"
91
- end
92
- end
93
- url
90
+
91
+ url_options, query_options = split_hash(options, BASE_URL_OPTIONS)
92
+ normalized_query_options = query_options.map { |k, v| [k, normalize_value(v)] }
93
+
94
+ base_url = BASE_URL_TEMPLATE % url_options
95
+ query_string = Addressable::URI.form_encode(normalized_query_options)
96
+ base_url + '&' + query_string
94
97
  end
95
98
 
96
- def urlify_value( val )
99
+ def normalize_value( val )
97
100
  case val
98
101
  when Array
99
- encode( val.flatten.join( '|' ) )
102
+ val.flatten.join( '|' )
100
103
  else
101
- encode( val )
104
+ val
102
105
  end
103
106
  end
104
107
 
105
- def encode( val )
106
- case val
107
- when String
108
- URI.encode( val, /#{URI::UNSAFE}|[\+&]/ )
109
- else
110
- val
108
+ def split_hash(hash, keys)
109
+ h1 = {}
110
+ h2 = {}
111
+ hash.each do |k, v|
112
+ (keys.include?(k) ? h1 : h2).store(k, v)
111
113
  end
114
+ [h1, h2]
112
115
  end
113
116
  end
114
117
  end
@@ -60,6 +60,10 @@ module Wikipedia
60
60
  page['extlinks'].map { |c| c['*'] } if page['extlinks']
61
61
  end
62
62
 
63
+ def langlinks
64
+ Hash[page['langlinks'].collect { |c| [c['lang'], c['*']] }] if page['langlinks']
65
+ end
66
+
63
67
  def images
64
68
  page['images'].map { |c| c['title'] } if page['images']
65
69
  end
data/lib/wikipedia/url.rb CHANGED
@@ -1,3 +1,6 @@
1
+ require 'uri'
2
+ require 'addressable'
3
+
1
4
  module Wikipedia
2
5
  class Url
3
6
  def initialize(wiki_url)
@@ -8,7 +11,7 @@ module Wikipedia
8
11
  return @title if @title
9
12
 
10
13
  uri = URI.parse( @wiki_url )
11
- @title = URI.decode( uri.path.split('/').last )
14
+ @title = Addressable::URI.unencode( uri.path.sub(/\/wiki\//, '') )
12
15
  end
13
16
  end
14
17
  end
@@ -1,3 +1,3 @@
1
1
  module Wikipedia
2
- VERSION = '1.9.0'.freeze
2
+ VERSION = '1.13.0'.freeze
3
3
  end
@@ -0,0 +1 @@
1
+ {"continue":{"plcontinue":"46867293|0|Alkeyevsky_District","tlcontinue":"46867293|10|Infobox_Russian_town","continue":"||info|revisions|extlinks|images|categories|coordinates|extracts|pageimages|langlinks"},"warnings":{"extracts":{"*":"\"exlimit\" was too large for a whole article extracts request, lowered to 1."}},"query":{"pages":{"46867293":{"pageid":46867293,"ns":0,"title":"Innopolis","contentmodel":"wikitext","pagelanguage":"en","pagelanguagehtmlcode":"en","pagelanguagedir":"ltr","touched":"2018-03-17T20:09:26Z","lastrevid":826758180,"length":7900,"fullurl":"https://en.wikipedia.org/wiki/Innopolis","editurl":"https://en.wikipedia.org/w/index.php?title=Innopolis&action=edit","canonicalurl":"https://en.wikipedia.org/wiki/Innopolis","revisions":[{"contentformat":"text/x-wiki","contentmodel":"wikitext","*":"{{Distinguish|Innopoli}}\n\n{{Infobox Russian town\n|en_name=Innopolis\n|ru_name=\u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441\n|loc_name1=\u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441\n|loc_lang1=Tatar\n|image_skyline=\u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441. \u0422\u0435\u0445\u043d\u043e\u043f\u0430\u0440\u043a \u0438\u043c. \u0410.\u0421. \u041f\u043e\u043f\u043e\u0432\u0430.JPG\n|image_caption=A.S.&nbsp;Popov [[science park|technology park]] in Innopolis\n|coordinates = {{coord|55|44|N|48|44|E|display=inline,title}}\n|map_label_position=right\n|image_coa=\n|coa_caption=\n|image_flag=\n|flag_caption=\n|anthem=\n|anthem_ref=\n|holiday=\n|holiday_ref=\n|federal_subject=[[Republic of Tatarstan]]\n|federal_subject_ref=<ref name=\"RTatarstan_admlist\" />\n|adm_data_as_of=March 2015\n|adm_district_jur=[[Verkhneuslonsky District]]\n|adm_district_jur_ref=<ref name=\"RTatarstan_admlist\" />\n|inhabloc_cat=Town\n|inhabloc_cat_ref=<ref name=\"RTatarstan_admlist\" />\n|inhabloc_type=\n|inhabloc_type_ref=\n|mun_data_as_of=December 2014\n|mun_district_jur=Verkhneuslonsky Municipal District\n|mun_district_jur_ref=<ref name=\"RTatarstanVerkhneuslonskyD_mun\" />\n|urban_settlement_jur=Innopolis Urban Settlement\n|urban_settlement_jur_ref=<ref name=\"RTatarstanVerkhneuslonskyD_mun\" />\n|mun_admctr_of=Innopolis Urban Settlement\n|mun_admctr_of_ref=<ref name=\"RTatarstanVerkhneuslonskyD_mun\" />\n|leader_title=\n|leader_title_ref=\n|leader_name=\n|leader_name_ref=\n|representative_body=\n|representative_body_ref=\n|area_of_what=\n|area_as_of=\n|area_km2=\n|area_km2_ref=\n<!--\n|pop_2010census=did not exist in 2010\n|pop_2010census_ref=-->\n|pop_density=\n|pop_density_as_of=\n|pop_density_ref=\n|pop_latest=96\n|pop_latest_date=2016\n|pop_latest_ref=<ref name=\"2016Est\" />\n|established_date=December&nbsp;24, 2012\n|established_title=\n|established_date_ref=<ref name=\"Established\" />\n|current_cat_date=December&nbsp;16, 2014\n|current_cat_date_ref=<ref name=\"TownStatus\" />\n|postal_codes=420500\n|dialing_codes=\n|dialing_codes_ref=\n|website=http://www.innopolis.ru\n|website_ref=\n|date=June 2015\n}}\n'''Innopolis''' ({{lang-ru|\u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441}}; {{lang-tt|\u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441|Innopolis}}) is a [[types of inhabited localities in Russia|town]] in [[Verkhneuslonsky District]] of the [[Republic of Tatarstan]], [[Russia]], a [[satellite town|satellite]] of [[Kazan]], the [[capital city|capital]] of the republic.\n\nThis is the smallest town in Russia<ref>http://www.photokzn.ru/news/0/8880-innopolis</ref> with 96&nbsp;inhabitants according to the 2016 estimate.<ref name=\"2016Est\">Republic of Tatarstan Territorial Branch of the [[Russian Federal State Statistics Service|Federal State Statistics Service]]. [http://tatstat.gks.ru/wps/wcm/connect/rosstat_ts/tatstat/resources/4f3274804c0d84f9ab87abc621b350d8/%D0%9C%D0%9E%D1%87%D0%B8%D1%81%D0%BB2016.pdf \u0427\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e 2016&nbsp;\u0433.] {{ru icon}}</ref>\n\n==History==\n[[File:Medvedev, Nikiforov, Minnihanov in Kazan Innopolis (groundbreaking ceremony).jpeg|thumb|left|Inauguration of the Innopolis' foundation, June 2012. Left to right: [[Rustam Minnikhanov]], the [[President of the Republic of Tatarstan]]; [[Dmitry Medvedev]], the [[Prime Minister of Russia]]; [[Nikolay Nikiforov]], [[Ministry of Communications and Mass Media (Russia)|Minister of Communications and Mass Media]]]]\n\n[[File:Residental area.jpg|thumb|left|Residential area]]\n[[File:Innopolis University.jpg|thumb|left|The main building of the University of Innopolis]]\n\nInnopolis was established on December&nbsp;24, 2012<ref name=\"Established\">Resolution #2622-IV-GS</ref> as a technology park. Town status was granted to it on December&nbsp;16, 2014.<ref name=\"TownStatus\">Law #115-ZRT</ref>\n\n==Administrative and municipal status==\nWithin the [[subdivisions of Russia#Administrative divisions|framework of administrative divisions]], the [[types of inhabited localities in Russia|town]] of Innopolis is subordinated to [[Verkhneuslonsky District]].<ref name=\"RTatarstan_admlist\">Order #01-02/9</ref> As a [[subdivisions of Russia#Municipal divisions|municipal division]], Innopolis is incorporated within Verkhneuslonsky Municipal District as '''Innopolis Urban Settlement'''.<ref name=\"RTatarstanVerkhneuslonskyD_mun\">Law #19-ZRT</ref>\n\n\n==Urban Infrastructure==\nThe basis of the housing stock of Innopolis is 4 blocks of multi-storey apartment houses - 16 houses for 840 apartments - built by the State Housing Fund under the President of the Republic of Tatarstan and intended for leasing to residents of Innopolis and students.\n\nAs of the end of 2016, there was a kindergarten, a school, an IT lyceum, a sports and medical center, post offices, client offices of AK Bars and Sberbank, a beauty salon, a coffee shop and a supermarket in Innopolis.\n\n==References==\n===Notes===\n{{Reflist}}\n\n===Sources===\n*{{RussiaAdmMunRef|ta|adm|list}}\n*{{RussiaAdmMunRef|ta|mun|list|verkhneuslonsky}}\n*{{Cite Russian law\n|ru_entity=\u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0421\u043e\u0432\u0435\u0442 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d\n|ru_type=\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\n|ru_number=2622-IV-\u0413\u0421\n|ru_date=24 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2012 \u0433.\n|ru_title=\u041e\u0431 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0430\u0441\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430&nbsp;\u2014 \u043f\u043e\u0441\u0451\u043b\u043a\u0430 \u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441 \u043d\u0430 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0438 \u0412\u0435\u0440\u0445\u043d\u0435\u0443\u0441\u043b\u043e\u043d\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0439\u043e\u043d\u0430 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d\n|ru_effective_date=\n|ru_published_in=\"\u0412\u0435\u0434\u043e\u043c\u043e\u0441\u0442\u0438 \u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0421\u043e\u0432\u0435\u0442\u0430 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d\u0430\", \u211612 (III&nbsp;\u0447\u0430\u0441\u0442\u044c), \u0441\u0442.&nbsp;1926\n|ru_published_date=2012\n|ru_url=\n|en_entity=[[State Council of the Republic of Tatarstan]]\n|en_type=Resolution\n|en_number=2622-IV-GS\n|en_date=December&nbsp;24, 2012\n|en_title=On Establishing an Inhabited Locality\u2014the Settlement of Innopolis\u2014on the Territory of Verkhneuslonsky District of the Republic of Tatarstan\n|en_effective_date=\n|en_url=\n}}\n*{{Cite Russian law\n|ru_entity=\u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0421\u043e\u0432\u0435\u0442 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d\n|ru_type=\u0417\u0430\u043a\u043e\u043d\n|ru_number=115-\u0417\u0420\u0422\n|ru_date=13 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2014 \u0433.\n|ru_title=\u041e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u0441\u0451\u043b\u043a\u0430 \u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441 \u0412\u0435\u0440\u0445\u043d\u0435\u0443\u0441\u043b\u043e\u043d\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0439\u043e\u043d\u0430, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0412\u0432\u0435\u0434\u0435\u043d\u0441\u043a\u043e-\u0421\u043b\u043e\u0431\u043e\u0434\u0441\u043a\u043e\u0433\u043e \u0441\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u0412\u0435\u0440\u0445\u043d\u0435\u0443\u0441\u043b\u043e\u043d\u0441\u043a\u043e\u0433\u043e \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0439\u043e\u043d\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0417\u0430\u043a\u043e\u043d \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d \"\u041e\u0431 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \"\u0412\u0435\u0440\u0445\u043d\u0435\u0443\u0441\u043b\u043e\u043d\u0441\u043a\u0438\u0439 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0439\u043e\u043d\" \u0438 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0432 \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u0435\"\n|ru_effective_date=\u0441\u043e \u0434\u043d\u044f \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0438\u044f\n|ru_published_in=\"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d\", \u2116183\n|ru_published_date=16 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2014 \u0433\n|ru_url=\n|en_entity=[[State Council of the Republic of Tatarstan]]\n|en_type=Law\n|en_number=115-ZRT\n|en_date=December&nbsp;13, 2014\n|en_title=On the Transformation of the Settlement of Innopolis in Verkhneuslonsky District, on Changing the Borders of Several Municipal Formations, and on Transforming Vvedensko-Slobodskoye Rural Settlement in Verkhneuslonsky Municipal District, as well as Amending the Law of the Republic of Tatarstan \"On Establishing the Borders of the Territories and the Status of the Municipal Formation of \"Verkhneuslonsky Municipal District\" and of the Municipal Formations It Comprises\"\n|en_effective_date=the day of the official publication\n|en_url=\n}}\n\n{{Republic of Tatarstan}}\n{{Use mdy dates|date=June 2015}}\n\n[[Category:Cities and towns in Tatarstan]]\n[[Category:Populated places established in 2012]]\n[[Category:Naukograds]]\n[[Category:Information technology places]]"}],"links":[{"ns":0,"title":"Administrative centre"},{"ns":0,"title":"Administrative divisions of the Republic of Tatarstan"},{"ns":0,"title":"Agryz"},{"ns":0,"title":"Agryzsky District"},{"ns":0,"title":"Aksubayevo"},{"ns":0,"title":"Aksubayevsky District"},{"ns":0,"title":"Aktanyshsky District"},{"ns":0,"title":"Aktyubinsky, Republic of Tatarstan"},{"ns":0,"title":"Alexeyevskoye, Republic of Tatarstan"},{"ns":0,"title":"Alexeyevsky District, Republic of Tatarstan"}],"extlinks":[{"*":"//tools.wmflabs.org/geohack/geohack.php?pagename=Innopolis&params=55_44_N_48_44_E_region:RU-TA_type:city"},{"*":"http://pravo.tatarstan.ru"},{"*":"http://tatstat.gks.ru/wps/wcm/connect/rosstat_ts/tatstat/resources/4f3274804c0d84f9ab87abc621b350d8/%D0%9C%D0%9E%D1%87%D0%B8%D1%81%D0%BB2016.pdf"},{"*":"http://translate.google.com/translate?hl=en&sl=ru&tl=en&u=http://www.consultant.ru/cons/cgi/online.cgi?req=doc&base=LAW&n=201180"},{"*":"http://vinfo.russianpost.ru/servlet/department"},{"*":"http://www.consultant.ru/cons/cgi/online.cgi?req=doc&base=LAW&n=201180"},{"*":"http://www.innopolis.ru"},{"*":"http://www.photokzn.ru/news/0/8880-innopolis"}],"images":[{"ns":6,"title":"File:Coat of Arms of Tatarstan.svg"},{"ns":6,"title":"File:Flag of Tatarstan.svg"},{"ns":6,"title":"File:Innopolis University.jpg"},{"ns":6,"title":"File:Map of Russia - Republic of Tatarstan (2008-03).svg"},{"ns":6,"title":"File:Medvedev, Nikiforov, Minnihanov in Kazan Innopolis (groundbreaking ceremony).jpeg"},{"ns":6,"title":"File:Outline Map of Tatarstan.svg"},{"ns":6,"title":"File:Red pog.svg"},{"ns":6,"title":"File:Residental area.jpg"},{"ns":6,"title":"File:\u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441. \u0422\u0435\u0445\u043d\u043e\u043f\u0430\u0440\u043a \u0438\u043c. \u0410.\u0421. \u041f\u043e\u043f\u043e\u0432\u0430.JPG"}],"categories":[{"ns":14,"title":"Category:Articles containing Russian-language text"},{"ns":14,"title":"Category:Articles containing Tatar-language text"},{"ns":14,"title":"Category:Articles with Russian-language external links"},{"ns":14,"title":"Category:Cities and towns in Tatarstan"},{"ns":14,"title":"Category:Coordinates on Wikidata"},{"ns":14,"title":"Category:Information technology places"},{"ns":14,"title":"Category:Naukograds"},{"ns":14,"title":"Category:Populated places established in 2012"},{"ns":14,"title":"Category:Use mdy dates from June 2015"}],"coordinates":[{"lat":55.73333333,"lon":48.73333333,"primary":"","globe":"earth"}],"templates":[{"ns":10,"title":"Template:Category handler"},{"ns":10,"title":"Template:Cite Russian law"},{"ns":10,"title":"Template:Coord"},{"ns":10,"title":"Template:DMCA"},{"ns":10,"title":"Template:Dated maintenance category"},{"ns":10,"title":"Template:Distinguish"},{"ns":10,"title":"Template:FULLROOTPAGENAME"},{"ns":10,"title":"Template:ISO 639 name ru"},{"ns":10,"title":"Template:Infobox"},{"ns":10,"title":"Template:Infobox Russian inhabited locality"}],"extract":"Innopolis (Russian: \u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441; Tatar: Cyrillic \u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441, Latin Innopolis) is a town in Verkhneuslonsky District of the Republic of Tatarstan, Russia, a satellite of Kazan, the capital of the republic.\nThis is the smallest town in Russia with 96 inhabitants according to the 2016 estimate.\n\n\n== History ==\n\nInnopolis was established on December 24, 2012 as a technology park. Town status was granted to it on December 16, 2014.\n\n\n== Administrative and municipal status ==\nWithin the framework of administrative divisions, the town of Innopolis is subordinated to Verkhneuslonsky District. As a municipal division, Innopolis is incorporated within Verkhneuslonsky Municipal District as Innopolis Urban Settlement.\n\n\n== Urban Infrastructure ==\nThe basis of the housing stock of Innopolis is 4 blocks of multi-storey apartment houses - 16 houses for 840 apartments - built by the State Housing Fund under the President of the Republic of Tatarstan and intended for leasing to residents of Innopolis and students.\nAs of the end of 2016, there was a kindergarten, a school, an IT lyceum, a sports and medical center, post offices, client offices of AK Bars and Sberbank, a beauty salon, a coffee shop and a supermarket in Innopolis.\n\n\n== References ==\n\n\n=== Notes ===\n\n\n=== Sources ===\n\u041c\u0438\u043d\u0438\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u044e\u0441\u0442\u0438\u0446\u0438\u0438 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d. \u041f\u0440\u0438\u043a\u0430\u0437 \u211601-02/9 \u043e\u0442 4 \u0444\u0435\u0432\u0440\u0430\u043b\u044f 2014 \u0433. \u00ab\u041e\u0431 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0438 \u0440\u0435\u0435\u0441\u0442\u0440\u0430 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u043e-\u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0435\u0434\u0438\u043d\u0438\u0446 \u0438 \u043d\u0430\u0441\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432 \u0432 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0435 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d\u00bb, \u0432 \u0440\u0435\u0434. \u041f\u0440\u0438\u043a\u0430\u0437\u0430 \u211601-02/160 \u043e\u0442 11 \u043c\u0430\u0440\u0442\u0430 2015 \u0433. \u00ab\u041e \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u041f\u0440\u0438\u043a\u0430\u0437 \u041c\u0438\u043d\u0438\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u0430 \u044e\u0441\u0442\u0438\u0446\u0438\u0438 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d \u043e\u0442 04.02.2014 \u211601-02/9 \"\u041e\u0431 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0438 \u0440\u0435\u0435\u0441\u0442\u0440\u0430 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u043e-\u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0435\u0434\u0438\u043d\u0438\u0446 \u0438 \u043d\u0430\u0441\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432 \u0432 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0435 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d\"\u00bb. \u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d: \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u043f\u0440\u0430\u0432\u043e\u0432\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u041c\u0438\u043d\u0438\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u0430 \u044e\u0441\u0442\u0438\u0446\u0438\u0438 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d (http://pravo.tatarstan.ru), 27 \u0444\u0435\u0432\u0440\u0430\u043b\u044f 2014 \u0433. (Ministry of Justice of the Republic of Tatarstan. Order #01-02/9 of February 4, 2014 On the Adoption of the Registry of the Administrative-Territorial Units and Inhabited Localities in the Republic of Tatarstan, as amended by the Order #01-02/160 of March 11, 2015 On Amending the Order of the Ministry of Justice of the Republic of Tatarstan #01-02/9 of February 4, 2014 \"On the Adoption of the Registry of the Administrative-Territorial Units and Inhabited Localities in the Republic of Tatarstan\". ).\n\u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0421\u043e\u0432\u0435\u0442 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d. \u0417\u0430\u043a\u043e\u043d \u211619-\u0417\u0420\u0422 \u043e\u0442 31 \u044f\u043d\u0432\u0430\u0440\u044f 2005 \u0433. \u00ab\u041e\u0431 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \"\u0412\u0435\u0440\u0445\u043d\u0435\u0443\u0441\u043b\u043e\u043d\u0441\u043a\u0438\u0439 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0439\u043e\u043d\" \u0438 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0432 \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u0435\u00bb, \u0432 \u0440\u0435\u0434. \u0417\u0430\u043a\u043e\u043d\u0430 \u2116115-\u0417\u0420\u0422 \u043e\u0442 13 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2014 \u0433. \u00ab\u041e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u0441\u0451\u043b\u043a\u0430 \u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441 \u0412\u0435\u0440\u0445\u043d\u0435\u0443\u0441\u043b\u043e\u043d\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0439\u043e\u043d\u0430, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0412\u0432\u0435\u0434\u0435\u043d\u0441\u043a\u043e-\u0421\u043b\u043e\u0431\u043e\u0434\u0441\u043a\u043e\u0433\u043e \u0441\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u0412\u0435\u0440\u0445\u043d\u0435\u0443\u0441\u043b\u043e\u043d\u0441\u043a\u043e\u0433\u043e \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0439\u043e\u043d\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0417\u0430\u043a\u043e\u043d \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d \"\u041e\u0431 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \"\u0412\u0435\u0440\u0445\u043d\u0435\u0443\u0441\u043b\u043e\u043d\u0441\u043a\u0438\u0439 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0439\u043e\u043d\" \u0438 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0432 \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u0435\"\u00bb. \u0412\u0441\u0442\u0443\u043f\u0438\u043b \u0432 \u0441\u0438\u043b\u0443 \u0441\u043e \u0434\u043d\u044f \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d: \"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d\", \u2116\u211618\u201319, 1 \u0444\u0435\u0432\u0440\u0430\u043b\u044f 2005 \u0433. (State Council of the Republic of Tatarstan. Law #19-ZRT of January 31, 2005 On Establishing the Borders of the Territories and the Status of the Municipal Formation of \"Verkhneuslonsky Municipal District\" and of the Municipal Formations It Comprises, as amended by the Law #115-ZRT of December 13, 2014 On the Transformation of the Settlement of Innopolis in Verkhneuslonsky District, on Changing the Borders of Several Municipal Formations, and on Transforming Vvedensko-Slobodskoye Rural Settlement in Verkhneuslonsky Municipal District, as well as Amending the Law of the Republic of Tatarstan \"On Establishing the Borders of the Territories and the Status of the Municipal Formation of \"Verkhneuslonsky Municipal District\" and of the Municipal Formations It Comprises\". Effective as of the day of the official publication.).\n\u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0421\u043e\u0432\u0435\u0442 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d. \u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u21162622-IV-\u0413\u0421 \u043e\u0442 24 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2012 \u0433. \u00ab\u041e\u0431 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0430\u0441\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430 \u2014 \u043f\u043e\u0441\u0451\u043b\u043a\u0430 \u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441 \u043d\u0430 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0438 \u0412\u0435\u0440\u0445\u043d\u0435\u0443\u0441\u043b\u043e\u043d\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0439\u043e\u043d\u0430 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d\u00bb. \u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d: \"\u0412\u0435\u0434\u043e\u043c\u043e\u0441\u0442\u0438 \u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0421\u043e\u0432\u0435\u0442\u0430 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d\u0430\", \u211612 (III \u0447\u0430\u0441\u0442\u044c), \u0441\u0442. 1926, 2012. (State Council of the Republic of Tatarstan. Resolution #2622-IV-GS of December 24, 2012 On Establishing an Inhabited Locality\u2014the Settlement of Innopolis\u2014on the Territory of Verkhneuslonsky District of the Republic of Tatarstan. ).\n\u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0421\u043e\u0432\u0435\u0442 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d. \u0417\u0430\u043a\u043e\u043d \u2116115-\u0417\u0420\u0422 \u043e\u0442 13 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2014 \u0433. \u00ab\u041e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u0441\u0451\u043b\u043a\u0430 \u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441 \u0412\u0435\u0440\u0445\u043d\u0435\u0443\u0441\u043b\u043e\u043d\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0439\u043e\u043d\u0430, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0412\u0432\u0435\u0434\u0435\u043d\u0441\u043a\u043e-\u0421\u043b\u043e\u0431\u043e\u0434\u0441\u043a\u043e\u0433\u043e \u0441\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u0412\u0435\u0440\u0445\u043d\u0435\u0443\u0441\u043b\u043e\u043d\u0441\u043a\u043e\u0433\u043e \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0439\u043e\u043d\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0417\u0430\u043a\u043e\u043d \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d \"\u041e\u0431 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \"\u0412\u0435\u0440\u0445\u043d\u0435\u0443\u0441\u043b\u043e\u043d\u0441\u043a\u0438\u0439 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0439\u043e\u043d\" \u0438 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0432 \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u0435\"\u00bb. \u0412\u0441\u0442\u0443\u043f\u0438\u043b \u0432 \u0441\u0438\u043b\u0443 \u0441\u043e \u0434\u043d\u044f \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d: \"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d\", \u2116183, 16 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2014 \u0433. (State Council of the Republic of Tatarstan. Law #115-ZRT of December 13, 2014 On the Transformation of the Settlement of Innopolis in Verkhneuslonsky District, on Changing the Borders of Several Municipal Formations, and on Transforming Vvedensko-Slobodskoye Rural Settlement in Verkhneuslonsky Municipal District, as well as Amending the Law of the Republic of Tatarstan \"On Establishing the Borders of the Territories and the Status of the Municipal Formation of \"Verkhneuslonsky Municipal District\" and of the Municipal Formations It Comprises\". Effective as of the day of the official publication.).","thumbnail":{"source":"https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/%D0%98%D0%BD%D0%BD%D0%BE%D0%BF%D0%BE%D0%BB%D0%B8%D1%81._%D0%A2%D0%B5%D1%85%D0%BD%D0%BE%D0%BF%D0%B0%D1%80%D0%BA_%D0%B8%D0%BC._%D0%90.%D0%A1._%D0%9F%D0%BE%D0%BF%D0%BE%D0%B2%D0%B0.JPG/200px-%D0%98%D0%BD%D0%BD%D0%BE%D0%BF%D0%BE%D0%BB%D0%B8%D1%81._%D0%A2%D0%B5%D1%85%D0%BD%D0%BE%D0%BF%D0%B0%D1%80%D0%BA_%D0%B8%D0%BC._%D0%90.%D0%A1._%D0%9F%D0%BE%D0%BF%D0%BE%D0%B2%D0%B0.JPG","width":200,"height":133},"pageimage":"\u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441._\u0422\u0435\u0445\u043d\u043e\u043f\u0430\u0440\u043a_\u0438\u043c._\u0410.\u0421._\u041f\u043e\u043f\u043e\u0432\u0430.JPG","langlinks":[{"lang":"ba","*":"\u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441"},{"lang":"bg","*":"\u0418\u043d\u043e\u043f\u043e\u043b\u0438\u0441"},{"lang":"he","*":"\u05d0\u05d9\u05e0\u05d5\u05e4\u05d5\u05dc\u05d9\u05e1"},{"lang":"hsb","*":"Innopolis"},{"lang":"lb","*":"Innopolis"},{"lang":"ru","*":"\u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441"},{"lang":"tt","*":"\u0418\u043d\u043d\u043e\u043f\u043e\u043b\u0438\u0441"},{"lang":"wo","*":"Innopolis"}]}}}}
@@ -91,12 +91,27 @@ describe Wikipedia::Client, '.find page with one section (mocked)' do
91
91
  end
92
92
 
93
93
  describe Wikipedia::Client, '.find page with special characters in title' do
94
- it 'should properly escaped the special characters' do
94
+ before(:each) do
95
95
  @client = Wikipedia::Client.new
96
+ end
97
+
98
+ it 'should properly escape all special characters' do
96
99
  @page = @client.find('A +&%=?:/ B')
97
100
  expect(@page.title).to eq('A +&%=?:/ B')
98
101
  expect(@page.fullurl).to eq('https://en.wikipedia.org/wiki/A_%2B%26%25%3D%3F:/_B')
99
102
  end
103
+
104
+ it 'should handle pluses in article titles' do
105
+ @page = @client.find('C++')
106
+ expect(@page.title).to eq('C++')
107
+ expect(@page.fullurl).to eq('https://en.wikipedia.org/wiki/C%2B%2B')
108
+ end
109
+
110
+ it 'should handle slashes in article titles' do
111
+ @page = @client.find('PL/SQL')
112
+ expect(@page.title).to eq('PL/SQL')
113
+ expect(@page.fullurl).to eq('https://en.wikipedia.org/wiki/PL/SQL')
114
+ end
100
115
  end
101
116
 
102
117
  describe Wikipedia::Client, '.find image (mocked)' do
@@ -146,15 +161,9 @@ describe Wikipedia::Client, '.find page (Edsger_Dijkstra)' do
146
161
  @client.follow_redirects = true
147
162
  @page = @client.find('Edsger Dijkstra')
148
163
  [
149
- '/en/4/4a/Commons-logo.svg',
150
- '/en/4/48/Folder_Hexagonal_Icon.svg',
151
164
  '/commons/5/57/Dijkstra_Animation.gif',
152
165
  '/commons/c/c9/Edsger_Dijkstra_1994.jpg',
153
- '/commons/d/d9/Edsger_Wybe_Dijkstra.jpg',
154
- '/commons/0/00/Complex-adaptive-system.jpg',
155
- '/en/4/4d/Centrum-wiskunde-informatica-logo.png',
156
- '/commons/7/7b/An_illustration_of_the_dining_philosophers_problem.png',
157
- '/commons/3/37/Detail_of_a_1Kb_ferrite_core_RAM-module_of_an_1960s_Electrologica_X1_computer.jpg'
166
+ '/commons/d/d9/Edsger_Wybe_Dijkstra.jpg'
158
167
  ].each do |image|
159
168
  expect(@page.image_urls).to include('https://upload.wikimedia.org/wikipedia' + image)
160
169
  end
@@ -164,13 +173,9 @@ describe Wikipedia::Client, '.find page (Edsger_Dijkstra)' do
164
173
  @client.follow_redirects = true
165
174
  @page = @client.find('Edsger Dijkstra')
166
175
  [
167
- '/en/thumb/4/4a/Commons-logo.svg/200px-Commons-logo.svg.png',
168
- '/en/thumb/4/48/Folder_Hexagonal_Icon.svg/200px-Folder_Hexagonal_Icon.svg.png',
169
176
  '/commons/thumb/5/57/Dijkstra_Animation.gif/200px-Dijkstra_Animation.gif',
170
177
  '/commons/thumb/c/c9/Edsger_Dijkstra_1994.jpg/200px-Edsger_Dijkstra_1994.jpg',
171
- '/commons/thumb/d/d9/Edsger_Wybe_Dijkstra.jpg/200px-Edsger_Wybe_Dijkstra.jpg',
172
- '/commons/thumb/0/00/Complex-adaptive-system.jpg/200px-Complex-adaptive-system.jpg',
173
- '/en/thumb/4/4d/Centrum-wiskunde-informatica-logo.png/200px-Centrum-wiskunde-informatica-logo.png'
178
+ '/commons/thumb/d/d9/Edsger_Wybe_Dijkstra.jpg/200px-Edsger_Wybe_Dijkstra.jpg'
174
179
  ].each do |image|
175
180
  expect(@page.image_thumburls).to include('https://upload.wikimedia.org/wikipedia' + image)
176
181
  end
@@ -180,13 +185,9 @@ describe Wikipedia::Client, '.find page (Edsger_Dijkstra)' do
180
185
  @client.follow_redirects = true
181
186
  @page = @client.find('Edsger Dijkstra')
182
187
  [
183
- '/en/thumb/4/4a/Commons-logo.svg/100px-Commons-logo.svg.png',
184
- '/en/thumb/4/48/Folder_Hexagonal_Icon.svg/100px-Folder_Hexagonal_Icon.svg.png',
185
188
  '/commons/thumb/5/57/Dijkstra_Animation.gif/100px-Dijkstra_Animation.gif',
186
189
  '/commons/thumb/c/c9/Edsger_Dijkstra_1994.jpg/100px-Edsger_Dijkstra_1994.jpg',
187
- '/commons/thumb/d/d9/Edsger_Wybe_Dijkstra.jpg/100px-Edsger_Wybe_Dijkstra.jpg',
188
- '/commons/thumb/0/00/Complex-adaptive-system.jpg/100px-Complex-adaptive-system.jpg',
189
- '/en/thumb/4/4d/Centrum-wiskunde-informatica-logo.png/100px-Centrum-wiskunde-informatica-logo.png'
190
+ '/commons/thumb/d/d9/Edsger_Wybe_Dijkstra.jpg/100px-Edsger_Wybe_Dijkstra.jpg'
190
191
  ].each do |image|
191
192
  expect(@page.image_thumburls(100)).to include('https://upload.wikimedia.org/wikipedia' + image)
192
193
  end
@@ -262,3 +263,25 @@ describe Wikipedia::Client, '.find page (mocked)' do
262
263
  expect(@page.image_urls).to eq(nil)
263
264
  end
264
265
  end
266
+
267
+ describe Wikipedia::Client, 'page.langlinks' do
268
+ before(:each) do
269
+ @client = Wikipedia::Client.new
270
+ @innopolis = File.read(File.dirname(__FILE__) + '/../fixtures/Innopolis.json')
271
+ expect(@client).to receive(:request).and_return(@innopolis)
272
+ end
273
+
274
+ it 'should contain langlinks' do
275
+ @page = @client.find('Innopolis')
276
+ expect(@page.langlinks).to include(
277
+ 'ba' => 'Иннополис',
278
+ 'bg' => 'Инополис',
279
+ 'he' => 'אינופוליס',
280
+ 'hsb' => 'Innopolis',
281
+ 'lb' => 'Innopolis',
282
+ 'ru' => 'Иннополис',
283
+ 'tt' => 'Иннополис',
284
+ 'wo' => 'Innopolis'
285
+ )
286
+ end
287
+ end
@@ -4,7 +4,6 @@ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
4
4
  require 'wikipedia/version'
5
5
  require 'date'
6
6
 
7
- # rubocop:disable Metrics/BlockLength
8
7
  Gem::Specification.new do |s|
9
8
  s.name = 'wikipedia-client'
10
9
  s.version = Wikipedia::VERSION
@@ -19,34 +18,14 @@ Gem::Specification.new do |s|
19
18
  s.email = 'ken@kenpratt.net'
20
19
 
21
20
  s.homepage = 'http://github.com/kenpratt/wikipedia-client'
22
- s.rubygems_version = '1.8.23'
23
21
  s.summary = 'Ruby client for the Wikipedia API'
24
22
  s.platform = Gem::Platform::RUBY
25
23
  s.files = `git ls-files`.split("\n")
26
24
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
27
25
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
28
- s.has_rdoc = true
29
26
  s.extra_rdoc_files = ['README.textile']
30
27
  s.bindir = 'bin'
31
28
 
32
29
  s.require_paths << 'lib'
33
30
  s.rdoc_options << '--title' << 'wikipedia-client' << '--main' << '-ri'
34
-
35
- s.add_development_dependency('rake', '~> 10.1')
36
- s.add_development_dependency('rspec', '~> 3.0')
37
- s.add_development_dependency('rdoc', '~> 4.0')
38
- s.add_development_dependency('jeweler', '~> 1.8')
39
- s.add_development_dependency('rubocop', '~> 0.48')
40
-
41
- if s.respond_to? :specification_version
42
- s.specification_version = 3
43
-
44
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0')
45
- s.add_development_dependency('thoughtbot-shoulda', '~> 2.11', ['>= 2.11'])
46
- else
47
- s.add_dependency('thoughtbot-shoulda', ['>= 0'])
48
- end
49
- else
50
- s.add_dependency('thoughtbot-shoulda', ['>= 0'])
51
- end
52
31
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wikipedia-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.0
4
+ version: 1.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyril David
@@ -10,101 +10,11 @@ authors:
10
10
  - Aishwarya Subramanian
11
11
  - Pietro Menna
12
12
  - Sophie Rapoport
13
- autorequire:
13
+ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2018-02-28 00:00:00.000000000 Z
17
- dependencies:
18
- - !ruby/object:Gem::Dependency
19
- name: rake
20
- requirement: !ruby/object:Gem::Requirement
21
- requirements:
22
- - - "~>"
23
- - !ruby/object:Gem::Version
24
- version: '10.1'
25
- type: :development
26
- prerelease: false
27
- version_requirements: !ruby/object:Gem::Requirement
28
- requirements:
29
- - - "~>"
30
- - !ruby/object:Gem::Version
31
- version: '10.1'
32
- - !ruby/object:Gem::Dependency
33
- name: rspec
34
- requirement: !ruby/object:Gem::Requirement
35
- requirements:
36
- - - "~>"
37
- - !ruby/object:Gem::Version
38
- version: '3.0'
39
- type: :development
40
- prerelease: false
41
- version_requirements: !ruby/object:Gem::Requirement
42
- requirements:
43
- - - "~>"
44
- - !ruby/object:Gem::Version
45
- version: '3.0'
46
- - !ruby/object:Gem::Dependency
47
- name: rdoc
48
- requirement: !ruby/object:Gem::Requirement
49
- requirements:
50
- - - "~>"
51
- - !ruby/object:Gem::Version
52
- version: '4.0'
53
- type: :development
54
- prerelease: false
55
- version_requirements: !ruby/object:Gem::Requirement
56
- requirements:
57
- - - "~>"
58
- - !ruby/object:Gem::Version
59
- version: '4.0'
60
- - !ruby/object:Gem::Dependency
61
- name: jeweler
62
- requirement: !ruby/object:Gem::Requirement
63
- requirements:
64
- - - "~>"
65
- - !ruby/object:Gem::Version
66
- version: '1.8'
67
- type: :development
68
- prerelease: false
69
- version_requirements: !ruby/object:Gem::Requirement
70
- requirements:
71
- - - "~>"
72
- - !ruby/object:Gem::Version
73
- version: '1.8'
74
- - !ruby/object:Gem::Dependency
75
- name: rubocop
76
- requirement: !ruby/object:Gem::Requirement
77
- requirements:
78
- - - "~>"
79
- - !ruby/object:Gem::Version
80
- version: '0.48'
81
- type: :development
82
- prerelease: false
83
- version_requirements: !ruby/object:Gem::Requirement
84
- requirements:
85
- - - "~>"
86
- - !ruby/object:Gem::Version
87
- version: '0.48'
88
- - !ruby/object:Gem::Dependency
89
- name: thoughtbot-shoulda
90
- requirement: !ruby/object:Gem::Requirement
91
- requirements:
92
- - - "~>"
93
- - !ruby/object:Gem::Version
94
- version: '2.11'
95
- - - ">="
96
- - !ruby/object:Gem::Version
97
- version: '2.11'
98
- type: :development
99
- prerelease: false
100
- version_requirements: !ruby/object:Gem::Requirement
101
- requirements:
102
- - - "~>"
103
- - !ruby/object:Gem::Version
104
- version: '2.11'
105
- - - ">="
106
- - !ruby/object:Gem::Version
107
- version: '2.11'
16
+ date: 2021-04-28 00:00:00.000000000 Z
17
+ dependencies: []
108
18
  description: Ruby client for the Wikipedia API
109
19
  email: ken@kenpratt.net
110
20
  executables: []
@@ -113,11 +23,10 @@ extra_rdoc_files:
113
23
  - README.textile
114
24
  files:
115
25
  - ".editorconfig"
26
+ - ".github/workflows/test.yml"
116
27
  - ".gitignore"
117
28
  - ".rubocop.yml"
118
- - ".travis.yml"
119
29
  - Gemfile
120
- - Gemfile.lock
121
30
  - MIT-LICENSE
122
31
  - README.textile
123
32
  - Rakefile
@@ -135,6 +44,7 @@ files:
135
44
  - spec/fixtures/Edsger_Dijkstra_section_0.json
136
45
  - spec/fixtures/Edsger_content.txt
137
46
  - spec/fixtures/File_Edsger_Wybe_Dijkstra_jpg.json
47
+ - spec/fixtures/Innopolis.json
138
48
  - spec/fixtures/Sealand_Dynasty.json
139
49
  - spec/fixtures/sanitization_samples/Ceawlin_of_Wessex-raw.txt
140
50
  - spec/fixtures/sanitization_samples/Ceawlin_of_Wessex-sanitized.txt
@@ -174,7 +84,7 @@ homepage: http://github.com/kenpratt/wikipedia-client
174
84
  licenses:
175
85
  - MIT
176
86
  metadata: {}
177
- post_install_message:
87
+ post_install_message:
178
88
  rdoc_options:
179
89
  - "--title"
180
90
  - wikipedia-client
@@ -194,10 +104,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
104
  - !ruby/object:Gem::Version
195
105
  version: '0'
196
106
  requirements: []
197
- rubyforge_project:
198
- rubygems_version: 2.7.3
199
- signing_key:
200
- specification_version: 3
107
+ rubygems_version: 3.0.3
108
+ signing_key:
109
+ specification_version: 4
201
110
  summary: Ruby client for the Wikipedia API
202
111
  test_files:
203
112
  - spec/fixtures/Edsger_Dijkstra.json
@@ -205,6 +114,7 @@ test_files:
205
114
  - spec/fixtures/Edsger_Dijkstra_section_0.json
206
115
  - spec/fixtures/Edsger_content.txt
207
116
  - spec/fixtures/File_Edsger_Wybe_Dijkstra_jpg.json
117
+ - spec/fixtures/Innopolis.json
208
118
  - spec/fixtures/Sealand_Dynasty.json
209
119
  - spec/fixtures/sanitization_samples/Ceawlin_of_Wessex-raw.txt
210
120
  - spec/fixtures/sanitization_samples/Ceawlin_of_Wessex-sanitized.txt
data/.travis.yml DELETED
@@ -1,8 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.0
4
- - 2.1
5
- - 2.2
6
- - 2.3
7
- - 2.4
8
- - 2.5
data/Gemfile.lock DELETED
@@ -1,93 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- wikipedia-client (1.9.0)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- addressable (2.3.5)
10
- ast (2.3.0)
11
- builder (3.2.2)
12
- diff-lcs (1.3)
13
- faraday (0.8.8)
14
- multipart-post (~> 1.2.0)
15
- git (1.2.6)
16
- github_api (0.10.1)
17
- addressable
18
- faraday (~> 0.8.1)
19
- hashie (>= 1.2)
20
- multi_json (~> 1.4)
21
- nokogiri (~> 1.5.2)
22
- oauth2
23
- hashie (2.0.5)
24
- highline (1.6.19)
25
- httpauth (0.2.0)
26
- jeweler (1.8.8)
27
- builder
28
- bundler (~> 1.0)
29
- git (>= 1.2.5)
30
- github_api (= 0.10.1)
31
- highline (>= 1.6.15)
32
- nokogiri (= 1.5.10)
33
- rake
34
- rdoc
35
- json (1.8.6)
36
- jwt (0.1.8)
37
- multi_json (>= 1.5)
38
- multi_json (1.8.1)
39
- multi_xml (0.5.5)
40
- multipart-post (1.2.0)
41
- nokogiri (1.5.10)
42
- oauth2 (0.9.2)
43
- faraday (~> 0.8)
44
- httpauth (~> 0.2)
45
- jwt (~> 0.1.4)
46
- multi_json (~> 1.0)
47
- multi_xml (~> 0.5)
48
- rack (~> 1.2)
49
- parser (2.4.0.0)
50
- ast (~> 2.2)
51
- powerpack (0.1.1)
52
- rack (1.5.2)
53
- rainbow (2.2.2)
54
- rake
55
- rake (10.1.0)
56
- rdoc (4.0.1)
57
- json (~> 1.4)
58
- rspec (3.0.0)
59
- rspec-core (~> 3.0.0)
60
- rspec-expectations (~> 3.0.0)
61
- rspec-mocks (~> 3.0.0)
62
- rspec-core (3.0.4)
63
- rspec-support (~> 3.0.0)
64
- rspec-expectations (3.0.4)
65
- diff-lcs (>= 1.2.0, < 2.0)
66
- rspec-support (~> 3.0.0)
67
- rspec-mocks (3.0.4)
68
- rspec-support (~> 3.0.0)
69
- rspec-support (3.0.4)
70
- rubocop (0.48.1)
71
- parser (>= 2.3.3.1, < 3.0)
72
- powerpack (~> 0.1)
73
- rainbow (>= 1.99.1, < 3.0)
74
- ruby-progressbar (~> 1.7)
75
- unicode-display_width (~> 1.0, >= 1.0.1)
76
- ruby-progressbar (1.8.1)
77
- thoughtbot-shoulda (2.11.1)
78
- unicode-display_width (1.2.1)
79
-
80
- PLATFORMS
81
- ruby
82
-
83
- DEPENDENCIES
84
- jeweler (~> 1.8)
85
- rake (~> 10.1)
86
- rdoc (~> 4.0)
87
- rspec (~> 3.0)
88
- rubocop (~> 0.48)
89
- thoughtbot-shoulda (~> 2.11, >= 2.11)
90
- wikipedia-client!
91
-
92
- BUNDLED WITH
93
- 1.15.1