From b6f6899ecc69954113317194a8031e1e63413261 Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Mon, 22 Jul 2019 14:14:14 +0500 Subject: [PATCH] Add column FederalSubject#centre --- app/models/federal_subject.rb | 12 ++ app/views/federal_subjects/index.html.erb | 4 + app/views/federal_subjects/show.html.erb | 3 + config/federal_subjects.csv | 170 +++++++++--------- config/locales/activerecord/en.yml | 1 + config/locales/activerecord/ru.yml | 1 + .../20181129203927_initial_migration.rb | 9 + db/seeds.rb | 8 +- db/structure.sql | 2 + factories/federal_subjects.rb | 2 + spec/models/federal_subject_spec.rb | 16 ++ 11 files changed, 141 insertions(+), 87 deletions(-) diff --git a/app/models/federal_subject.rb b/app/models/federal_subject.rb index 07e5670..8973198 100644 --- a/app/models/federal_subject.rb +++ b/app/models/federal_subject.rb @@ -35,6 +35,10 @@ class FederalSubject < ApplicationRecord uniqueness: true, length: { in: 1..255 } + validates :centre, + presence: true, + length: { in: 1..255 } + validates :number, presence: true, uniqueness: true, @@ -44,6 +48,7 @@ class FederalSubject < ApplicationRecord validate :english_name_looks_realistic validate :native_name_looks_realistic + validate :centre_looks_realistic ########### # Methods # @@ -72,4 +77,11 @@ private errors.add :native_name, :leading_spaces if native_name.start_with? ' ' errors.add :native_name, :trailing_spaces if native_name.end_with? ' ' end + + def centre_looks_realistic + return if centre.blank? + + errors.add :centre, :leading_spaces if centre.start_with? ' ' + errors.add :centre, :trailing_spaces if centre.end_with? ' ' + end end diff --git a/app/views/federal_subjects/index.html.erb b/app/views/federal_subjects/index.html.erb index 64cd1de..ddfd970 100644 --- a/app/views/federal_subjects/index.html.erb +++ b/app/views/federal_subjects/index.html.erb @@ -8,6 +8,9 @@ <%= FederalSubject.human_attribute_name :display_name %> + + <%= FederalSubject.human_attribute_name :centre %> + <%= FederalSubject.human_attribute_name :timezone %> @@ -20,6 +23,7 @@ <%= federal_subject.number %> <%= federal_subject.display_name %> + <%= federal_subject.centre %> <%= federal_subject.timezone %> <% if policy(federal_subject).show? %> diff --git a/app/views/federal_subjects/show.html.erb b/app/views/federal_subjects/show.html.erb index 6315544..7114c63 100644 --- a/app/views/federal_subjects/show.html.erb +++ b/app/views/federal_subjects/show.html.erb @@ -8,6 +8,9 @@

