defra_ruby_validators 0.1.1 → 1.0.0
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.
- checksums.yaml +4 -4
- data/README.md +1 -18
- data/config/locales/defra_ruby/validators/companies_house_number_validator/en.yml +10 -0
- data/lib/defra_ruby/validators.rb +15 -0
- data/lib/defra_ruby/validators/base_validator.rb +21 -0
- data/lib/defra_ruby/validators/companies_house_number_validator.rb +54 -0
- data/lib/defra_ruby/validators/companies_house_service.rb +36 -0
- data/lib/defra_ruby/validators/configuration.rb +35 -0
- data/lib/defra_ruby/validators/engine.rb +22 -0
- data/lib/defra_ruby/validators/version.rb +7 -0
- data/lib/defra_ruby_validators.rb +27 -9
- data/spec/cassettes/company_no_inactive.yml +14 -14
- data/spec/cassettes/company_no_not_found.yml +15 -15
- data/spec/cassettes/company_no_valid.yml +14 -14
- data/spec/defra_ruby/validators/companies_house_number_validator_spec.rb +88 -0
- data/spec/defra_ruby/validators/companies_house_service_spec.rb +58 -0
- data/spec/defra_ruby/validators/configuration_spec.rb +49 -0
- data/spec/defra_ruby/validators_spec.rb +12 -0
- data/spec/examples.txt +36 -27
- data/spec/spec_helper.rb +69 -19
- data/spec/support/defra_ruby_validators.rb +13 -2
- data/spec/support/dotenv.rb +4 -0
- data/spec/support/helpers/translator.rb +14 -0
- data/spec/support/pry.rb +7 -0
- data/spec/support/shared_examples/validators/invalid_record.rb +18 -0
- data/spec/support/shared_examples/validators/valid_record.rb +12 -0
- data/spec/support/shared_examples/validators/validator.rb +8 -0
- data/spec/support/simplecov.rb +17 -0
- metadata +37 -19
- data/config/locales/defra_ruby_validators/companies_house_number/en.yml +0 -14
- data/lib/defra_ruby_validators/companies_house_number_validator.rb +0 -56
- data/lib/defra_ruby_validators/companies_house_service.rb +0 -34
- data/lib/defra_ruby_validators/engine.rb +0 -20
- data/lib/defra_ruby_validators/validators.rb +0 -33
- data/lib/defra_ruby_validators/version.rb +0 -5
- data/spec/defra_ruby_validators/companies_house_number_validator_spec.rb +0 -125
- data/spec/defra_ruby_validators/companies_house_service_spec.rb +0 -55
- data/spec/defra_ruby_validators/version_spec.rb +0 -7
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.shared_examples "a valid record" do |validatable|
|
4
|
+
it "confirms the object is valid" do
|
5
|
+
expect(validatable).to be_valid
|
6
|
+
end
|
7
|
+
|
8
|
+
it "the errors are empty" do
|
9
|
+
validatable.valid?
|
10
|
+
expect(validatable.errors).to be_empty
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "simplecov"
|
4
|
+
|
5
|
+
# We start it with the rails param to ensure it includes coverage for all code
|
6
|
+
# started by the rails app, and not just the files touched by our unit tests.
|
7
|
+
# This gives us the most accurate assessment of our unit test coverage
|
8
|
+
# https://github.com/colszowka/simplecov#getting-started
|
9
|
+
SimpleCov.start do
|
10
|
+
# We filter the spec folder, mainly to ensure that any dummy apps don't get
|
11
|
+
# included in the coverage report. However our intent is that nothing in the
|
12
|
+
# spec folder should be included
|
13
|
+
add_filter "/spec/"
|
14
|
+
# The version file is simply just that, so we do not feel the need to ensure
|
15
|
+
# we have a test for it
|
16
|
+
add_filter "lib/defra_ruby/validators/version"
|
17
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: defra_ruby_validators
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Defra
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '2.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: defra_ruby_style
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: dotenv
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: github_changelog_generator
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -81,7 +81,7 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: i18n
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
@@ -95,7 +95,7 @@ dependencies:
|
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: pry-byebug
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - ">="
|
@@ -204,23 +204,33 @@ files:
|
|
204
204
|
- Rakefile
|
205
205
|
- bin/console
|
206
206
|
- bin/setup
|
207
|
-
- config/locales/
|
207
|
+
- config/locales/defra_ruby/validators/companies_house_number_validator/en.yml
|
208
|
+
- lib/defra_ruby/validators.rb
|
209
|
+
- lib/defra_ruby/validators/base_validator.rb
|
210
|
+
- lib/defra_ruby/validators/companies_house_number_validator.rb
|
211
|
+
- lib/defra_ruby/validators/companies_house_service.rb
|
212
|
+
- lib/defra_ruby/validators/configuration.rb
|
213
|
+
- lib/defra_ruby/validators/engine.rb
|
214
|
+
- lib/defra_ruby/validators/version.rb
|
208
215
|
- lib/defra_ruby_validators.rb
|
209
|
-
- lib/defra_ruby_validators/companies_house_number_validator.rb
|
210
|
-
- lib/defra_ruby_validators/companies_house_service.rb
|
211
|
-
- lib/defra_ruby_validators/engine.rb
|
212
|
-
- lib/defra_ruby_validators/validators.rb
|
213
|
-
- lib/defra_ruby_validators/version.rb
|
214
216
|
- spec/cassettes/company_no_inactive.yml
|
215
217
|
- spec/cassettes/company_no_not_found.yml
|
216
218
|
- spec/cassettes/company_no_valid.yml
|
217
|
-
- spec/
|
218
|
-
- spec/
|
219
|
-
- spec/
|
219
|
+
- spec/defra_ruby/validators/companies_house_number_validator_spec.rb
|
220
|
+
- spec/defra_ruby/validators/companies_house_service_spec.rb
|
221
|
+
- spec/defra_ruby/validators/configuration_spec.rb
|
222
|
+
- spec/defra_ruby/validators_spec.rb
|
220
223
|
- spec/examples.txt
|
221
224
|
- spec/spec_helper.rb
|
222
225
|
- spec/support/defra_ruby_validators.rb
|
226
|
+
- spec/support/dotenv.rb
|
227
|
+
- spec/support/helpers/translator.rb
|
223
228
|
- spec/support/i18n.rb
|
229
|
+
- spec/support/pry.rb
|
230
|
+
- spec/support/shared_examples/validators/invalid_record.rb
|
231
|
+
- spec/support/shared_examples/validators/valid_record.rb
|
232
|
+
- spec/support/shared_examples/validators/validator.rb
|
233
|
+
- spec/support/simplecov.rb
|
224
234
|
- spec/support/vcr.rb
|
225
235
|
homepage: https://github.com/DEFRA/defra-ruby-validators
|
226
236
|
licenses:
|
@@ -249,13 +259,21 @@ specification_version: 4
|
|
249
259
|
summary: Defra ruby on rails validations
|
250
260
|
test_files:
|
251
261
|
- spec/spec_helper.rb
|
252
|
-
- spec/
|
253
|
-
- spec/
|
254
|
-
- spec/
|
262
|
+
- spec/defra_ruby/validators_spec.rb
|
263
|
+
- spec/defra_ruby/validators/companies_house_service_spec.rb
|
264
|
+
- spec/defra_ruby/validators/configuration_spec.rb
|
265
|
+
- spec/defra_ruby/validators/companies_house_number_validator_spec.rb
|
255
266
|
- spec/examples.txt
|
256
267
|
- spec/cassettes/company_no_not_found.yml
|
257
268
|
- spec/cassettes/company_no_valid.yml
|
258
269
|
- spec/cassettes/company_no_inactive.yml
|
270
|
+
- spec/support/simplecov.rb
|
259
271
|
- spec/support/i18n.rb
|
260
272
|
- spec/support/vcr.rb
|
273
|
+
- spec/support/pry.rb
|
274
|
+
- spec/support/dotenv.rb
|
261
275
|
- spec/support/defra_ruby_validators.rb
|
276
|
+
- spec/support/helpers/translator.rb
|
277
|
+
- spec/support/shared_examples/validators/invalid_record.rb
|
278
|
+
- spec/support/shared_examples/validators/valid_record.rb
|
279
|
+
- spec/support/shared_examples/validators/validator.rb
|
@@ -1,14 +0,0 @@
|
|
1
|
-
en:
|
2
|
-
defra_ruby_validators:
|
3
|
-
companies_house_number:
|
4
|
-
hint: An 8 digit number, or 2 letters followed by a 6 digit number, or 2 letters followed by 5 digits and another letter
|
5
|
-
help:
|
6
|
-
heading: What's a registration number?
|
7
|
-
limitedCompany: This is issued when the company is registered, and can be found on your Certificate of Incorporation and any paperwork from Companies House.
|
8
|
-
limitedLiabilityPartnership: This is issued when the limited liability partnership is registered, and can be found on your Certificate of Incorporation and any paperwork from Companies House.
|
9
|
-
errors:
|
10
|
-
blank: Enter a company registration number
|
11
|
-
invalid: "Enter a valid number - it should have 8 digits, or 2 letters followed by 6 digits, or 2 letters followed by 5 digits and another letter. If your number has only 7 digits, enter it with a zero at the start."
|
12
|
-
not_found: Companies House couldn't find a company with this number
|
13
|
-
inactive: Your company must be registered as an active company
|
14
|
-
error: There was an error connecting with Companies House. Hopefully this is a one off and will work if you try again.
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module DefraRubyValidators
|
4
|
-
class CompaniesHouseNumberValidator < ActiveModel::EachValidator
|
5
|
-
|
6
|
-
# Examples we need to validate are
|
7
|
-
# 10997904, 09764739
|
8
|
-
# SC534714, CE000958
|
9
|
-
# IP00141R, IP27702R, SP02252R
|
10
|
-
# https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/426891/uniformResourceIdentifiersCustomerGuide.pdf
|
11
|
-
VALID_COMPANIES_HOUSE_REGISTRATION_NUMBER_REGEX = Regexp.new(
|
12
|
-
/\A(\d{8,8}$)|([a-zA-Z]{2}\d{6}$)|([a-zA-Z]{2}\d{5}[a-zA-Z]{1}$)\z/i
|
13
|
-
).freeze
|
14
|
-
|
15
|
-
def validate_each(record, attribute, value)
|
16
|
-
return false unless value_is_present?(record, attribute, value)
|
17
|
-
return false unless format_is_valid?(record, attribute, value)
|
18
|
-
|
19
|
-
validate_with_companies_house(record, attribute, value)
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def value_is_present?(record, attribute, value)
|
25
|
-
return true if value.present?
|
26
|
-
|
27
|
-
record.errors[attribute] << error_message("blank")
|
28
|
-
false
|
29
|
-
end
|
30
|
-
|
31
|
-
def format_is_valid?(record, attribute, value)
|
32
|
-
return true if value.match?(VALID_COMPANIES_HOUSE_REGISTRATION_NUMBER_REGEX)
|
33
|
-
|
34
|
-
record.errors[attribute] << error_message("invalid")
|
35
|
-
false
|
36
|
-
end
|
37
|
-
|
38
|
-
def validate_with_companies_house(record, attribute, value)
|
39
|
-
case CompaniesHouseService.new(value).status
|
40
|
-
when :active
|
41
|
-
true
|
42
|
-
when :inactive
|
43
|
-
record.errors[attribute] << error_message("inactive")
|
44
|
-
when :not_found
|
45
|
-
record.errors[attribute] << error_message("not_found")
|
46
|
-
end
|
47
|
-
rescue StandardError
|
48
|
-
record.errors[attribute] << error_message("error")
|
49
|
-
end
|
50
|
-
|
51
|
-
def error_message(error)
|
52
|
-
I18n.t("defra_ruby_validators.companies_house_number.errors.#{error}")
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
56
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "rest-client"
|
4
|
-
|
5
|
-
module DefraRubyValidators
|
6
|
-
class CompaniesHouseService
|
7
|
-
def initialize(company_no)
|
8
|
-
@company_no = company_no
|
9
|
-
@url = "#{DefraRubyValidators.configuration.companies_house_host}#{@company_no}"
|
10
|
-
@api_key = DefraRubyValidators.configuration.companies_house_api_key
|
11
|
-
end
|
12
|
-
|
13
|
-
def status
|
14
|
-
response = RestClient::Request.execute(
|
15
|
-
method: :get,
|
16
|
-
url: @url,
|
17
|
-
user: @api_key,
|
18
|
-
password: ""
|
19
|
-
)
|
20
|
-
|
21
|
-
json = JSON.parse(response)
|
22
|
-
|
23
|
-
status_is_allowed?(json["company_status"]) ? :active : :inactive
|
24
|
-
rescue RestClient::ResourceNotFound
|
25
|
-
:not_found
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def status_is_allowed?(status)
|
31
|
-
%w[active voluntary-arrangement].include?(status)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "defra_ruby_validators/validators"
|
4
|
-
|
5
|
-
module DefraRubyValidators
|
6
|
-
# Engine used to load in the custom validations
|
7
|
-
class Engine < ::Rails::Engine
|
8
|
-
isolate_namespace DefraRubyValidators
|
9
|
-
|
10
|
-
# Add a load path for this specific Engine
|
11
|
-
config.autoload_paths += Dir[File.join(config.root, "lib", "**")]
|
12
|
-
|
13
|
-
# Load I18n translation files from engine before loading ones from the host app
|
14
|
-
# This means values in the host app can override those in the engine
|
15
|
-
config.before_initialize do
|
16
|
-
engine_locales = Dir["#{config.root}/config/locales/**/*.yml"]
|
17
|
-
config.i18n.load_path = engine_locales + config.i18n.load_path
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "active_model"
|
4
|
-
require "defra_ruby_validators/version"
|
5
|
-
require "defra_ruby_validators/companies_house_service"
|
6
|
-
|
7
|
-
require "defra_ruby_validators/companies_house_number_validator"
|
8
|
-
|
9
|
-
module DefraRubyValidators
|
10
|
-
# Enable the ability to configure the gem from its host app, rather than
|
11
|
-
# reading directly from env vars. Derived from
|
12
|
-
# https://robots.thoughtbot.com/mygem-configure-block
|
13
|
-
class << self
|
14
|
-
attr_writer :configuration
|
15
|
-
|
16
|
-
def configuration
|
17
|
-
@configuration ||= Configuration.new
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.configure
|
22
|
-
yield(configuration)
|
23
|
-
end
|
24
|
-
|
25
|
-
class Configuration
|
26
|
-
attr_accessor :companies_house_host, :companies_house_api_key
|
27
|
-
|
28
|
-
def initialize
|
29
|
-
@companies_house_host = "https://api.companieshouse.gov.uk/company/"
|
30
|
-
@companies_house_api_key = nil
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,125 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module DefraRubyValidators
|
4
|
-
RSpec.describe CompaniesHouseNumberValidator do
|
5
|
-
context "when given a valid company number" do
|
6
|
-
before do
|
7
|
-
allow_any_instance_of(CompaniesHouseService).to receive(:status).and_return(:active)
|
8
|
-
end
|
9
|
-
|
10
|
-
%w[10997904 09764739 SC534714 IP00141R].each do |company_no|
|
11
|
-
context "like #{company_no}" do
|
12
|
-
it "confirms the number is valid" do
|
13
|
-
expect(DummyCompaniesHouseNumber.new(company_no)).to be_valid
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
context "when given an invalid company number" do
|
20
|
-
context "because it is blank" do
|
21
|
-
subject { DummyCompaniesHouseNumber.new("") }
|
22
|
-
|
23
|
-
it "confirms the number is not valid" do
|
24
|
-
expect(subject).to_not be_valid
|
25
|
-
end
|
26
|
-
it "adds an error to the subject's errors collection" do
|
27
|
-
subject.valid?
|
28
|
-
expect(subject.errors.count).to eq(1)
|
29
|
-
end
|
30
|
-
it "adds an error with the correct message" do
|
31
|
-
subject.valid?
|
32
|
-
expect(subject.errors[:company_no][0]).to eq(I18n.t("defra_ruby_validators.companies_house_number.errors.blank"))
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
context "because the format is wrong" do
|
37
|
-
subject { DummyCompaniesHouseNumber.new("foobar42") }
|
38
|
-
|
39
|
-
it "confirms the number is not valid" do
|
40
|
-
expect(subject).to_not be_valid
|
41
|
-
end
|
42
|
-
it "adds an error to the subject's errors collection" do
|
43
|
-
subject.valid?
|
44
|
-
expect(subject.errors.count).to eq(1)
|
45
|
-
end
|
46
|
-
it "adds an error with the correct message" do
|
47
|
-
subject.valid?
|
48
|
-
expect(subject.errors[:company_no][0]).to eq(I18n.t("defra_ruby_validators.companies_house_number.errors.invalid"))
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
context "because it's not found on companies house" do
|
53
|
-
before do
|
54
|
-
allow_any_instance_of(CompaniesHouseService).to receive(:status).and_return(:not_found)
|
55
|
-
end
|
56
|
-
|
57
|
-
subject { DummyCompaniesHouseNumber.new("99999999") }
|
58
|
-
|
59
|
-
it "confirms the number is not valid" do
|
60
|
-
expect(subject).to_not be_valid
|
61
|
-
end
|
62
|
-
it "adds an error to the subject's errors collection" do
|
63
|
-
subject.valid?
|
64
|
-
expect(subject.errors.count).to eq(1)
|
65
|
-
end
|
66
|
-
it "adds an error with the correct message" do
|
67
|
-
subject.valid?
|
68
|
-
expect(subject.errors[:company_no][0]).to eq(I18n.t("defra_ruby_validators.companies_house_number.errors.not_found"))
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
context "because it's not 'active' on companies house" do
|
73
|
-
before do
|
74
|
-
allow_any_instance_of(CompaniesHouseService).to receive(:status).and_return(:inactive)
|
75
|
-
end
|
76
|
-
|
77
|
-
subject { DummyCompaniesHouseNumber.new("07281919") }
|
78
|
-
|
79
|
-
it "confirms the number is not valid" do
|
80
|
-
expect(subject).to_not be_valid
|
81
|
-
end
|
82
|
-
it "adds an error to the subject's errors collection" do
|
83
|
-
subject.valid?
|
84
|
-
expect(subject.errors.count).to eq(1)
|
85
|
-
end
|
86
|
-
it "adds an error with the correct message" do
|
87
|
-
subject.valid?
|
88
|
-
expect(subject.errors[:company_no][0]).to eq(I18n.t("defra_ruby_validators.companies_house_number.errors.inactive"))
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
context "when there is an error connecting with companies house" do
|
94
|
-
before do
|
95
|
-
allow_any_instance_of(CompaniesHouseService).to receive(:status).and_raise(StandardError)
|
96
|
-
end
|
97
|
-
|
98
|
-
subject { DummyCompaniesHouseNumber.new("10997904") }
|
99
|
-
|
100
|
-
it "confirms the number is not valid" do
|
101
|
-
expect(subject).to_not be_valid
|
102
|
-
end
|
103
|
-
it "adds an error to the subject's errors collection" do
|
104
|
-
subject.valid?
|
105
|
-
expect(subject.errors.count).to eq(1)
|
106
|
-
end
|
107
|
-
it "adds an error with the correct message" do
|
108
|
-
subject.valid?
|
109
|
-
expect(subject.errors[:company_no][0]).to eq(I18n.t("defra_ruby_validators.companies_house_number.errors.error"))
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
class DummyCompaniesHouseNumber
|
114
|
-
include ActiveModel::Model
|
115
|
-
|
116
|
-
attr_accessor :company_no
|
117
|
-
|
118
|
-
def initialize(company_no)
|
119
|
-
@company_no = company_no
|
120
|
-
end
|
121
|
-
|
122
|
-
validates :company_no, "defra_ruby_validators/companies_house_number": true
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|