okei 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rubocop.yml +61 -0
- data/CHANGELOG.rdoc +13 -0
- data/LICENSE.rdoc +21 -0
- data/README.rdoc +91 -0
- data/Rakefile +52 -0
- data/app/controllers/okei/api/v1/responder.rb +30 -0
- data/app/controllers/okei/api/v1/units_controller.rb +41 -0
- data/app/models/okei/line.rb +63 -0
- data/app/models/okei/unit.rb +17 -0
- data/app/models/okei/word.rb +26 -0
- data/app/models/okei/words.rb +40 -0
- data/app/use_cases/okei/find_unit.rb +65 -0
- data/app/use_cases/okei/get_unit.rb +50 -0
- data/app/use_cases/okei/get_units.rb +45 -0
- data/app/views/okei/api/v1/units/_unit.json.jbuilder +6 -0
- data/app/views/okei/api/v1/units/errors.json.jbuilder +5 -0
- data/app/views/okei/api/v1/units/index.json.jbuilder +5 -0
- data/app/views/okei/api/v1/units/show.json.jbuilder +3 -0
- data/config/locales/ru.yml +12 -0
- data/config/routes.rb +12 -0
- data/db/migrate/20141004212500_create_okei_units.rb +20 -0
- data/db/migrate/20141004212501_populate_okei_units.rb +14 -0
- data/db/migrate/20141004212502_create_okei_words.rb +11 -0
- data/db/migrate/20141004212503_populate_okei_words.rb +15 -0
- data/db/seeds/units.json +4534 -0
- data/db/seeds/words.json +2462 -0
- data/lib/okei.rb +7 -0
- data/lib/okei/engine.rb +12 -0
- data/lib/okei/version.rb +4 -0
- data/lib/tasks/okei_tasks.rake +56 -0
- data/spec/controllers/okei/api/v1/responder_spec.rb +69 -0
- data/spec/controllers/okei/api/v1/units_controller_spec.rb +88 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +13 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +29 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +78 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/assets.rb +8 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/schema.rb +39 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/test.log +49831 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/examples/json_schemas/error.json +14 -0
- data/spec/examples/json_schemas/get_errors.json +18 -0
- data/spec/examples/json_schemas/get_unit.json +13 -0
- data/spec/examples/json_schemas/get_units.json +17 -0
- data/spec/examples/json_schemas/unit.json +20 -0
- data/spec/factories/units.rb +18 -0
- data/spec/factories/words.rb +7 -0
- data/spec/models/okei/line_spec.rb +61 -0
- data/spec/models/okei/unit_spec.rb +170 -0
- data/spec/models/okei/word_spec.rb +75 -0
- data/spec/models/okei/words_spec.rb +64 -0
- data/spec/requests/okei/api/v1/find_unit_spec.rb +65 -0
- data/spec/requests/okei/api/v1/get_unit_spec.rb +57 -0
- data/spec/requests/okei/api/v1/get_units_spec.rb +64 -0
- data/spec/routing/okei/api/v1/units_routing_spec.rb +56 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/support/initializers/caching.rb +20 -0
- data/spec/support/initializers/coveralls.rb +4 -0
- data/spec/support/initializers/database_cleaner.rb +24 -0
- data/spec/support/initializers/factory_girl.rb +6 -0
- data/spec/support/initializers/factory_girl_rails.rb +1 -0
- data/spec/support/initializers/focus.rb +5 -0
- data/spec/support/initializers/garbage_collection.rb +11 -0
- data/spec/support/initializers/i18n.rb +1 -0
- data/spec/support/initializers/migrations.rb +3 -0
- data/spec/support/initializers/rails.rb +6 -0
- data/spec/support/initializers/random_order.rb +4 -0
- data/spec/support/initializers/rspec.rb +10 -0
- data/spec/support/initializers/timecop.rb +1 -0
- data/spec/support/matchers/controllers.rb +14 -0
- data/spec/support/matchers/json_schema.rb +10 -0
- data/spec/use_cases/okei/find_unit_spec.rb +77 -0
- data/spec/use_cases/okei/get_unit_spec.rb +64 -0
- data/spec/use_cases/okei/get_units_spec.rb +65 -0
- data/spec/views/okei/api/v1/units/_unit.json_spec.rb +24 -0
- metadata +400 -0
@@ -0,0 +1,75 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
module Okei
|
5
|
+
describe Word do
|
6
|
+
|
7
|
+
describe "#synonym=" do
|
8
|
+
|
9
|
+
subject(:word) { Word.new }
|
10
|
+
|
11
|
+
it "sets #synonym" do
|
12
|
+
value = "МЕТР"
|
13
|
+
expect { word.synonym = value }.to change { word.synonym }.to value
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#text=" do
|
18
|
+
|
19
|
+
subject(:word) { Word.new }
|
20
|
+
|
21
|
+
it "sets #text" do
|
22
|
+
value = "М"
|
23
|
+
expect { word.text = value }.to change { word.text }.to value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#valid?" do
|
28
|
+
|
29
|
+
subject(:word) { build :word }
|
30
|
+
|
31
|
+
before { expect(word).to be_valid }
|
32
|
+
|
33
|
+
it "fails when #synonym is absent" do
|
34
|
+
word.synonym = ""
|
35
|
+
expect(word).not_to be_valid
|
36
|
+
end
|
37
|
+
|
38
|
+
it "fails when #synonym is taken" do
|
39
|
+
create :word, synonym: word.synonym
|
40
|
+
expect(word).not_to be_valid
|
41
|
+
end
|
42
|
+
|
43
|
+
it "fails when #text is absent" do
|
44
|
+
word.text = ""
|
45
|
+
expect(word).not_to be_valid
|
46
|
+
end
|
47
|
+
|
48
|
+
it "passes when #text is taken" do
|
49
|
+
create :word, text: word.text
|
50
|
+
expect(word).to be_valid
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe ".translate" do
|
55
|
+
|
56
|
+
let!(:line) { "ТЕКСТ" }
|
57
|
+
|
58
|
+
context "when word exists" do
|
59
|
+
|
60
|
+
let!(:word) { create :word, synonym: line }
|
61
|
+
|
62
|
+
it "translates line" do
|
63
|
+
expect(Word.translate line).to eq word.text
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "when word is absent" do
|
68
|
+
|
69
|
+
it "returns the source" do
|
70
|
+
expect(Word.translate line).to eq line
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
module Okei
|
5
|
+
describe Words do
|
6
|
+
|
7
|
+
describe ".new" do
|
8
|
+
|
9
|
+
RSpec::Matchers.define :have_words do |list|
|
10
|
+
match do |text|
|
11
|
+
expect(Words.new text).to eq list
|
12
|
+
end
|
13
|
+
failure_message do |text|
|
14
|
+
"#{ text } should have words #{ list }." \
|
15
|
+
" #{ Words.new text } given."
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns list of words" do
|
20
|
+
expect(Words.new).to be_kind_of Array
|
21
|
+
end
|
22
|
+
|
23
|
+
specify { expect("УСЛ МЕТР/СЕК^2").to have_words %w(УСЛ МЕТР / СЕК ^ 2) }
|
24
|
+
specify { expect("100 М").to have_words %w(100 М) }
|
25
|
+
specify { expect("2ШТ").to have_words %w(2 ШТ) }
|
26
|
+
specify { expect("1000КМ").to have_words %w(1000 КМ) }
|
27
|
+
specify { expect("0.1КМ").to have_words %w(0.1 КМ) }
|
28
|
+
specify { expect("М1").to have_words %w(М 1) }
|
29
|
+
specify { expect("М.1").to have_words %w(М 1) }
|
30
|
+
specify { expect("М4").to have_words %w(М 4) }
|
31
|
+
specify { expect("М.4").to have_words %w(М 4) }
|
32
|
+
specify { expect("ТЫС. Ч").to have_words %w(ТЫС Ч) }
|
33
|
+
specify { expect("ТЫС. Ч.").to have_words %w(ТЫС Ч) }
|
34
|
+
specify { expect(".ТЫС .Ч").to have_words %w(ТЫС Ч) }
|
35
|
+
specify { expect("90%").to have_words %w(90 %) }
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#map" do
|
39
|
+
|
40
|
+
subject(:words) { Words.new("M") }
|
41
|
+
|
42
|
+
it "should return a Words object" do
|
43
|
+
expect(subject.map { |word| word }).to be_kind_of Words
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#to_s" do
|
48
|
+
|
49
|
+
RSpec::Matchers.define :shape_into do |text|
|
50
|
+
match do |words|
|
51
|
+
expect(Words.new(words).to_s).to eq text
|
52
|
+
end
|
53
|
+
failure_message do |words|
|
54
|
+
"'#{ words }' should shape into '#{ text }'." \
|
55
|
+
" '#{ Words.new(words) }' given."
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
specify { expect("К ^ М ^ 2").to shape_into "КМ2" }
|
60
|
+
specify { expect("КМ / С").to shape_into "КМ/С" }
|
61
|
+
specify { expect("КИЛОМ").to shape_into "КИЛОМ" }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
module Okei
|
5
|
+
describe "Find unit" do
|
6
|
+
|
7
|
+
# ==========================================================================
|
8
|
+
# Prepare context
|
9
|
+
# ==========================================================================
|
10
|
+
|
11
|
+
let!(:unit) { create :unit, code: "ТЫС ЧЕЛ-ЧАС" }
|
12
|
+
before do
|
13
|
+
{
|
14
|
+
"1000" => "ТЫС",
|
15
|
+
"ЧЕЛОВЕКО" => "ЧЕЛ",
|
16
|
+
"ЧАСОВ" => "ЧАС",
|
17
|
+
"ТЫС ЧЕЛ ЧАС" => "ТЫС ЧЕЛ-ЧАС"
|
18
|
+
}.each { |synonym, text| create :word, synonym: synonym, text: text }
|
19
|
+
end
|
20
|
+
|
21
|
+
# ==========================================================================
|
22
|
+
# Prepare variables
|
23
|
+
# ==========================================================================
|
24
|
+
|
25
|
+
def call_request(text)
|
26
|
+
get "okei/api/v1/units/search", text: text
|
27
|
+
end
|
28
|
+
|
29
|
+
# ==========================================================================
|
30
|
+
# Run tests
|
31
|
+
# ==========================================================================
|
32
|
+
|
33
|
+
context "with proper text" do
|
34
|
+
|
35
|
+
before { call_request "1000 человеко-часов" }
|
36
|
+
|
37
|
+
it "responds with 200" do
|
38
|
+
expect(response.status).to eq 200
|
39
|
+
end
|
40
|
+
|
41
|
+
it "responds with proper json" do
|
42
|
+
expect(response.body).to match_json_schema(:get_unit)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "responds with requested unit" do
|
46
|
+
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) }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "with wrong text" do
|
53
|
+
|
54
|
+
before { call_request "wrong" }
|
55
|
+
|
56
|
+
it "responds with 404" do
|
57
|
+
expect(response.status).to eq 404
|
58
|
+
end
|
59
|
+
|
60
|
+
it "responds with proper json" do
|
61
|
+
expect(response.body).to match_json_schema(:get_errors)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
module Okei
|
5
|
+
describe "Getting unit" do
|
6
|
+
|
7
|
+
# ==========================================================================
|
8
|
+
# Prepare environment
|
9
|
+
# ==========================================================================
|
10
|
+
|
11
|
+
let!(:unit) { create :unit }
|
12
|
+
|
13
|
+
# ==========================================================================
|
14
|
+
# Prepare variables
|
15
|
+
# ==========================================================================
|
16
|
+
|
17
|
+
def call_request(uuid)
|
18
|
+
get "okei/api/v1/units/#{ uuid }"
|
19
|
+
end
|
20
|
+
|
21
|
+
# ==========================================================================
|
22
|
+
# Run tests
|
23
|
+
# ==========================================================================
|
24
|
+
|
25
|
+
context "with proper uuid" do
|
26
|
+
|
27
|
+
before { call_request unit.uuid }
|
28
|
+
|
29
|
+
it "responds with 200" do
|
30
|
+
expect(response.status).to eq 200
|
31
|
+
end
|
32
|
+
|
33
|
+
it "responds with proper json" do
|
34
|
+
expect(response.body).to match_json_schema(:get_unit)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "responds with requested unit" do
|
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) }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "with wrong uuid" do
|
45
|
+
|
46
|
+
before { call_request "00000000-0000-0000-0000-000000000000" }
|
47
|
+
|
48
|
+
it "responds with 404" do
|
49
|
+
expect(response.status).to eq 404
|
50
|
+
end
|
51
|
+
|
52
|
+
it "responds with proper json" do
|
53
|
+
expect(response.body).to match_json_schema(:get_errors)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
module Okei
|
5
|
+
describe "GET api/v1/units" do
|
6
|
+
|
7
|
+
# ==========================================================================
|
8
|
+
# Prepare environment
|
9
|
+
# ==========================================================================
|
10
|
+
|
11
|
+
let!(:nmile) { create :unit, code: "МИЛЬ", measure: "ДЛИНА" }
|
12
|
+
let!(:mole) { create :unit, code: "МОЛЬ", measure: "ПРОЧИЕ" }
|
13
|
+
|
14
|
+
# ==========================================================================
|
15
|
+
# Prepare variables
|
16
|
+
# ==========================================================================
|
17
|
+
|
18
|
+
def call_request(params = {})
|
19
|
+
get "okei/api/v1/units", params
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:uuids) do
|
23
|
+
JSON.parse(response.body)["units"].map { |unit| unit["uuid"] }
|
24
|
+
end
|
25
|
+
|
26
|
+
# ==========================================================================
|
27
|
+
# Run tests
|
28
|
+
# ==========================================================================
|
29
|
+
|
30
|
+
context "without params" do
|
31
|
+
|
32
|
+
before { call_request }
|
33
|
+
|
34
|
+
it "responds with 200" do
|
35
|
+
expect(response.status).to eq 200
|
36
|
+
end
|
37
|
+
|
38
|
+
it "receives proper json" do
|
39
|
+
expect(response.body).to match_json_schema(:get_units)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "receivesll units" do
|
43
|
+
expect(uuids).to eq [nmile.uuid, mole.uuid]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "with measure" do
|
48
|
+
|
49
|
+
before { call_request "measure" => "ДЛИНА" }
|
50
|
+
|
51
|
+
it "responds with 200" do
|
52
|
+
expect(response.status).to eq 200
|
53
|
+
end
|
54
|
+
|
55
|
+
it "receives proper json" do
|
56
|
+
expect(response.body).to match_json_schema(:get_units)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "receives matched units" do
|
60
|
+
expect(uuids).to eq [nmile.uuid]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
module Okei
|
5
|
+
describe "units" do
|
6
|
+
|
7
|
+
routes { Okei::Engine.routes }
|
8
|
+
|
9
|
+
let(:root) { "api/v1/units" }
|
10
|
+
|
11
|
+
describe "#index" do
|
12
|
+
|
13
|
+
let(:action) do
|
14
|
+
{ controller: "okei/#{ root }", action: "index" }
|
15
|
+
end
|
16
|
+
|
17
|
+
subject(:request) { { get: "/#{ root }" } }
|
18
|
+
|
19
|
+
it "is routable in json" do
|
20
|
+
expect(request).to route_to action.merge(format: "json")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#show" do
|
25
|
+
|
26
|
+
let(:action) do
|
27
|
+
{
|
28
|
+
controller: "okei/#{ root }",
|
29
|
+
action: "show",
|
30
|
+
uuid: "f5f944e1-66c1-4432-82bb-5f8235dcd5d7"
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
subject(:request) do
|
35
|
+
{ get: "/#{ root }/f5f944e1-66c1-4432-82bb-5f8235dcd5d7" }
|
36
|
+
end
|
37
|
+
|
38
|
+
it "is routable in json" do
|
39
|
+
expect(request).to route_to action.merge(format: "json")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "#find" do
|
44
|
+
|
45
|
+
let(:action) do
|
46
|
+
{ controller: "okei/#{ root }", action: "search" }
|
47
|
+
end
|
48
|
+
|
49
|
+
subject(:request) { { get: "/#{ root }/search" } }
|
50
|
+
|
51
|
+
it "is routable in json" do
|
52
|
+
expect(request).to route_to action.merge(format: "json")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
ENV["RAILS_ENV"] ||= "test"
|
2
|
+
|
3
|
+
root = File.dirname File.dirname(__FILE__)
|
4
|
+
|
5
|
+
# Application files
|
6
|
+
require File.expand_path("../dummy/config/environment", __FILE__)
|
7
|
+
|
8
|
+
# Support files and Rspec settings
|
9
|
+
Dir[File.join(root, "spec/support/**/*.rb")].each { |file| require file }
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "rails"
|
2
|
+
require "rspec/rails"
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
|
6
|
+
config.around(:each, :caching) do |example|
|
7
|
+
caching = ActionController::Base.perform_caching
|
8
|
+
ActionController::Base.perform_caching = example.metadata[:caching]
|
9
|
+
example.run
|
10
|
+
ActionController::Base.perform_caching = caching
|
11
|
+
end
|
12
|
+
|
13
|
+
config.before(:each) do
|
14
|
+
Rails.cache.clear
|
15
|
+
end
|
16
|
+
|
17
|
+
config.after(:all) do
|
18
|
+
Rails.cache.clear
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "database_cleaner"
|
2
|
+
require "rspec/rails"
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
|
6
|
+
# stop wrapping each of test examples within a transaction
|
7
|
+
config.use_transactional_fixtures = false
|
8
|
+
|
9
|
+
config.before :suite do
|
10
|
+
DatabaseCleaner.clean_with :truncation
|
11
|
+
end
|
12
|
+
|
13
|
+
config.before :each do
|
14
|
+
DatabaseCleaner.strategy = :transaction
|
15
|
+
end
|
16
|
+
|
17
|
+
config.before :each do
|
18
|
+
DatabaseCleaner.start
|
19
|
+
end
|
20
|
+
|
21
|
+
config.after :each do
|
22
|
+
DatabaseCleaner.clean
|
23
|
+
end
|
24
|
+
end
|