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
@@ -5,7 +5,12 @@
5
5
  "type": "object",
6
6
 
7
7
  "properties": {
8
- "uuid": { "type": "string", "format": "^(a-f|\\d|-){36}$" },
8
+ "uuids": {
9
+ "type": "array",
10
+ "items": { "type": "string", "format": "^(a-f|\\d|-){36}$" },
11
+ "minimumItems": 1,
12
+ "unique": true
13
+ },
9
14
  "name": { "type": "string", "minLength": 1 },
10
15
  "code": { "type": "string", "minLength": 1 },
11
16
  "num": { "type": "string", "format": "^(\\d){3}$" },
@@ -16,5 +21,5 @@
16
21
  },
17
22
 
18
23
  "additionalProperties": false,
19
- "required": ["uuid", "name", "code", "base", "factor", "measure"]
24
+ "required": ["uuids", "name", "code", "base", "factor", "measure"]
20
25
  }
@@ -6,7 +6,6 @@ FactoryGirl.define do
6
6
  chars = ("A".."Z").to_a
7
7
 
8
8
  factory :unit, class: Okei::Unit do
9
- uuid { SecureRandom.uuid }
10
9
  sequence(:name) { |n| "Единица #{ n }" }
11
10
  sequence(:code) { |n| "ЕИ #{ n }" }
12
11
  sequence(:num) { |n| format "%03d", (n + 1) % 999 }
@@ -6,11 +6,14 @@ module Okei
6
6
 
7
7
  let!(:unit) { Unit.new }
8
8
 
9
- describe "#uuid=" do
9
+ describe "#uuids" do
10
10
 
11
- it "assigns a uuid" do
12
- value = "48f53a7c-726f-4ec1-9b83-a12b247844a6"
13
- expect { unit.uuid = value }.to change { unit.uuid }.to value
11
+ let!(:value) { "48f53a7c-726f-4ec1-9b83-a12b247844a6" }
12
+
13
+ it "has a list of uuids" do
14
+ expect(unit).to respond_to :uuids
15
+ expect(unit).to respond_to :uuid
16
+ expect(Unit).to respond_to :by_uuid
14
17
  end
15
18
  end
16
19
 
@@ -75,28 +78,6 @@ module Okei
75
78
  let!(:unit) { build :unit }
76
79
  before { expect(unit).to be_valid }
77
80
 
78
- it "fails when a uuid is absent" do
79
- unit.uuid = nil
80
- expect(unit).not_to be_valid
81
- end
82
-
83
- it "fails when uuid has a wrong format" do
84
- %w(
85
- 48f53a7c-726f-4ec1-9b83-a12b2478446
86
- 48f53a7c-726f-4ec1-9b83-a12b2478446g
87
- 48f53a7c-726f-4ec19-b83-a12b2478446g
88
- 48f53a7c-726f-4ec1-9b83-a12b2478446ee
89
- ).each do |value|
90
- unit.uuid = value
91
- expect(unit).not_to be_valid
92
- end
93
- end
94
-
95
- it "fails when a uuid is already taken" do
96
- create :unit, uuid: unit.uuid
97
- expect(unit).not_to be_valid
98
- end
99
-
100
81
  it "fails when a name is absent" do
101
82
  unit.name = nil
102
83
  expect(unit).not_to be_valid
@@ -8,14 +8,12 @@ module Okei
8
8
  # Prepare context
9
9
  # ==========================================================================
10
10
 
11
- let!(:unit) { create :unit, code: "ТЫС ЧЕЛ-ЧАС" }
11
+ let!(:unit) { create :unit, code: "ТЫС М/С2" }
12
+ let!(:text) { "километров в сек" }
12
13
  before do
13
- {
14
- "1000" => "ТЫС",
15
- "ЧЕЛОВЕКО" => "ЧЕЛ",
16
- "ЧАСОВ" => "ЧАС",
17
- "ТЫС ЧЕЛ ЧАС" => "ТЫС ЧЕЛ-ЧАС"
18
- }.each { |synonym, text| create :word, synonym: synonym, text: text }
14
+ allow(Corrector::Parse).to receive(:new) do |str, scope:|
15
+ (str == text) && (scope == "okei") ? unit.code : str
16
+ end
19
17
  end
20
18
 
21
19
  # ==========================================================================
@@ -32,7 +30,7 @@ module Okei
32
30
 
33
31
  context "with proper text" do
34
32
 
35
- before { call_request "1000 человеко-часов" }
33
+ before { call_request text }
36
34
 
37
35
  it "responds with 200" do
38
36
  expect(response.status).to eq 200
@@ -44,14 +42,13 @@ module Okei
44
42
 
45
43
  it "responds with requested unit" do
