okei 0.0.2 → 1.0.0.pre.rc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }