okei 0.0.2 → 1.0.0.pre.rc

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -0
  3. data/README.rdoc +6 -7
  4. data/Rakefile +4 -13
  5. data/app/controllers/okei/api/v1/responder.rb +15 -2
  6. data/app/controllers/okei/api/v1/units_controller.rb +4 -0
  7. data/app/models/okei/unit.rb +32 -5
  8. data/app/use_cases/okei/find_unit.rb +2 -12
  9. data/app/use_cases/okei/get_unit.rb +1 -1
  10. data/app/views/okei/api/v1/units/_unit.json.jbuilder +2 -4
  11. data/db/migrate/{20141004212500_create_okei_units.rb → 20141019072900_create_okei_units.rb} +0 -2
  12. data/db/migrate/20141019072901_populate_okei_units.rb +60 -0
  13. data/db/migrate/20141019072902_populate_okei_correctors.rb +50 -0
  14. data/db/seeds/phrases.json +199 -0
  15. data/db/seeds/prefixes.json +12 -0
  16. data/db/seeds/words.json +10 -216
  17. data/lib/okei.rb +2 -0
  18. data/lib/okei/version.rb +4 -2
  19. data/lib/tasks/okei_tasks.rake +47 -28
  20. data/spec/dummy/db/migrate/20141018085223_create_corrector_bases.corrector.rb +14 -0
  21. data/spec/dummy/db/migrate/20141018085226_create_uuids_uuids.uuids.rb +10 -0
  22. data/spec/dummy/db/schema.rb +22 -12
  23. data/spec/dummy/db/test.sqlite3 +0 -0
  24. data/spec/dummy/log/development.log +20296 -0
  25. data/spec/dummy/log/test.log +183148 -0
  26. data/spec/examples/json_schemas/unit.json +7 -2
  27. data/spec/factories/units.rb +0 -1
  28. data/spec/models/okei/unit_spec.rb +7 -26
  29. data/spec/requests/okei/api/v1/find_unit_spec.rb +8 -11
  30. data/spec/requests/okei/api/v1/get_unit_spec.rb +2 -3
  31. data/spec/requests/okei/api/v1/get_units_spec.rb +2 -2
  32. data/spec/support/initializers/factory_girl_rails.rb +4 -0
  33. data/spec/use_cases/okei/find_unit_spec.rb +7 -10
  34. metadata +43 -21
  35. data/app/models/okei/line.rb +0 -63
  36. data/app/models/okei/word.rb +0 -26
  37. data/app/models/okei/words.rb +0 -40
  38. data/db/migrate/20141004212501_populate_okei_units.rb +0 -14
  39. data/db/migrate/20141004212502_create_okei_words.rb +0 -11
  40. data/db/migrate/20141004212503_populate_okei_words.rb +0 -15
  41. data/spec/factories/words.rb +0 -7
  42. data/spec/models/okei/line_spec.rb +0 -61
  43. data/spec/models/okei/word_spec.rb +0 -75
  44. data/spec/models/okei/words_spec.rb +0 -64
  45. data/spec/support/initializers/factory_girl.rb +0 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ff65991eed851bbc0d94adecc0f7f69c42926775
4
- data.tar.gz: 618886df241a9e412715b0c74a5a95fb90b400b3
3
+ metadata.gz: ddd375964fa07cfe8f6450efd1aa2220c7e1bb01
4
+ data.tar.gz: 5444557de9af279b0e68abce30fb2d5caa287f76
5
5
  SHA512:
6
- metadata.gz: 1fe760dccd23afc881a70df294650ec9853b7067574e1dbe3257b6944fcb825f159e8479183084f6e3565b59309024ba876b78740d84ef771d556f8adf1ebc77
7
- data.tar.gz: c5a7197958e49539f73f941564a4e46b9fc80822d0f4b61c511cb308dbf2e94ec1876e4e0e4640ae7b4e4af982dfd97840b4a66c3d2c073a9464945b054a89df
6
+ metadata.gz: 9fa4897fc4012bea96202bcf27035135708d9665628ad9d137dfe4db7660e63c537aa6ef00ed2a7f88f8b0dcbfc1990cef8715302b30dd34f1678019b5aad4fa
7
+ data.tar.gz: 4a15da1279d9741fd99cf34fbab901cbf59ac744a16221d67d7b032c9da503159b40a1fabe4a05ab6e45a9d22812f6079f889dd4276a2647c1202feb9943a77c
@@ -56,6 +56,10 @@ Style/StringLiterals:
56
56
  Style/SingleSpaceBeforeFirstArg:
57
57
  Enabled: false
58
58
 
59
+ Style/TrailingBlankLines:
60
+ Exclude:
61
+ - 'app/views/**/*'
62
+
59
63
  Style/TrivialAccessors:
60
64
  Exclude:
61
65
  - 'spec/**/*'
@@ -1,5 +1,6 @@
1
1
  = Единицы измерения
2
2
 
3
+ {<img src="http://img.shields.io/gem/v/okei.svg?style=flat" alt="Gem Version" />}[https://rubygems.org/gems/okei]
3
4
  {<img src="http://img.shields.io/travis/nepalez/okei.svg?style=flat" alt="Bild Status" />}[https://travis-ci.org/nepalez/okei]
4
5
  {<img src="http://img.shields.io/codeclimate/github/nepalez/okei.svg?style=flat" alt="Code Metrics" />}[https://codeclimate.com/github/nepalez/okei]
5
6
  {<img src="http://img.shields.io/gemnasium/nepalez/okei.svg?style=flat" alt="Dependency Status" />}[https://gemnasium.com/nepalez/okei]
@@ -62,15 +63,13 @@ API содержит следующие маршруты для доступа
62
63
 
63
64
  После установки выполните в командной строке:
64
65
 
65
- $ rake okei:install
66
+ === При включении модуля в модуль Rails
67
+
68
+ $ rake app:okei:install
66
69
 
67
- При этом в файл <tt>/config/routes.rb</tt> проекта будет добавлена строка,
68
- добавляющая адреса RESTful public API модуля. По умолчанию адреса добавляются
69
- в поле имен <tt>/okei</tt>, т.ч. API становится доступен по адресам:
70
+ === При включении модуля в приложение Rails
70
71
 
71
- * <tt>GET {адрес вашего проекта}/okei/api/v1/units</tt>
72
- * <tt>GET {адрес вашего проекта}/okei/api/v1/units/{uuid}</tt>
73
- * <tt>GET {адрес вашего проекта}/okei/api/v1/units/search</tt>
72
+ $ rake okei:install
74
73
 
75
74
  == Contributing (en)
76
75
 
data/Rakefile CHANGED
@@ -30,23 +30,14 @@ require "rspec/core/rake_task"
30
30
 
31
31
  RSpec::Core::RakeTask.new :spec
32
32
 
33
- task :migrate do
34
- sh "bundle exec rake db:migrate RAILS_ENV=test"
35
- end
36
-
37
- task default: [:migrate] do
38
- sh "mkdir spec/dummy/tmp" do |*|
39
- nunitSuccessFlag = false
40
- end
41
- sh "mkdir spec/dummy/tmp/cache" do |*|
42
- nunitSuccessFlag = false
43
- end
44
- sh "bundle exec rspec spec"
33
+ task default: %w(app:okei:test:prepare) do
34
+ system "bundle exec rspec spec"
45
35
  end
46
36
 
47
37
  task :full do
48
38
  sh "coveralls report"
49
39
  sh "rubocop"
50
40
  sh "metric_fu"
51
- sh "inch"
41
+ sh "inch --pedantic"
42
+ sh "rails_best_practices"
52
43
  end
@@ -7,19 +7,32 @@ module Okei
7
7
  # Responds to client depending on use case results
8
8
  class Responder < ::ApplicationController
9
9
 
10
- # Renders list of units of measure.
10
+ # Renders a list of units of measure.
11
+ #
12
+ # Params:
13
+ # +units+:: a list of units found by use case
14
+ #
11
15
  def on_success(units)
12
16
  @units = units
13
17
  render "index"
14
18
  end
15
19
 
16
20
  # Renders a unit of measure.
21
+ #
22
+ # Params:
23
+ # +unit+:: a unit of measure to be rendered and sent to a client.
24
+ #
17
25
  def on_found(unit)
18
26
  @unit = unit
19
27
  render "show"
20
28
  end
21
29
 
22
- # Renders an error message.
30
+ # Renders an error messages.
31
+ #
32
+ # Params:
33
+ # +messages+:: a list of messages (<tt>Hexx::Message</tt> objects)
34
+ # to be shown to a client.
35
+ #
23
36
  def on_not_found(messages)
24
37
  @messages = messages
25
38
  render "errors", status: 404
@@ -1,7 +1,11 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Okei
4
+
5
+ # Controllers for public JSON API routes.
4
6
  module Api
7
+
8
+ # API v.1 controllers.
5
9
  module V1
6
10
 
7
11
  # Controller for getting units
@@ -2,16 +2,43 @@
2
2
 
3
3
  module Okei
4
4
 
5
- # Stores and validates units of measure
5
+ # Stores and validates units of measure.
6
+ #
7
+ # Attributes:
8
+ # +uuids+:: list of Units::Uuid objects assigned (referred to) the unit.
9
+ # +code+:: literal cyrillic code ("КМ/Ч").
10
+ # +name+:: name of the unit ("Километры в час").
11
+ # +num+:: numeric code of the unit following the OKEI ("007").
12
+ # +int_code+:: a literal international code of the unit ("KMH").
13
+ # +base+:: literal cyrillic code of the basic unit of measure ("М/С").
14
+ # +factor+:: float number of basic units in a current unit (0.28).
15
+ # +measure+:: the name of measurement ("СКОРОСТЬ") used for filtering units.
16
+ #
17
+ # Methods:
18
+ # <tt>#uuid</tt>:: returns value of the first +uuids+ assigned to the unit.
19
+ # <tt>.by_uuid(value)</tt>:: selects units by a given UUID.
20
+ #
21
+ # The first UUID can be set manually if necessary (when db populated from the
22
+ # outer list). Otherwise it will be assigned by default on the unit creation.
23
+ #
24
+ # @example
25
+ # unit = Unit.new(
26
+ # name: "Километры в час", code: "КМ/Ч", num: "007", int_code: "KMH",
27
+ # base: "М/С", factor: 0.28, measure: "СКОРОСТЬ"
28
+ # )
29
+ # # this can be skipped:
30
+ # unit.uuids.new value: "9ac7e74a-d51a-424c-8fcd-71b0b55f6658"
31
+ #
6
32
  class Unit < ActiveRecord::Base
33
+ include Uuids::Base
7
34
 
8
- UUID_FORMAT = /\A[\d|a-f]{8}-([\d|a-f]{4}-){3}[\d|a-f]{12}\z/
35
+ # Format of OKEI numeric codes (three digits).
9
36
  NUM_FORMAT = /\A\d{3}\z/
10
37
 
11
- validates :uuid, :code, :name, :base, :factor, :measure, presence: true
12
- validates :uuid, :code, :name, uniqueness: true, allow_nil: true
38
+ has_uuids
39
+ validates :code, :name, :base, :factor, :measure, presence: true
40
+ validates :code, :name, uniqueness: true, allow_nil: true
13
41
  validates :factor, allow_nil: true, numericality: { greater_than: 0.0 }
14
42
  validates :num, allow_nil: true, format: { with: NUM_FORMAT }
15
- validates :uuid, allow_nil: true, format: { with: UUID_FORMAT }
16
43
  end
17
44
  end
@@ -38,22 +38,12 @@ module Okei
38
38
  @text ||= params["text"]
39
39
  end
40
40
 
41
- def line
42
- @line ||= Line.new text
43
- end
44
-
45
- def words
46
- @words ||= Words.new(line).map { |word| Word.translate word }
47
- end
48
-
49
41
  def code
50
- @code ||= Word.translate words.to_s
42
+ @code ||= Corrector::Parse.new text, scope: "okei"
51
43
  end
52
44
 
53
45
  def unit
54
- @unit ||= Rails.cache.fetch(line) do
55
- Unit.find_by_code(code)
56
- end
46
+ @unit ||= Unit.where(code: code).first
57
47
  end
58
48
 
59
49
  def unit_found?
@@ -38,7 +38,7 @@ module Okei
38
38
  end
39
39
 
40
40
  def unit
41
- @unit ||= Unit.find_by_uuid(uuid)
41
+ @unit ||= Unit.by_uuid(uuid).first
42
42
  end
43
43
 
44
44
  def unit_found?
@@ -1,6 +1,4 @@
1
1
  json.cache! [:v1, :unit, unit.id] do
2
- json.extract!(
3
- unit,
4
- :uuid, :name, :code, :num, :int_code, :base, :factor, :measure
5
- )
2
+ json.uuids unit.uuids.map(&:value)
3
+ json.extract! unit, :name, :code, :num, :int_code, :base, :factor, :measure
6
4
  end
@@ -2,7 +2,6 @@
2
2
  class CreateOkeiUnits < ActiveRecord::Migration
3
3
  def change
4
4
  create_table :okei_units do |t|
5
- t.string :uuid, null: false, limit: 36
6
5
  t.string :name, null: false
7
6
  t.string :code, null: false
8
7
  t.string :num, limit: 3
@@ -12,7 +11,6 @@ class CreateOkeiUnits < ActiveRecord::Migration
12
11
  t.float :factor, null: false
13
12
  end
14
13
 
15
- add_index :okei_units, :uuid, unique: true
16
14
  add_index :okei_units, :code, unique: true
17
15
  add_index :okei_units, :base
18
16
  add_index :okei_units, :measure
@@ -0,0 +1,60 @@
1
+ # Populates db with units of measure.
2
+ class PopulateOkeiUnits < ActiveRecord::Migration
3
+
4
+ # reloads units and their uuids from db/seed/units.json
5
+ def up
6
+ return if Rails.env.test?
7
+ down
8
+ populate_units_from seed
9
+ end
10
+
11
+ # deletes all units with their uuids.
12
+ def down
13
+ return if Rails.env.test?
14
+ clear_uuids
15
+ clear_units
16
+ end
17
+
18
+ private
19
+
20
+ # Parses JSON from db/seed/units.json
21
+ def seed
22
+ @seed ||= begin
23
+ root = File.dirname File.dirname(Okei::Engine.called_from)
24
+ file = File.join(root, "db", "seeds", "units.json")
25
+ JSON.parse(File.read file)
26
+ end
27
+ end
28
+
29
+ # Deletes units' uuids.
30
+ def clear_uuids
31
+ list = Uuids::Uuid.where(record_type: "Okei::Unit")
32
+ say_with_time "Removing #{ list.count } uuids" do
33
+ list.delete_all
34
+ left = list.count
35
+ fail "#{ left } uuids left undeleted" if left > 0
36
+ end
37
+ end
38
+
39
+ # Deletes units objects.
40
+ def clear_units
41
+ list = Okei::Unit.all
42
+ say_with_time "Removing #{ list.count } units" do
43
+ list.delete_all
44
+ left = list.count
45
+ fail "#{ left } units left undeleted" if left > 0
46
+ end
47
+ end
48
+
49
+ # Populates units and their uuids from given JSON
50
+ def populate_units_from(json)
51
+ say_with_time "Adding #{ json.count } units" do
52
+ json.each do |item|
53
+ unit = Okei::Unit.new
54
+ unit.uuids.new value: item.delete("uuid")
55
+ unit.attributes = item
56
+ unit.save!
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,50 @@
1
+ # Populates db with units of measure.
2
+ class PopulateOkeiCorrectors < ActiveRecord::Migration
3
+
4
+ # reloads units and their uuids from db/seed/units.json
5
+ def up
6
+ return if Rails.env.test?
7
+ down
8
+ bases.each { |name, klass| populate name, klass }
9
+ end
10
+
11
+ # deletes all units with their uuids.
12
+ def down
13
+ return if Rails.env.test?
14
+ bases.each { |name, klass| clear name, klass }
15
+ end
16
+
17
+ private
18
+
19
+ def clear(name, klass)
20
+ list = klass.by_scope("okei")
21
+ say_with_time "Removing #{ list.count } #{ name }" do
22
+ list.delete_all
23
+ left = list.count
24
+ fail "#{ left } #{ name } left undeleted" if left > 0
25
+ end
26
+ end
27
+
28
+ def populate(name, klass)
29
+ list = JSON.parse(File.read File.join(seeds, "#{ name }.json"))
30
+ say_with_time "Adding #{ list.count } #{ name }" do
31
+ list.each { |from, to| klass.create! scope: "okei", from: from, to: to }
32
+ end
33
+ end
34
+
35
+ def bases
36
+ @bases ||= {
37
+ words: Corrector::Word,
38
+ phrases: Corrector::Phrase,
39
+ prefixes: Corrector::Prefix
40
+ }
41
+ end
42
+
43
+ # Returns json seeds folder
44
+ def seeds
45
+ @seeds ||= begin
46
+ root = File.dirname File.dirname(Okei::Engine.called_from)
47
+ File.join(root, "db", "seeds")
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,199 @@
1
+ {
2
+ "АВТО ДН МЕСТ": "АВТ МЕСТ ДН",
3
+ "АВТО ДН Т": "АВТ Т ДН",
4
+ "В А Р": "В-А Р",
5
+ "В А": "В-А",
6
+ "ВТ ЧАС": "ВТ-Ч",
7
+ "Г НА КВТ ЧАС": "Г/КВТ-Ч",
8
+ "Г/КВТ ЧАС": "Г/КВТ-Ч",
9
+ "ГИГАВТ ЧАС": "ГИГАВТ-Ч",
10
+ "ГИГАКАЛ В ЧАС": "ГИГАКАЛ/Ч",
11
+ "ГИГАКАЛ/ЧАС": "ГИГАКАЛ/Ч",
12
+ "ДМ КВ": "ДМ2",
13
+ "ДМ КУБ": "ДМ3",
14
+ "ДОМ ХОЗ": "ДОМХОЗ",
15
+ "ДЮЙМ КВ": "ДЮЙМ2",
16
+ "ДЮЙМ КУБ": "ДЮЙМ3",
17
+ "КАЛ В ЧАС": "КАЛ/Ч",
18
+ "КАЛ/ЧАС": "КАЛ/Ч",
19
+ "КВ А Р": "КВ-А Р",
20
+ "КВ А": "КВ-А",
21
+ "КВ А": "КВ-А",
22
+ "КВ ДМ": "ДМ2",
23
+ "КВ ДЮЙМ": "ДЮЙМ2",
24
+ "КВ КМ": "КМ2",
25
+ "КВ М ЖИЛ ПЛ": "М2 ЖИЛ ПЛ",
26
+ "КВ М ОБЩ ПЛ": "М2 ОБЩ ПЛ",
27
+ "КВ М УЧ ЛАБ ЗДАН": "М2 УЧ ЛАБ ЗДАН",
28
+ "КВ М": "М2",
29
+ "КВ МИЛЬ": "МИЛЬ2",
30
+ "КВ ММ": "ММ2",
31
+ "КВ ФУТ": "ФУТ2",
32
+ "КВТ ЧАС": "КВТ-Ч",
33
+ "КГ В С": "КГ/С",
34
+ "КГ НА ГИГАКАЛ": "КГ/ГИГАКАЛ",
35
+ "КГ НА КВ СМ": "КГ/СМ2",
36
+ "КГ НА КУБ М": "КГ/М3",
37
+ "КГ НА М КУБ": "КГ/М3",
38
+ "КГ НА М3": "КГ/М3",
39
+ "КГ НА СМ КВ": "КГ/СМ2",
40
+ "КГ НА СМ2": "КГ/СМ2",
41
+ "КГ/КВ СМ": "КГ/СМ2",
42
+ "КГ/КУБ М": "КГ/М3",
43
+ "КГ/М КУБ": "КГ/М3",
44
+ "КГ/СМ КВ": "КГ/СМ2",
45
+ "ККАЛ В ЧАС": "ККАЛ/Ч",
46
+ "ККАЛ/ЧАС": "ККАЛ/Ч",
47
+ "КЛ НА КГ": "КЛ/КГ",
48
+ "КМ В ЧАС": "КМ/Ч",
49
+ "КМ КВ": "КМ2",
50
+ "КМ/ЧАС": "КМ/Ч",
51
+ "КУБ ДМ": "ДМ3",
52
+ "КУБ ДЮЙМ": "ДЮЙМ3",
53
+ "КУБ М В С": "М3/С",
54
+ "КУБ М": "М3",
55
+ "КУБ ММ": "ММ3",
56
+ "КУБ ФУТ": "ФУТ3",
57
+ "ЛОШ СИЛ": "ЛС",
58
+ "М В КВ С": "М/С2",
59
+ "М В С КВ": "М/С2",
60
+ "М В С": "М/С",
61
+ "М В С2": "М/С2",
62
+ "М В ЧАС": "М/Ч",
63
+ "М КВ ЖИЛ ПЛ": "М2 ЖИЛ ПЛ",
64
+ "М КВ ОБЩ ПЛ": "М2 ОБЩ ПЛ",
65
+ "М КВ УЧ ЛАБ ЗДАН": "М2 УЧ ЛАБ ЗДАН",
66
+ "М КВ": "М2",
67
+ "М КУБ В С": "М3/С",
68
+ "М КУБ": "М3",
69
+ "М/КВ С": "М/С2",
70
+ "М/С КВ": "М/С2",
71
+ "М/ЧАС": "М/Ч",
72
+ "М2 В ЧАС": "М2/Ч",
73
+ "М2 УЧ ЛАБ ЗДАН": "М2 УЧ-ЛАБ ЗДАН",
74
+ "М2/ЧАС": "М2/Ч",
75
+ "М3 В С": "М3/С",
76
+ "М3 В ЧАС": "М3/Ч",
77
+ "М3/ЧАС": "М3/Ч",
78
+ "МЕГАБАЙТ": "МБАЙТ",
79
+ "МЕГАВ А": "МЕГАВ-А",
80
+ "МЕГАВТ ЧАС": "МЕГАВТ-Ч",
81
+ "МИЛЬ КВ": "МИЛЬ2",
82
+ "МЛН А ЧАС": "МЛН А-Ч",
83
+ "МЛН ГОЛ В ГОД": "МЛН ГОЛ/ГОД",
84
+ "МЛН ДМ КВ": "МЛН ДМ2",
85
+ "МЛН ЕД В ГОД": "МЛН ЕД/ГОД",
86
+ "МЛН КВ А": "МЛН КВ-А",
87
+ "МЛН КВ ДМ": "МЛН ДМ2",
88
+ "МЛН КВ М В2 ММ ИСЧ": "МЛН М2 2ММ ИСЧ",
89
+ "МЛН КВ М ЖИЛ ПЛ": "МЛН М2 ЖИЛ ПЛ",
90
+ "МЛН КВ М ОБЩ ПЛ": "МЛН М2 ОБЩ ПЛ",
91
+ "МЛН КВ М": "МЛН М2",
92
+ "МЛН КВ М2 ММ ИСЧ": "МЛН М2 2ММ ИСЧ",
93
+ "МЛН КВТ ЧАС": "МЛН КВТ-Ч",
94
+ "МЛН КУБ М ПЕРЕРАБ ГАЗА": "МЛН М3 ПЕРЕРАБ ГАЗА",
95
+ "МЛН КУБ М": "МЛН М3",
96
+ "МЛН ЛОШ СИЛ": "МЛН ЛС",
97
+ "МЛН М КВ В2 ММ ИСЧ": "МЛН М2 2ММ ИСЧ",
98
+ "МЛН М КВ ЖИЛ ПЛ": "МЛН М2 ЖИЛ ПЛ",
99
+ "МЛН М КВ ОБЩ ПЛ": "МЛН М2 ОБЩ ПЛ",
100
+ "МЛН М КВ": "МЛН М2",
101
+ "МЛН М КВ2 ММ ИСЧ": "МЛН М2 2ММ ИСЧ",
102
+ "МЛН М КУБ ПЕРЕРАБ ГАЗА": "МЛН М3 ПЕРЕРАБ ГАЗА",
103
+ "МЛН М КУБ": "МЛН М3",
104
+ "МЛН М2 2 ММ ИСЧ": "МЛН М2 2ММ ИСЧ",
105
+ "МЛН ПОЛЛ": "МЛН ПОЛ Л",
106
+ "МЛН ПТИЦЕ МЕСТ": "МЛН ПТИЦЕМЕСТ",
107
+ "МЛН Т В ГОД": "МЛН Т/ГОД",
108
+ "МЛН УСЛ КВ М": "МЛН УСЛ М2",
109
+ "МЛН УСЛ М КВ": "МЛН УСЛ М2",
110
+ "МЛРД КВТ ЧАС": "МЛРД КВТ-Ч",
111
+ "МЛРД КВТ ЧАС": "МЛРД КВТ-Ч",
112
+ "МЛРД КУБ М": "МЛРД М3",
113
+ "МЛРД М КУБ": "МЛРД М3",
114
+ "ММ КВ": "ММ2",
115
+ "ММ КУБ": "ММ3",
116
+ "МОЩН ЭФФ": "ЭФФ МОЩН",
117
+ "ОБ В МИН": "ОБ/МИН",
118
+ "ОБ В С": "ОБ/С",
119
+ "ОПЛАТ ТР": "ЗАРАБОТН ПЛАТ",
120
+ "ОПЛАТ ТРУДА": "ЗАРАБОТН ПЛАТ",
121
+ "ПАР В СМЕТ": "ПАР/СМЕН",
122
+ "ПАР В ЧАС": "ПАР/Ч",
123
+ "ПАР/ЧАС": "ПАР/Ч",
124
+ "ПЛОТН КУБ М": "ПЛОТН М3",
125
+ "ПЛОТН М КУБ": "ПЛОТН М3",
126
+ "ПОСЕЩ В СМЕН": "ПОСЕЩ/СМЕН",
127
+ "ПТИЦЕ МЕСТ": "ПТИЦЕМЕСТ",
128
+ "РЕГИСТР Т": "НЕТТ РЕГИСТР Т",
129
+ "РЕМ В ГОД": "РЕМ/ГОД",
130
+ "Т В СМЕН": "Т/СМЕН",
131
+ "Т В СУТ": "Т/СУТ",
132
+ "Т В ЧАС": "Т/Ч",
133
+ "Т ПЕРЕРАБ В СУТ": "Т ПЕРЕРАБ/СУТ",
134
+ "Т/ЧАС": "Т/Ч",
135
+ "ТЕХН АТМ": "АТТ",
136
+ "ТЫС А ЧАС": "ТЫС А-Ч",
137
+ "ТЫС ГИГАКАЛ В ЧАС": "ТЫС ГИГАКАЛ/Ч",
138
+ "ТЫС ГИГАКАЛ/ЧАС": "ТЫС ГИГАКАЛ/Ч",
139
+ "ТЫС ГОЛ В ГОД": "ТЫС ГОЛ/ГОД",
140
+ "ТЫС ДМ КВ": "ТЫС ДМ2",
141
+ "ТЫС КВ А Р": "ТЫС КВ-А Р",
142
+ "ТЫС КВ ДМ": "ТЫС ДМ2",
143
+ "ТЫС КВ М ЖИЛ ПЛ": "ТЫС М2 ЖИЛ ПЛ",
144
+ "ТЫС КВ М ОБЩ ПЛ": "ТЫС М2 ОБЩ ПЛ",
145
+ "ТЫС КВ М УЧ ЛАБ ЗДАН": "ТЫС М2 УЧ ЛАБ ЗДАН",
146
+ "ТЫС КВ М": "ТЫС М2",
147
+ "ТЫС КВТ ЧАС": "ТЫС КВТ-Ч",
148
+ "ТЫС КУБ М В СУТ": "ТЫС М3/СУТ",
149
+ "ТЫС КУБ М": "ТЫС М3",
150
+ "ТЫС КУБ М/СУТ": "ТЫС М3/СУТ",
151
+ "ТЫС ЛОШ СИЛ": "ТЫС ЛС",
152
+ "ТЫС М КВ ЖИЛ ПЛ": "ТЫС М2 ЖИЛ ПЛ",
153
+ "ТЫС М КВ ОБЩ ПЛ": "ТЫС М2 ОБЩ ПЛ",
154
+ "ТЫС М КВ УЧ ЛАБ ЗДАН": "ТЫС М2 УЧ ЛАБ ЗДАН",
155
+ "ТЫС М КВ": "ТЫС М2",
156
+ "ТЫС М КУБ В СУТ": "ТЫС М3/СУТ",
157
+ "ТЫС М КУБ": "ТЫС М3",
158
+ "ТЫС М КУБ/СУТ": "ТЫС М3/СУТ",
159
+ "ТЫС М": "КМ",
160
+ "ТЫС М3 В СУТ": "ТЫС М3/СУТ",
161
+ "ТЫС ПАР В СМЕН": "ТЫС ПАР/СМЕН",
162
+ "ТЫС ПЛОТН КУБ М": "ТЫС ПЛОТН М3",
163
+ "ТЫС ПЛОТН М КУБ": "ТЫС ПЛОТН М3",
164
+ "ТЫС ПОЛЛ": "ТЫС ПОЛ Л",
165
+ "ТЫС ПОСЕЩ В СМЕН": "ТЫС ПОСЕЩ/СМЕН",
166
+ "ТЫС ПОСЕЩ В СМЕН": "ТЫС ПОСЕЩ/СМЕН",
167
+ "ТЫС ПТИЦЕ МЕСТ": "ТЫС ПТИЦЕМЕСТ",
168
+ "ТЫС СТД УСЛ КИРП": "ТЫС СТАНД УСЛ КИРП",
169
+ "ТЫС Т В ГОД": "ТЫС Т/ГОД",
170
+ "ТЫС Т В СЕЗ": "ТЫС Т/СЕЗ",
171
+ "ТЫС Т ПАР В ЧАС": "ТЫС Т ПАР/Ч",
172
+ "ТЫС Т ПАР/ЧАС": "ТЫС Т ПАР/Ч",
173
+ "ТЫС Т ПЕРЕРАБ В СУТ": "ТЫС Т ПЕРЕРАБ/СУТ",
174
+ "ТЫС Т ПЕРЕРАБ В СУТ": "ТЫС Т ПЕРЕРАБ/СУТ",
175
+ "ТЫС УСЛ БАНК В СМЕН": "ТЫС УСЛ БАНК/СМЕН",
176
+ "ТЫС УСЛ КВ М": "ТЫС УСЛ М2",
177
+ "ТЫС УСЛ КУБ М": "ТЫС УСЛ М3",
178
+ "ТЫС УСЛ М КВ": "ТЫС УСЛ М2",
179
+ "ТЫС УСЛ М КУБ": "ТЫС УСЛ М3",
180
+ "ТЫС Ц ПЕРЕРАБ В СУТ": "ТЫС Ц ПЕРЕРАБ/СУТ",
181
+ "ТЫС ЧЕЛ ДН": "ТЫС ЧЕЛ-ДН",
182
+ "ТЫС ЧЕЛ ЧАС": "ТЫС ЧЕЛ-Ч",
183
+ "ФУТ КВ": "ФУТ2",
184
+ "ФУТ КУБ": "ФУТ3",
185
+ "Ц И": "Ц США",
186
+ "Ц ПЕРЕРАБ В СУТ": "Ц ПЕРЕРАБ/СУТ",
187
+ "ЧЕЛ ДН": "ЧЕЛ-ДН",
188
+ "ЧЕЛ НА КВ КМ": "ЧЕЛ/КМ2",
189
+ "ЧЕЛ НА КВ М": "ЧЕЛ/М2",
190
+ "ЧЕЛ НА КМ КВ": "ЧЕЛ/КМ2",
191
+ "ЧЕЛ НА КМ2": "ЧЕЛ/КМ2",
192
+ "ЧЕЛ НА М КВ": "ЧЕЛ/М2",
193
+ "ЧЕЛ НА М2": "ЧЕЛ/М2",
194
+ "ЧЕЛ ЧАС": "ЧЕЛ-ЧАС",
195
+ "ЧЕЛ/КВ КМ": "ЧЕЛ/КМ2",
196
+ "ЧЕЛ/КВ М": "ЧЕЛ/М2",
197
+ "ЧЕЛ/КМ КВ": "ЧЕЛ/КМ2",
198
+ "ЧЕЛ/М КВ": "ЧЕЛ/М2"
199
+ }