46
44
  received = JSON.parse(response.body)["unit"]
47
- %w(uuid name code num int_code base factor measure)
48
- .each { |key| expect(received[key]).to eq unit.send(key) }
45
+ expect(received["uuids"]).to be_include unit.uuid
49
46
  end
50
47
  end
51
48
 
52
49
  context "with wrong text" do
53
50
 
54
- before { call_request "wrong" }
51
+ before { call_request "wrong text" }
55
52
 
56
53
  it "responds with 404" do
57
54
  expect(response.status).to eq 404
@@ -2,7 +2,7 @@
2
2
  require "spec_helper"
3
3
 
4
4
  module Okei
5
- describe "Getting unit" do
5
+ describe "Getting unit"do
6
6
 
7
7
  # ==========================================================================
8
8
  # Prepare environment
@@ -36,8 +36,7 @@ module Okei
36
36
 
37
37
  it "responds with requested unit" do
38
38
  received = JSON.parse(response.body)["unit"]
39
- %w(uuid name code num int_code base factor measure)
40
- .each { |key| expect(received[key]).to eq unit.send(key) }
39
+ expect(received["uuids"]).to be_include unit.uuid
41
40
  end
42
41
  end
43
42
 
@@ -20,7 +20,7 @@ module Okei
20
20
  end
21
21
 
22
22
  let(:uuids) do
23
- JSON.parse(response.body)["units"].map { |unit| unit["uuid"] }
23
+ JSON.parse(response.body)["units"].map { |unit| unit["uuids"] }.flatten
24
24
  end
25
25
 
26
26
  # ==========================================================================
@@ -39,7 +39,7 @@ module Okei
39
39
  expect(response.body).to match_json_schema(:get_units)
40
40
  end
41
41
 
42
- it "receivesll units" do
42
+ it "receives all units" do
43
43
  expect(uuids).to eq [nmile.uuid, mole.uuid]
44
44
  end
45
45
  end
@@ -1 +1,5 @@
1
1
  require "factory_girl_rails"
2
+
3
+ RSpec.configure do |config|
4
+ config.include FactoryGirl::Syntax::Methods
5
+ end
@@ -8,14 +8,12 @@ module Okei
8
8
  # Prepare context
9
9
  # ==========================================================================
10
10
 
11
- let!(:unit) { create :unit, code: "ТЫС ЧЕЛ-ЧАС" }
11
+ let!(:unit) { create :unit, code: "ТЫС М/С2" }
12
+ let!(:text) { "километров в сек" }
12
13
  before do
13
- {
14
- "1000" => "ТЫС",
15
- "ЧЕЛОВЕКО" => "ЧЕЛ",
16
- "ЧАСОВ" => "ЧАС",
17
- "ТЫС ЧЕЛ ЧАС" => "ТЫС ЧЕЛ-ЧАС"
18
- }.each { |synonym, text| create :word, synonym: synonym, text: text }
14
+ allow(Corrector::Parse).to receive(:new) do |str, scope:|
15
+ (str == text) && (scope == "okei") ? unit.code : str
16
+ end
19
17
  end
20
18
 
21
19
  # ==========================================================================
@@ -38,7 +36,6 @@ module Okei
38
36
 
39
37
  context "with proper text" do
40
38
 
41
- let!(:text) { "1000 человеко-часов" }
42
39
  subject(:use_case) { prepare_case text }
43
40
 
44
41
  it "returns the unit" do
@@ -52,14 +49,14 @@ module Okei
52
49
 
53
50
  it "caches results of code preparing", :caching do
54
51
  use_case.run
55
- expect(Word).not_to receive(:find_by_synonym)
52
+ expect(Corrector::Phrase).not_to receive(:scope)
56
53
  prepare_case(text).run
57
54
  end
58
55
  end
59
56
 
60
57
  context "with wrong text" do
61
58
 
62
- subject(:use_case) { prepare_case "тысяч человеко-часов" }
59
+ subject(:use_case) { prepare_case "тысяч км в сек" }
63
60
 
64
61
  it "returns nil" do
65
62
  expect(use_case.run).to be_nil
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: okei
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 1.0.0.pre.rc
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kozin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-14 00:00:00.000000000 Z
11
+ date: 2014-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hexx
@@ -58,6 +58,34 @@ dependencies:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
60
  version: '4.1'
61
+ - !ruby/object:Gem::Dependency
62
+ name: corrector
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.0'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: uuids
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: 1.0.0.pre.rc1
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 1.0.0.pre.rc1
61
89
  - !ruby/object:Gem::Dependency
62
90
  name: database_cleaner
63
91
  requirement: !ruby/object:Gem::Requirement