+
<%= FederalSubject.human_attribute_name :centre %>
+
<%= @federal_subject.centre %>
+
<%= FederalSubject.human_attribute_name :number %>
<%= @federal_subject.number %>
diff --git a/config/federal_subjects.csv b/config/federal_subjects.csv index 784f206..55f8010 100644 --- a/config/federal_subjects.csv +++ b/config/federal_subjects.csv @@ -1,85 +1,85 @@ -22 | Altai Krai | Алтайский край | 22 | 06:00:00 -31 | Amur Oblast | Амурская область | 28 | 08:00:00 -32 | Arkhangelsk Oblast | Архангельская область | 29 | 02:00:00 -33 | Astrakhan Oblast | Астраханская область | 30 | 03:00:00 -34 | Belgorod Oblast | Белгородская область | 31 | 02:00:00 -35 | Bryansk Oblast | Брянская область | 32 | 02:00:00 -36 | Vladimir Oblast | Владимирская область | 33 | 02:00:00 -37 | Volgograd Oblast | Волгоградская область | 34 | 02:00:00 -38 | Vologda Oblast | Вологодская область | 35 | 02:00:00 -39 | Voronezh Oblast | Воронежская область | 36 | 02:00:00 -80 | Jewish Autonomous Oblast | Еврейская автономная область | 79 | 09:00:00 -23 | Zabaykalsky Krai | Забайкальский край | 75 | 08:00:00 -40 | Ivanovo Oblast | Ивановская область | 37 | 02:00:00 -41 | Irkutsk Oblast | Иркутская область | 38 | 07:00:00 -6 | Kabardino-Balkar Republic | Кабардино-Балкарская Республика | 07 | 02:00:00 -42 | Kaliningrad Oblast | Калининградская область | 39 | 01:00:00 -43 | Kaluga Oblast | Калужская область | 40 | 02:00:00 -24 | Kamchatka Krai | Камчатский край | 41 | 11:00:00 -8 | Karachay-Cherkess Republic | Карачаево-Черкесская Республика | 09 | 02:00:00 -44 | Kemerovo Oblast | Кемеровская область | 42 | 06:00:00 -45 | Kirov Oblast | Кировская область | 43 | 02:00:00 -46 | Kostroma Oblast | Костромская область | 44 | 02:00:00 -25 | Krasnodar Krai | Краснодарский край | 23 | 02:00:00 -26 | Krasnoyarsk Krai | Красноярский край | 24 | 06:00:00 -47 | Kurgan Oblast | Курганская область | 45 | 04:00:00 -48 | Kursk Oblast | Курская область | 46 | 02:00:00 -49 | Leningrad Oblast | Ленинградская область | 47 | 02:00:00 -50 | Lipetsk Oblast | Липецкая область | 48 | 02:00:00 -51 | Magadan Oblast | Магаданская область | 49 | 10:00:00 -77 | Moscow | Москва | 77 | 02:00:00 -52 | Moscow Oblast | Московская область | 50 | 02:00:00 -53 | Murmansk Oblast | Мурманская область | 51 | 02:00:00 -81 | Nenets Autonomous Okrug | Ненецкий автономный округ | 83 | 02:00:00 -54 | Nizhny Novgorod Oblast | Нижегородская область | 52 | 02:00:00 -55 | Novgorod Oblast | Новгородская область | 53 | 02:00:00 -56 | Novosibirsk Oblast | Новосибирская область | 54 | 06:00:00 -57 | Omsk Oblast | Омская область | 55 | 05:00:00 -58 | Orenburg Oblast | Оренбургская область | 56 | 04:00:00 -59 | Oryol Oblast | Орловская область | 57 | 02:00:00 -60 | Penza Oblast | Пензенская область | 58 | 02:00:00 -27 | Perm Krai | Пермский край | 59 | 04:00:00 -28 | Primorsky Krai | Приморский край | 25 | 09:00:00 -61 | Pskov Oblast | Псковская область | 60 | 02:00:00 -87 | Republic of Adygea | Республика Адыгея | 01 | 02:00:00 -1 | Altai Republic | Республика Алтай | 04 | 06:00:00 -2 | Republic of Bashkortostan | Республика Башкортостан | 02 | 04:00:00 -3 | Republic of Buryatia | Республика Бурятия | 03 | 07:00:00 -4 | Republic of Dagestan | Республика Дагестан | 05 | 02:00:00 -5 | Republic of Ingushetia | Республика Ингушетия | 06 | 02:00:00 -7 | Republic of Kalmykia | Республика Калмыкия | 08 | 02:00:00 -9 | Republic of Karelia | Республика Карелия | 10 | 02:00:00 -10 | Komi Republic | Республика Коми | 11 | 02:00:00 -11 | Republic of Crimea | Республика Крым | 91 | 02:00:00 -12 | Mari El Republic | Республика Марий Эл | 12 | 02:00:00 -13 | Republic of Mordovia | Республика Мордовия | 13 | 02:00:00 -14 | Republic of Sakha (Yakutia) | Республика Саха (Якутия) | 14 | 08:00:00 -15 | Republic of North Ossetia – Alania | Республика Северная Осетия — Алания | 15 | 02:00:00 -16 | Republic of Tatarstan | Республика Татарстан | 16 | 02:00:00 -17 | Tyva Republic | Республика Тыва | 17 | 06:00:00 -19 | Republic of Khakassia | Республика Хакасия | 19 | 06:00:00 -62 | Rostov Oblast | Ростовская область | 61 | 02:00:00 -63 | Ryazan Oblast | Рязанская область | 62 | 02:00:00 -64 | Samara Oblast | Самарская область | 63 | 03:00:00 -78 | Saint Petersburg | Санкт-Петербург | 78 | 02:00:00 -65 | Saratov Oblast | Саратовская область | 64 | 03:00:00 -66 | Sakhalin Oblast | Сахалинская область | 65 | 10:00:00 -67 | Sverdlovsk Oblast | Свердловская область | 66 | 04:00:00 -79 | Sevastopol | Севастополь | 92 | 02:00:00 -68 | Smolensk Oblast | Смоленская область | 67 | 02:00:00 -29 | Stavropol Krai | Ставропольский край | 26 | 02:00:00 -69 | Tambov Oblast | Тамбовская область | 68 | 02:00:00 -70 | Tver Oblast | Тверская область | 69 | 02:00:00 -71 | Tomsk Oblast | Томская область | 70 | 06:00:00 -72 | Tula Oblast | Тульская область | 71 | 02:00:00 -73 | Tyumen Oblast | Тюменская область | 72 | 04:00:00 -18 | Udmurt Republic | Удмуртская Республика | 18 | 03:00:00 -74 | Ulyanovsk Oblast | Ульяновская область | 73 | 03:00:00 -30 | Khabarovsk Krai | Хабаровский край | 27 | 09:00:00 -82 | Khanty-Mansi Autonomous Okrug – Yugra | Ханты-Мансийский автономный округ — Югра | 86 | 04:00:00 -75 | Chelyabinsk Oblast | Челябинская область | 74 | 04:00:00 -20 | Chechen Republic | Чеченская Республика | 20 | 02:00:00 -21 | Chuvash Republic | Чувашская Республика | 21 | 02:00:00 -83 | Chukotka Autonomous Okrug | Чукотский автономный округ | 87 | 11:00:00 -84 | Yamalo-Nenets Autonomous Okrug | Ямало-Ненецкий автономный округ | 89 | 04:00:00 -76 | Yaroslavl Oblast | Ярославская область | 76 | 02:00:00 +22 | Altai Krai | Алтайский край | 22 | 06:00:00 | Барнаул +31 | Amur Oblast | Амурская область | 28 | 08:00:00 | Благовещенск +32 | Arkhangelsk Oblast | Архангельская область | 29 | 02:00:00 | Архангельск +33 | Astrakhan Oblast | Астраханская область | 30 | 03:00:00 | Астрахань +34 | Belgorod Oblast | Белгородская область | 31 | 02:00:00 | Белгород +35 | Bryansk Oblast | Брянская область | 32 | 02:00:00 | Брянск +36 | Vladimir Oblast | Владимирская область | 33 | 02:00:00 | Владимир +37 | Volgograd Oblast | Волгоградская область | 34 | 02:00:00 | Волгоград +38 | Vologda Oblast | Вологодская область | 35 | 02:00:00 | Вологда +39 | Voronezh Oblast | Воронежская область | 36 | 02:00:00 | Воронеж +80 | Jewish Autonomous Oblast | Еврейская автономная область | 79 | 09:00:00 | Биробиджан +23 | Zabaykalsky Krai | Забайкальский край | 75 | 08:00:00 | Чита +40 | Ivanovo Oblast | Ивановская область | 37 | 02:00:00 | Иваново +41 | Irkutsk Oblast | Иркутская область | 38 | 07:00:00 | Иркутск +6 | Kabardino-Balkar Republic | Кабардино-Балкарская Республика | 07 | 02:00:00 | Нальчик +42 | Kaliningrad Oblast | Калининградская область | 39 | 01:00:00 | Калининград +43 | Kaluga Oblast | Калужская область | 40 | 02:00:00 | Калуга +24 | Kamchatka Krai | Камчатский край | 41 | 11:00:00 | Петропавловск-Камчатский +8 | Karachay-Cherkess Republic | Карачаево-Черкесская Республика | 09 | 02:00:00 | Черкесск +44 | Kemerovo Oblast | Кемеровская область | 42 | 06:00:00 | Кемерово +45 | Kirov Oblast | Кировская область | 43 | 02:00:00 | Киров +46 | Kostroma Oblast | Костромская область | 44 | 02:00:00 | Кострома +25 | Krasnodar Krai | Краснодарский край | 23 | 02:00:00 | Красноярск +26 | Krasnoyarsk Krai | Красноярский край | 24 | 06:00:00 | Краснодар +47 | Kurgan Oblast | Курганская область | 45 | 04:00:00 | Курган +48 | Kursk Oblast | Курская область | 46 | 02:00:00 | Курск +49 | Leningrad Oblast | Ленинградская область | 47 | 02:00:00 | Санкт-Петербург +50 | Lipetsk Oblast | Липецкая область | 48 | 02:00:00 | Липецк +51 | Magadan Oblast | Магаданская область | 49 | 10:00:00 | Магадан +77 | Moscow | Москва | 77 | 02:00:00 | Москва +52 | Moscow Oblast | Московская область | 50 | 02:00:00 | Москва +53 | Murmansk Oblast | Мурманская область | 51 | 02:00:00 | Мурманск +81 | Nenets Autonomous Okrug | Ненецкий автономный округ | 83 | 02:00:00 | Нарьян-Мар +54 | Nizhny Novgorod Oblast | Нижегородская область | 52 | 02:00:00 | Нижний Новгород +55 | Novgorod Oblast | Новгородская область | 53 | 02:00:00 | Великий Новгород +56 | Novosibirsk Oblast | Новосибирская область | 54 | 06:00:00 | Новосибирск +57 | Omsk Oblast | Омская область | 55 | 05:00:00 | Омск +58 | Orenburg Oblast | Оренбургская область | 56 | 04:00:00 | Оренбург +59 | Oryol Oblast | Орловская область | 57 | 02:00:00 | Орёл +60 | Penza Oblast | Пензенская область | 58 | 02:00:00 | Пенза +27 | Perm Krai | Пермский край | 59 | 04:00:00 | Пермь +28 | Primorsky Krai | Приморский край | 25 | 09:00:00 | Владивосток +61 | Pskov Oblast | Псковская область | 60 | 02:00:00 | Псков +87 | Republic of Adygea | Республика Адыгея | 01 | 02:00:00 | Майкоп +1 | Altai Republic | Республика Алтай | 04 | 06:00:00 | Горно-Алтайск +2 | Republic of Bashkortostan | Республика Башкортостан | 02 | 04:00:00 | Уфа +3 | Republic of Buryatia | Республика Бурятия | 03 | 07:00:00 | Улан-Удэ +4 | Republic of Dagestan | Республика Дагестан | 05 | 02:00:00 | Махачкала +5 | Republic of Ingushetia | Республика Ингушетия | 06 | 02:00:00 | Магас +7 | Republic of Kalmykia | Республика Калмыкия | 08 | 02:00:00 | Элиста +9 | Republic of Karelia | Республика Карелия | 10 | 02:00:00 | Петрозаводск +10 | Komi Republic | Республика Коми | 11 | 02:00:00 | Сыктывкар +11 | Republic of Crimea | Республика Крым | 91 | 02:00:00 | Симферополь +12 | Mari El Republic | Республика Марий Эл | 12 | 02:00:00 | Йошкар-Ола +13 | Republic of Mordovia | Республика Мордовия | 13 | 02:00:00 | Саранск +14 | Republic of Sakha (Yakutia) | Республика Саха (Якутия) | 14 | 08:00:00 | Якутск +15 | Republic of North Ossetia – Alania | Республика Северная Осетия — Алания | 15 | 02:00:00 | Владикавказ +16 | Republic of Tatarstan | Республика Татарстан | 16 | 02:00:00 | Казань +17 | Tyva Republic | Республика Тыва | 17 | 06:00:00 | Кызыл +19 | Republic of Khakassia | Республика Хакасия | 19 | 06:00:00 | Абакан +62 | Rostov Oblast | Ростовская область | 61 | 02:00:00 | Ростов-на-Дону +63 | Ryazan Oblast | Рязанская область | 62 | 02:00:00 | Рязань +64 | Samara Oblast | Самарская область | 63 | 03:00:00 | Самара +78 | Saint Petersburg | Санкт-Петербург | 78 | 02:00:00 | Санкт-Петербург +65 | Saratov Oblast | Саратовская область | 64 | 03:00:00 | Саратов +66 | Sakhalin Oblast | Сахалинская область | 65 | 10:00:00 | Южно-Сахалинск +67 | Sverdlovsk Oblast | Свердловская область | 66 | 04:00:00 | Екатеринбург +79 | Sevastopol | Севастополь | 92 | 02:00:00 | Севастополь +68 | Smolensk Oblast | Смоленская область | 67 | 02:00:00 | Смоленск +29 | Stavropol Krai | Ставропольский край | 26 | 02:00:00 | Ставрополь +69 | Tambov Oblast | Тамбовская область | 68 | 02:00:00 | Тамбов +70 | Tver Oblast | Тверская область | 69 | 02:00:00 | Тверь +71 | Tomsk Oblast | Томская область | 70 | 06:00:00 | Томск +72 | Tula Oblast | Тульская область | 71 | 02:00:00 | Тула +73 | Tyumen Oblast | Тюменская область | 72 | 04:00:00 | Тюмень +18 | Udmurt Republic | Удмуртская Республика | 18 | 03:00:00 | Ижевск +74 | Ulyanovsk Oblast | Ульяновская область | 73 | 03:00:00 | Ульяновск +30 | Khabarovsk Krai | Хабаровский край | 27 | 09:00:00 | Хабаровск +82 | Khanty-Mansi Autonomous Okrug – Yugra | Ханты-Мансийский автономный округ — Югра | 86 | 04:00:00 | Ханты-Мансийск +75 | Chelyabinsk Oblast | Челябинская область | 74 | 04:00:00 | Челябинск +20 | Chechen Republic | Чеченская Республика | 20 | 02:00:00 | Грозный +21 | Chuvash Republic | Чувашская Республика | 21 | 02:00:00 | Чебоксары +83 | Chukotka Autonomous Okrug | Чукотский автономный округ | 87 | 11:00:00 | Анадырь +84 | Yamalo-Nenets Autonomous Okrug | Ямало-Ненецкий автономный округ | 89 | 04:00:00 | Салехард +76 | Yaroslavl Oblast | Ярославская область | 76 | 02:00:00 | Ярославль diff --git a/config/locales/activerecord/en.yml b/config/locales/activerecord/en.yml index 642bffc..dbc6c46 100644 --- a/config/locales/activerecord/en.yml +++ b/config/locales/activerecord/en.yml @@ -34,6 +34,7 @@ en: english_name: Name native_name: Name display_name: Name + centre: Administrative centre number: Number timezone: Time zone passport: diff --git a/config/locales/activerecord/ru.yml b/config/locales/activerecord/ru.yml index 2b52433..0116dc4 100644 --- a/config/locales/activerecord/ru.yml +++ b/config/locales/activerecord/ru.yml @@ -34,6 +34,7 @@ ru: english_name: Название native_name: Название display_name: Название + centre: Административный центр number: Номер timezone: Часовой пояс passport: diff --git a/db/migrate/20181129203927_initial_migration.rb b/db/migrate/20181129203927_initial_migration.rb index 7623c73..5769257 100644 --- a/db/migrate/20181129203927_initial_migration.rb +++ b/db/migrate/20181129203927_initial_migration.rb @@ -17,6 +17,7 @@ class InitialMigration < ActiveRecord::Migration[6.0] t.string :english_name, null: false, index: { unique: true } t.string :native_name, null: false, index: { unique: true } + t.string :centre, null: false, index: false t.integer :number, null: false, index: { unique: true } t.interval :timezone, null: false, index: false @@ -226,6 +227,14 @@ class InitialMigration < ActiveRecord::Migration[6.0] native_name !~ '[[:space:]]{1,}$' SQL + constraint :federal_subjects, :centre, <<~SQL + length(centre) BETWEEN 1 AND 255 + AND + centre !~ '^[[:space:]]{1,}' + AND + centre !~ '[[:space:]]{1,}$' + SQL + constraint :federal_subjects, :number, <<~SQL number > 0 SQL diff --git a/db/seeds.rb b/db/seeds.rb index 32eaa43..6e781e7 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -4,19 +4,23 @@ require 'csv' federal_subjects_filename = Rails.root.join 'config', 'federal_subjects.csv' -CSV.foreach federal_subjects_filename, - col_sep: '|' do |(id, english_name, native_name, number, timezone)| +CSV.foreach( + federal_subjects_filename, + col_sep: '|', +) do |(id, english_name, native_name, number, timezone, centre)| id = Integer(id.strip) english_name.strip! native_name.strip! number = Integer(number.strip.sub(/\A0*/, '')) timezone.strip! + centre.strip! FederalSubject.where(id: id).first_or_create! do |new_federal_subject| new_federal_subject.english_name = english_name new_federal_subject.native_name = native_name new_federal_subject.number = number new_federal_subject.timezone = timezone + new_federal_subject.centre = centre end end diff --git a/db/structure.sql b/db/structure.sql index 8fa666e..bf7b540 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -252,8 +252,10 @@ CREATE TABLE public.federal_subjects ( updated_at timestamp(6) without time zone NOT NULL, english_name character varying NOT NULL, native_name character varying NOT NULL, + centre character varying NOT NULL, number integer NOT NULL, timezone interval NOT NULL, + CONSTRAINT centre CHECK ((((length((centre)::text) >= 1) AND (length((centre)::text) <= 255)) AND ((centre)::text !~ '^[[:space:]]{1,}'::text) AND ((centre)::text !~ '[[:space:]]{1,}$'::text))), CONSTRAINT english_name CHECK ((((length((english_name)::text) >= 1) AND (length((english_name)::text) <= 255)) AND ((english_name)::text !~ '^[[:space:]]{1,}'::text) AND ((english_name)::text !~ '[[:space:]]{1,}$'::text))), CONSTRAINT native_name CHECK ((((length((native_name)::text) >= 1) AND (length((native_name)::text) <= 255)) AND ((native_name)::text !~ '^[[:space:]]{1,}'::text) AND ((native_name)::text !~ '[[:space:]]{1,}$'::text))), CONSTRAINT number CHECK ((number > 0)) diff --git a/factories/federal_subjects.rb b/factories/federal_subjects.rb index fd530bb..3cb8858 100644 --- a/factories/federal_subjects.rb +++ b/factories/federal_subjects.rb @@ -17,6 +17,8 @@ FactoryBot.define do native_name { english_name } + centre { Faker::Address.city } + timezone { "#{[nil, :-].sample}#{rand(0..11).to_s.rjust(2, '0')}:00:00" } end end diff --git a/spec/models/federal_subject_spec.rb b/spec/models/federal_subject_spec.rb index e742138..52574b5 100644 --- a/spec/models/federal_subject_spec.rb +++ b/spec/models/federal_subject_spec.rb @@ -49,6 +49,22 @@ RSpec.describe FederalSubject do it { is_expected.not_to allow_value 'Foo ' } end + describe '#centre' do + def allow_value(*) + super.for :centre + end + + it { is_expected.to validate_presence_of :centre } + + it do + is_expected.to \ + validate_length_of(:centre).is_at_least(1).is_at_most(255) + end + + it { is_expected.not_to allow_value ' Foo' } + it { is_expected.not_to allow_value 'Foo ' } + end + describe '#number' do it { is_expected.to validate_presence_of :number } it { is_expected.to validate_uniqueness_of :number }