@@ -201,10 +229,7 @@ files:
201
229
  - Rakefile
202
230
  - app/controllers/okei/api/v1/responder.rb
203
231
  - app/controllers/okei/api/v1/units_controller.rb
204
- - app/models/okei/line.rb
205
232
  - app/models/okei/unit.rb
206
- - app/models/okei/word.rb
207
- - app/models/okei/words.rb
208
233
  - app/use_cases/okei/find_unit.rb
209
234
  - app/use_cases/okei/get_unit.rb
210
235
  - app/use_cases/okei/get_units.rb
@@ -214,10 +239,11 @@ files:
214
239
  - app/views/okei/api/v1/units/show.json.jbuilder
215
240
  - config/locales/ru.yml
216
241
  - config/routes.rb
217
- - db/migrate/20141004212500_create_okei_units.rb
218
- - db/migrate/20141004212501_populate_okei_units.rb
219
- - db/migrate/20141004212502_create_okei_words.rb
220
- - db/migrate/20141004212503_populate_okei_words.rb
242
+ - db/migrate/20141019072900_create_okei_units.rb
243
+ - db/migrate/20141019072901_populate_okei_units.rb
244
+ - db/migrate/20141019072902_populate_okei_correctors.rb
245
+ - db/seeds/phrases.json
246
+ - db/seeds/prefixes.json
221
247
  - db/seeds/units.json
222
248
  - db/seeds/words.json
223
249
  - lib/okei.rb
@@ -255,8 +281,11 @@ files:
255
281
  - spec/dummy/config/locales/en.yml
256
282
  - spec/dummy/config/routes.rb
257
283
  - spec/dummy/config/secrets.yml
284
+ - spec/dummy/db/migrate/20141018085223_create_corrector_bases.corrector.rb
285
+ - spec/dummy/db/migrate/20141018085226_create_uuids_uuids.uuids.rb
258
286
  - spec/dummy/db/schema.rb
259
287
  - spec/dummy/db/test.sqlite3
288
+ - spec/dummy/log/development.log
260
289
  - spec/dummy/log/test.log
261
290
  - spec/dummy/public/404.html
262
291
  - spec/dummy/public/422.html
@@ -268,11 +297,7 @@ files:
268
297
  - spec/examples/json_schemas/get_units.json
269
298
  - spec/examples/json_schemas/unit.json
270
299
  - spec/factories/units.rb
271
- - spec/factories/words.rb
272
- - spec/models/okei/line_spec.rb
273
300
  - spec/models/okei/unit_spec.rb
274
- - spec/models/okei/word_spec.rb
275
- - spec/models/okei/words_spec.rb
276
301
  - spec/requests/okei/api/v1/find_unit_spec.rb
277
302
  - spec/requests/okei/api/v1/get_unit_spec.rb
278
303
  - spec/requests/okei/api/v1/get_units_spec.rb
@@ -281,7 +306,6 @@ files:
281
306
  - spec/support/initializers/caching.rb
282
307
  - spec/support/initializers/coveralls.rb
283
308
  - spec/support/initializers/database_cleaner.rb
284
- - spec/support/initializers/factory_girl.rb
285
309
  - spec/support/initializers/factory_girl_rails.rb
286
310
  - spec/support/initializers/focus.rb
287
311
  - spec/support/initializers/garbage_collection.rb
@@ -312,9 +336,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
312
336
  version: '2.1'
313
337
  required_rubygems_version: !ruby/object:Gem::Requirement
314
338
  requirements:
315
- - - ">="
339
+ - - ">"
316
340
  - !ruby/object:Gem::Version
317
- version: '0'
341
+ version: 1.3.1
318
342
  requirements: []
319
343
  rubyforge_project:
320
344
  rubygems_version: 2.2.2
@@ -326,9 +350,6 @@ test_files:
326
350
  - spec/routing/okei/api/v1/units_routing_spec.rb
327
351
  - spec/spec_helper.rb
328
352
  - spec/models/okei/unit_spec.rb
329
- - spec/models/okei/words_spec.rb
330
- - spec/models/okei/word_spec.rb
331
- - spec/models/okei/line_spec.rb
332
353
  - spec/dummy/public/500.html
333
354
  - spec/dummy/public/422.html
334
355
  - spec/dummy/public/404.html
@@ -351,6 +372,8 @@ test_files:
351
372
  - spec/dummy/config/initializers/cookies_serializer.rb
352
373
  - spec/dummy/config/initializers/filter_parameter_logging.rb
353
374
  - spec/dummy/config/initializers/assets.rb
375
+ - spec/dummy/db/migrate/20141018085223_create_corrector_bases.corrector.rb
376
+ - spec/dummy/db/migrate/20141018085226_create_uuids_uuids.uuids.rb
354
377
  - spec/dummy/db/test.sqlite3
355
378
  - spec/dummy/db/schema.rb
356
379
  - spec/dummy/app/views/layouts/application.html.erb
@@ -360,12 +383,12 @@ test_files:
360
383
  - spec/dummy/app/controllers/application_controller.rb
361
384
  - spec/dummy/Rakefile
362
385
  - spec/dummy/README.rdoc
386
+ - spec/dummy/log/development.log
363
387
  - spec/dummy/log/test.log
364
388
  - spec/dummy/config.ru
365
389
  - spec/dummy/bin/rake
366
390
  - spec/dummy/bin/rails
367
391
  - spec/dummy/bin/bundle
368
- - spec/factories/words.rb
369
392
  - spec/factories/units.rb
370
393
  - spec/controllers/okei/api/v1/responder_spec.rb
371
394
  - spec/controllers/okei/api/v1/units_controller_spec.rb
@@ -381,7 +404,6 @@ test_files:
381
404
  - spec/support/matchers/controllers.rb
382
405
  - spec/support/initializers/garbage_collection.rb
383
406
  - spec/support/initializers/i18n.rb
384
- - spec/support/initializers/factory_girl.rb
385
407
  - spec/support/initializers/focus.rb
386
408
  - spec/support/initializers/timecop.rb
387
409
  - spec/support/initializers/factory_girl_rails.rb
@@ -1,63 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Okei
4
-
5
- # Converts source string to standardized line of text with:
6
- #
7
- # * cyrillic letters un upper register
8
- # * numbers
9
- # * ^ - a symbol of word break
10
- # * slashes
11
- # * spaces
12
- # * %
13
- #
14
- # Line.new "1000шт в условн.эквивал."
15
- # # => "1000 ШТ В УСЛОВН ЭКВИВАЛ"
16
- #
17
- class Line < String
18
-
19
- def initialize(str = "")
20
- super str.to_s.mb_chars.upcase
21
- to_cyrillic
22
- remove_dots_and_commas
23
- clear_text
24
- add_breaks
25
- end
26
-
27
- private
28
-
29
- # Converts latin letters to corresponding cyrillic
30
- def to_cyrillic
31
- {
32
- "A" => "А", "B" => "В", "C" => "С", "D" => "Д", "E" => "Е",
33
- "G" => "Д", "H" => "Н", "K" => "К", "M" => "М", "N" => "П",
34
- "O" => "О", "P" => "Р", "Q" => "Д", "R" => "Г", "T" => "Т",
35
- "U" => "И", "X" => "Х", "Y" => "У"
36
- }.each { |lat, cyr| gsub! lat, cyr }
37
- end
38
-
39
- # Remove dots and commas except for dots between digits
40
- def remove_dots_and_commas
41
- gsub!(/\.+/, ",")
42
- gsub!(/(\d),(\d)/, '\1.\2')
43
- gsub!(/,/, " ")
44
- end
45
-
46
- # Removes unwanted symbols.
47
- def clear_text
48
- gsub!(/\%-[^\s]+/, "%")
49
- gsub!(/[^А-Я\d\.\s\/\%]/, " ")
50
- gsub!(/\A[^А-Я\d]+|[^А-Я\d]+\z/, " ")
51
- gsub!(/\s{2,}/, " ")
52
- strip!
53
- end
54
-
55
- # Add ^ to mark word breaks
56
- def add_breaks
57
- gsub!(
58
- /\A(НАНО|МИКРО|МИЛЛИ|САНТИ|ПОЛ|ДЕКА|ДЕЦИ|ГЕКТО|КИЛО|МЕГА|ТЕРА)/, '\1 ^ '
59
- )
60
- gsub!(/([А-Я])[\s\.^]*(2|3)(?!\d)/, '\1 ^ \2')
61
- end
62
- end
63
- end
@@ -1,26 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Okei
4
-
5
- # Stores dictionary of words:
6
- #
7
- # Word.new synonym: "МЕТРЫ", text: "М"
8
- # Word.new synonym: "МЕТР", text: "М"
9
- #
10
- # ...and units in their standard representation:
11
- #
12
- # Word.new synonym: "КВ М", text: "М2"
13
- # Word.new synonym: "М КВ", text: "М2"
14
- #
15
- class Word < ActiveRecord::Base
16
-
17
- validates :synonym, :text, presence: true
18
- validates :synonym, uniqueness: { case_sensitive: false }, allow_nil: true
19
-
20
- # Translates the line if a translation exists.
21
- # Otherwise returns source line unchanged.
22
- def self.translate(line)
23
- find_by_synonym(line).try(:text) || line
24
- end
25
- end
26
- end