freckle_io 0.1.2 → 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.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -5
  3. data/freckle-io.gemspec +3 -3
  4. data/lib/freckle_io/client/entries.rb +1 -26
  5. data/lib/freckle_io/client/project_groups.rb +0 -2
  6. data/lib/freckle_io/client/projects.rb +1 -13
  7. data/lib/freckle_io/client/tags.rb +1 -6
  8. data/lib/freckle_io/client/users.rb +1 -6
  9. data/lib/freckle_io/configuration.rb +5 -5
  10. data/lib/freckle_io/connection.rb +1 -3
  11. data/lib/freckle_io/params.rb +5 -10
  12. data/lib/freckle_io/request/multiple_pages.rb +3 -3
  13. data/lib/freckle_io/request/single_page.rb +2 -2
  14. data/lib/freckle_io/validator/base_contract.rb +16 -0
  15. data/lib/freckle_io/validator/entry.rb +26 -50
  16. data/lib/freckle_io/validator/project.rb +13 -39
  17. data/lib/freckle_io/validator/project_group.rb +5 -24
  18. data/lib/freckle_io/validator/tag.rb +5 -24
  19. data/lib/freckle_io/validator/user.rb +13 -37
  20. data/lib/freckle_io/validator/validation.yml +8 -13
  21. data/lib/freckle_io.rb +1 -1
  22. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Entries/with_configuration/_all/result_must_be_a_Request_MultiplePages.yml +23 -18
  23. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Entries/with_configuration/_all/returns_a_entry_for_each_response.yml +23 -18
  24. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Entries/with_configuration/with_unknow_params/doesn_t_raise_a_invalid_params_error.yml +53 -0
  25. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Entries/with_configuration/with_valid_params/params_should_be_valid.yml +22 -17
  26. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Entries/with_configuration/with_validator/call_entry_s_validator.yml +24 -19
  27. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_ProjectGroups/with_configuration/_all/result_must_be_a_Request_MultiplePages.yml +261 -35
  28. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_ProjectGroups/with_configuration/_all/returns_a_project_group_for_each_response.yml +262 -36
  29. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_ProjectGroups/with_configuration/with_unknow_params/doesn_t_raises_a_invalid_params_error.yml +325 -0
  30. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_ProjectGroups/with_configuration/with_valid_params/params_should_be_valid.yml +22 -17
  31. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_ProjectGroups/with_configuration/with_validator/call_project_group_s_validator.yml +261 -35
  32. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Projects/with_configuration/_all/result_must_be_a_Request_MultiplePages.yml +501 -225
  33. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Projects/with_configuration/_all/returns_a_project_for_each_response.yml +501 -225
  34. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Projects/with_configuration/_show/get_a_spacific_project.yml +24 -19
  35. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Projects/with_configuration/_show/raw_links_should_be_a_empty_array.yml +24 -19
  36. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Projects/with_configuration/with_unknow_params/doesn_t_raises_a_invalid_params_error.yml +865 -0
  37. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Projects/with_configuration/with_valid_params/params_should_be_valid.yml +22 -17
  38. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Projects/with_configuration/with_validator/call_project_s_validator.yml +502 -226
  39. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Tags/with_configuration/_all/result_must_be_a_Request_MultiplePages.yml +23 -18
  40. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Tags/with_configuration/_all/returns_a_tag_for_each_response.yml +23 -18
  41. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Tags/with_configuration/with_unknow_params/doesn_t_raise_a_invalid_params_error.yml +53 -0
  42. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Tags/with_configuration/with_valid_params/params_should_be_valid.yml +22 -17
  43. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Tags/with_configuration/with_validator/call_tag_s_validator.yml +23 -18
  44. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Users/with_configuration/_all/result_must_be_a_Request_MultiplePages.yml +45 -35
  45. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Users/with_configuration/_all/returns_a_user_for_each_response.yml +45 -35
  46. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Users/with_configuration/with_unknow_params/doesn_t_raise_a_invalid_params_error.yml +109 -0
  47. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Users/with_configuration/with_valid_params/params_should_be_valid.yml +22 -17
  48. data/spec/fixtures/vcr_cassettes/FreckleIO_Client_Users/with_configuration/with_validator/call_user_s_validator.yml +45 -35
  49. data/spec/fixtures/vcr_cassettes/FreckleIO_Connection/with_default_configuration/with_a_valid_response/must_be_a_json_format.yml +23 -18
  50. data/spec/fixtures/vcr_cassettes/FreckleIO_Connection/with_default_configuration/with_freckle_token_authentication/set_X-FreckleToken.yml +23 -18
  51. data/spec/fixtures/vcr_cassettes/FreckleIO_Connection/with_default_configuration/with_header/set_user_agent.yml +23 -18
  52. data/spec/fixtures/vcr_cassettes/FreckleIO_Connection/with_default_configuration/with_invalid_url/raises_a_resource_not_found_error_for_invalid_resource.yml +13 -16
  53. data/spec/fixtures/vcr_cassettes/FreckleIO_Connection/with_default_configuration/with_page_param/response_must_be_success.yml +23 -18
  54. data/spec/fixtures/vcr_cassettes/FreckleIO_Connection/with_default_configuration/with_per_page_param/response_must_have_per_page_elements.yml +24 -19
  55. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_MultiplePages/with_configuration/_get/returns_an_array_of_faraday_response.yml +45 -35
  56. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_MultiplePages/with_configuration/_get/returns_freckle_default_per_page_elements.yml +45 -35
  57. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_MultiplePages/with_per_page/_get/return_per_page_number_elements.yml +74 -59
  58. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_SinglePage/with_configuration/_first/next_page_should_be_a_SinglePage.yml +45 -35
  59. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_SinglePage/with_configuration/_first/prev_page_should_be_nil.yml +23 -18
  60. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_SinglePage/with_configuration/_first/when_get_last_page_from_the_first_page/next_should_be_nil.yml +45 -35
  61. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_SinglePage/with_configuration/_get/returns_correct_raw_links_for_the_first_page.yml +23 -18
  62. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_SinglePage/with_configuration/_last/next_page_should_be_nil.yml +45 -35
  63. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_SinglePage/with_configuration/_last/returns_correct_raw_links_for_the_last_page.yml +45 -35
  64. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_SinglePage/with_configuration/_last/when_get_prev_page_from_the_last_page/prev_should_be_nil.yml +67 -52
  65. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_SinglePage/with_configuration/_next/previous_page_is_a_SinglePage.yml +67 -52
  66. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_SinglePage/with_configuration/_next/previous_page_should_be_not_nil.yml +67 -52
  67. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_SinglePage/with_configuration/_prev/next_page_is_a_SinglePage.yml +89 -69
  68. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_SinglePage/with_configuration/_prev/when_get_prev_page_from_the_first_page/prev_should_be_nil.yml +67 -52
  69. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_SinglePage/with_configuration/_total_page/with_first_page/returns_the_range_of_pages.yml +23 -18
  70. data/spec/fixtures/vcr_cassettes/FreckleIO_Request_SinglePage/with_configuration/_total_page/with_next_page/returns_an_empty_array.yml +45 -35
  71. data/spec/freckle_io/client/entries_spec.rb +23 -32
  72. data/spec/freckle_io/client/project_groups_spec.rb +11 -20
  73. data/spec/freckle_io/client/projects_spec.rb +15 -21
  74. data/spec/freckle_io/client/tags_spec.rb +10 -19
  75. data/spec/freckle_io/client/users_spec.rb +13 -21
  76. data/spec/freckle_io/configuration_spec.rb +7 -4
  77. data/spec/freckle_io/connection_spec.rb +1 -1
  78. data/spec/freckle_io/paginator_spec.rb +8 -8
  79. data/spec/freckle_io/params_spec.rb +1 -1
  80. data/spec/freckle_io/request/single_page_spec.rb +6 -6
  81. data/spec/spec_helper.rb +3 -3
  82. data/spec/support/anonymize/entries.rb +9 -8
  83. data/spec/support/anonymize/project_groups.rb +4 -3
  84. data/spec/support/anonymize/projects.rb +9 -8
  85. data/spec/support/anonymize/tags.rb +5 -4
  86. data/spec/support/anonymize/users.rb +13 -15
  87. data/spec/support/anonymize_interaction.rb +5 -5
  88. metadata +29 -24
  89. data/lib/freckle_io/validator/restricted_hash.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a8668807fc7ddae6e3b31d3a9feae5c4ce1b9b70b9da2e96ddf0a9bacd6c7be4
4
- data.tar.gz: f741041a353ca470a71f4d9b5c99c5448f4ddb9007d42a973fbe5d9b52a57bb2
3
+ metadata.gz: '09c8ed65bf1bde96bbb41d1a60ec5efff20fb078663921277acddd6db61604fd'
4
+ data.tar.gz: a8c0b02dd374c6c479a0e22b491ae9e4b9c00dae960cacf23968fcee2ec954e5
5
5
  SHA512:
6
- metadata.gz: a3d87112c10bf120fff3646a2989c73e4f64a1192b3a764375175a29107aea3755dda70ee93037eabf311c76d2eee66997edd078c70ba3bd426769fba94074ea
7
- data.tar.gz: 7946955398144b5ba346a3c82a7a4019e7b8d302c9b6a2f18d425e90975e15a149fe1564fa63d0d5e7b49c980252b233d746f8b8032d52e41bfa3ee902a740c9
6
+ metadata.gz: 5952aed31584850de9eb2164797d03dde8369a0d2a8204b635a7f17c49a29f0295693cfcc4733a4a76f9415b4fef72119e79ba3f6a7d0f70f05038c9446574bc
7
+ data.tar.gz: 5f8e1266dffb1b5c179e736a11f174fd69fed1f6f3632ac31e452f869b50fae1e1e1d7871ba07cebc7b0764280a5b66951fab68d3bbd5c616bca3f8c795d82c6
data/.rubocop.yml CHANGED
@@ -1,7 +1,8 @@
1
1
  require: rubocop-rspec
2
2
 
3
3
  AllCops:
4
- TargetRubyVersion: 2.3
4
+ TargetRubyVersion: 2.7
5
+ NewCops: enable
5
6
  Exclude:
6
7
  - "bin/**/*"
7
8
  - ".bundle/**/*"
@@ -10,15 +11,18 @@ AllCops:
10
11
  - "node_modules/**/*"
11
12
  - "**/*.gemspec"
12
13
 
13
- Layout/AlignParameters:
14
+ Layout/ParameterAlignment:
14
15
  EnforcedStyle: with_fixed_indentation
15
16
  Layout/DotPosition:
16
17
  EnforcedStyle: trailing
17
18
  Layout/SpaceInsideHashLiteralBraces:
18
19
  EnforcedStyle: no_space
20
+ Layout/LineLength:
21
+ Enabled: true
22
+ Max: 80
19
23
 
20
24
  Metrics/BlockLength:
21
- ExcludedMethods:
25
+ AllowedPatterns:
22
26
  - context
23
27
  - describe
24
28
  - feature
@@ -28,8 +32,6 @@ Metrics/BlockLength:
28
32
  - namespace
29
33
  - draw
30
34
 
31
- Style/ClassAndModuleChildren:
32
- EnforcedStyle: compact
33
35
  Style/Documentation:
34
36
  Enabled: false
35
37
  Style/FrozenStringLiteralComment:
data/freckle-io.gemspec CHANGED
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = "freckle_io"
6
- spec.version = "0.1.2"
6
+ spec.version = "1.0.0"
7
7
  spec.authors = ["Domenico Giuseppe Garofoli"]
8
8
  spec.email = ["sirion1987@gmail.com"]
9
9
 
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.license = "MIT"
14
14
  spec.require_path = ["lib"]
15
15
 
16
- spec.required_ruby_version = '>= 2.4.0'
16
+ spec.required_ruby_version = '>= 2.7.0'
17
17
 
18
18
  spec.files = `git ls-files -z`.split("\x0")
19
19
  spec.test_files = Dir["spec/**/*.rb"]
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency "webmock"
31
31
 
32
32
  spec.add_runtime_dependency "dotenv"
33
- spec.add_runtime_dependency "dry-validation", "0.13.0"
33
+ spec.add_runtime_dependency "dry-validation", "~> 1.9.0"
34
34
  spec.add_runtime_dependency "faraday", ">= 0.15.2"
35
35
  spec.add_runtime_dependency "faraday_middleware", ">= 0.12"
36
36
  spec.add_runtime_dependency "typhoeus"
@@ -2,27 +2,6 @@ module FreckleIO
2
2
  module Client
3
3
  class Entries
4
4
  ENTRY_ENDPOINT = "/v2/entries".freeze
5
- ALLOWED_KEYS = %i(
6
- user_ids
7
- description
8
- project_ids
9
- tag_ids
10
- tag_filter_type
11
- invoice_ids
12
- import_ids
13
- from
14
- to
15
- invoiced
16
- invoiced_at_from
17
- invoiced_at_to
18
- updated_from
19
- updated_to
20
- billable
21
- approved_at_from
22
- approved_at_to
23
- approved_by_ids
24
- per_page
25
- ).freeze
26
5
  VALIDATOR_MODULE = "FreckleIO::Validator::Entry".freeze
27
6
 
28
7
  def all(params = {})
@@ -42,11 +21,7 @@ module FreckleIO
42
21
  end
43
22
 
44
23
  def entry_params(params)
45
- @entry_params = Params.new(
46
- params,
47
- ALLOWED_KEYS,
48
- VALIDATOR_MODULE
49
- ).call
24
+ @entry_params = Params.new(params, VALIDATOR_MODULE).call
50
25
  end
51
26
  end
52
27
  end
@@ -2,7 +2,6 @@ module FreckleIO
2
2
  module Client
3
3
  class ProjectGroups
4
4
  PROJECT_GROUPS_ENDPOINT = "/v2/project_groups".freeze
5
- ALLOWED_KEYS = %i(name project_ids per_page).freeze
6
5
  VALIDATOR_MODULE = "FreckleIO::Validator::ProjectGroup".freeze
7
6
 
8
7
  def all(params = {})
@@ -27,7 +26,6 @@ module FreckleIO
27
26
  def project_groups_params(params)
28
27
  @project_groups_params = Params.new(
29
28
  params,
30
- ALLOWED_KEYS,
31
29
  VALIDATOR_MODULE
32
30
  ).call
33
31
  end
@@ -2,14 +2,6 @@ module FreckleIO
2
2
  module Client
3
3
  class Projects
4
4
  PROJECT_ENDPOINT = "/v2/projects".freeze
5
- ALLOWED_KEYS = %i(
6
- name
7
- project_group_ids
8
- billing_increment
9
- enabled
10
- billable
11
- per_page
12
- ).freeze
13
5
  VALIDATOR_MODULE = "FreckleIO::Validator::Project".freeze
14
6
 
15
7
  def all(params = {})
@@ -31,11 +23,7 @@ module FreckleIO
31
23
  end
32
24
 
33
25
  def project_params(params)
34
- @project_params = Params.new(
35
- params,
36
- ALLOWED_KEYS,
37
- VALIDATOR_MODULE
38
- ).call
26
+ @project_params = Params.new(params, VALIDATOR_MODULE).call
39
27
  end
40
28
  end
41
29
  end
@@ -2,7 +2,6 @@ module FreckleIO
2
2
  module Client
3
3
  class Tags
4
4
  TAG_ENDPOINT = "/v2/tags".freeze
5
- ALLOWED_KEYS = %i(name billable per_page).freeze
6
5
  VALIDATOR_MODULE = "FreckleIO::Validator::Tag".freeze
7
6
 
8
7
  def all(params = {})
@@ -22,11 +21,7 @@ module FreckleIO
22
21
  end
23
22
 
24
23
  def tag_params(params)
25
- @tag_params = Params.new(
26
- params,
27
- ALLOWED_KEYS,
28
- VALIDATOR_MODULE
29
- ).call
24
+ @tag_params = Params.new(params, VALIDATOR_MODULE).call
30
25
  end
31
26
  end
32
27
  end
@@ -2,7 +2,6 @@ module FreckleIO
2
2
  module Client
3
3
  class Users
4
4
  USER_ENDPOINT = "/v2/users".freeze
5
- ALLOWED_KEYS = %i(name email role state per_page).freeze
6
5
  VALIDATOR_MODULE = "FreckleIO::Validator::User".freeze
7
6
 
8
7
  def all(params = {})
@@ -24,11 +23,7 @@ module FreckleIO
24
23
  end
25
24
 
26
25
  def user_params(params)
27
- @user_params = Params.new(
28
- params,
29
- ALLOWED_KEYS,
30
- VALIDATOR_MODULE
31
- ).call
26
+ @user_params = Params.new(params, VALIDATOR_MODULE).call
32
27
  end
33
28
  end
34
29
  end
@@ -6,11 +6,11 @@ module FreckleIO
6
6
 
7
7
  DEFAULT_URL = "https://api.nokotime.com/v2".freeze
8
8
 
9
- attr_writer :auth_type
10
- attr_writer :token
11
- attr_writer :url
12
- attr_writer :per_page
13
- attr_writer :max_concurrency
9
+ attr_writer :auth_type,
10
+ :token,
11
+ :url,
12
+ :per_page,
13
+ :max_concurrency
14
14
 
15
15
  def initialize
16
16
  @token = nil
@@ -8,13 +8,11 @@ module FreckleIO
8
8
 
9
9
  # rubocop:disable Metrics/MethodLength
10
10
  def get(path, params: {}, request_options: {})
11
- response = connection.get do |request|
11
+ connection.get do |request|
12
12
  authorize_request(request)
13
13
  set_request_options(request, request_options)
14
14
  request.url path, params
15
15
  end
16
-
17
- response
18
16
  rescue Faraday::ConnectionFailed => e
19
17
  raise Errors::Connection::Failed.new(e), e.message
20
18
  rescue Faraday::ResourceNotFound => e
@@ -1,21 +1,18 @@
1
1
  module FreckleIO
2
2
  class Params
3
- attr_reader :params
4
- attr_reader :allowed_keys
5
- attr_reader :validator_module
3
+ attr_reader :params,
4
+ :validator_module
6
5
 
7
6
  def initialize(
8
7
  params,
9
- allowed_keys,
10
8
  validator_module
11
9
  )
12
10
  @params = params
13
- @allowed_keys = allowed_keys
14
11
  @validator_module = validator_module
15
12
  end
16
13
 
17
14
  def call
18
- return validator.output if valid?
15
+ return validator.to_h if valid?
19
16
 
20
17
  raise Errors::Params::InvalidParams.new, validator_messages
21
18
  end
@@ -27,7 +24,7 @@ module FreckleIO
27
24
  end
28
25
 
29
26
  def validator
30
- @validator ||= which_validator_module.validation(params, allowed_keys)
27
+ @validator ||= which_validator_module.new.call(params)
31
28
  end
32
29
 
33
30
  def which_validator_module
@@ -37,9 +34,7 @@ module FreckleIO
37
34
  end
38
35
 
39
36
  def validator_messages
40
- messages = validator.messages(full: true)
41
- return messages.values.join(",") if messages.is_a?(Hash)
42
-
37
+ messages = validator.errors(full: true).messages
43
38
  messages.join(",")
44
39
  end
45
40
  end
@@ -3,9 +3,9 @@ require "faraday_middleware"
3
3
  module FreckleIO
4
4
  module Request
5
5
  class MultiplePages
6
- attr_reader :path
7
- attr_reader :params
8
- attr_reader :last_responses
6
+ attr_reader :path,
7
+ :params,
8
+ :last_responses
9
9
 
10
10
  def get(path, params: {})
11
11
  @path ||= path
@@ -3,8 +3,8 @@ require "freckle_io/paginator"
3
3
  module FreckleIO
4
4
  module Request
5
5
  class SinglePage
6
- attr_reader :last_response
7
- attr_reader :raw_links
6
+ attr_reader :last_response,
7
+ :raw_links
8
8
 
9
9
  def initialize
10
10
  @last_response = nil
@@ -0,0 +1,16 @@
1
+ module FreckleIO
2
+ module Validator
3
+ class BaseContract < Dry::Validation::Contract
4
+ EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i.freeze
5
+
6
+ config.messages.backend = :i18n
7
+ config.messages.load_paths << File.join(__dir__, "validation.yml")
8
+
9
+ register_macro(:email_format) do
10
+ if !value.nil? && !EMAIL_REGEX.match?(value)
11
+ key.failure(:invalid_email_format)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,57 +1,33 @@
1
1
  module FreckleIO
2
2
  module Validator
3
- module Entry
4
- # rubocop:disable Metrics/MethodLength,
5
- # rubocop:disable Metrics/AbcSize,
6
- # rubocop:disable Lint/NestedMethodDefinition
7
- # rubocop:disable Metrics/BlockLength,
8
- def self.validation(params, valid_keys)
9
- Dry::Validation.Schema do
10
- configure do
11
- config.messages_file = File.join(
12
- __dir__, "validation.yml"
13
- )
14
- config.namespace = :entry
15
-
16
- predicates(RestrictedHash)
17
-
18
- option :allowed_keys
19
-
20
- def valid_tag_filter_type
21
- ["and", "combination of"]
22
- end
23
- end
3
+ class Entry < FreckleIO::Validator::BaseContract
4
+ schema do
5
+ optional(:user_ids).filled(:string)
6
+ optional(:description).filled(:string)
7
+ optional(:project_ids).filled(:string)
8
+ optional(:tag_ids).filled(:string)
9
+ optional(:tag_filter_type).filled(:string)
10
+ optional(:invoice_ids).filled(:string)
11
+ optional(:import_ids).filled(:string)
12
+ optional(:from).filled(:string)
13
+ optional(:to).filled(:string)
14
+ optional(:invoiced).filled(:bool)
15
+ optional(:invoiced_at_from).filled(:string)
16
+ optional(:invoiced_at_to).filled(:string)
17
+ optional(:updated_from).filled(:string)
18
+ optional(:updated_to).filled(:string)
19
+ optional(:billable).filled(:bool)
20
+ optional(:approved_at_from).filled(:string)
21
+ optional(:approved_at_to).filled(:string)
22
+ optional(:approved_by_ids).filled(:string)
23
+ optional(:per_page).filled(:integer)
24
+ end
24
25
 
25
- restricted_hash?(allowed_keys) do
26
- optional(:user_ids).filled :str?
27
- optional(:description).filled :str?
28
- optional(:project_ids).filled :str?
29
- optional(:tag_ids).filled :str?
30
- optional(:tag_filter_type).filled :str?
31
- optional(
32
- :tag_filter_type
33
- ).value(included_in?: valid_tag_filter_type)
34
- optional(:invoice_ids).filled :str?
35
- optional(:import_ids).filled :str?
36
- optional(:from).filled :str?
37
- optional(:to).filled :str?
38
- optional(:invoiced).filled :bool?
39
- optional(:invoiced_at_from).filled :str?
40
- optional(:invoiced_at_to).filled :str?
41
- optional(:updated_from).filled :str?
42
- optional(:updated_to).filled :str?
43
- optional(:billable).filled :bool?
44
- optional(:approved_at_from).filled :str?
45
- optional(:approved_at_to).filled :str?
46
- optional(:approved_by_ids).filled :str?
47
- optional(:per_page).filled :int?
48
- end
49
- end.with(allowed_keys: valid_keys).call(params)
26
+ rule(:tag_filter_type) do
27
+ if !value.nil? && !["and", "combination of"].include?(value)
28
+ key.failure(:invalid_tag_filter_type)
29
+ end
50
30
  end
51
- # rubocop:enable Metrics/MethodLength,
52
- # rubocop:enable Metrics/AbcSize,
53
- # rubocop:enable Lint/NestedMethodDefinition
54
- # rubocop:enable Metrics/BlockLength,
55
31
  end
56
32
  end
57
33
  end
@@ -1,46 +1,20 @@
1
1
  module FreckleIO
2
2
  module Validator
3
- module Project
4
- # rubocop:disable Metrics/MethodLength,
5
- # rubocop:disable Metrics/AbcSize,
6
- # rubocop:disable Lint/NestedMethodDefinition
7
- def self.validation(params, valid_keys)
8
- Dry::Validation.Schema do
9
- configure do
10
- config.messages_file = File.join(
11
- __dir__, "validation.yml"
12
- )
13
- config.namespace = :project
14
-
15
- predicates(RestrictedHash)
16
-
17
- option :allowed_keys
18
-
19
- def valid_increment
20
- %w(1 5 6 10 15)
21
- end
22
-
23
- def valid_increment?(_options, values)
24
- values.split(",").all? do |value|
25
- valid_increment.include?(value)
26
- end
27
- end
28
- end
3
+ class Project < FreckleIO::Validator::BaseContract
4
+ schema do
5
+ optional(:name).filled(:string)
6
+ optional(:project_group_ids).filled(:string)
7
+ optional(:billing_increment).filled(:string)
8
+ optional(:enabled).filled(:bool)
9
+ optional(:billable).filled(:bool)
10
+ optional(:per_page).filled(:integer)
11
+ end
29
12
 
30
- restricted_hash?(allowed_keys) do
31
- optional(:name).filled :str?
32
- optional(:project_group_ids).filled :str?
33
- optional(:billing_increment).filled :str?
34
- optional(:billing_increment).filled(valid_increment?: {})
35
- optional(:enabled).filled :bool?
36
- optional(:billable).filled :bool?
37
- optional(:per_page).filled :int?
38
- end
39
- end.with(allowed_keys: valid_keys).call(params)
13
+ rule(:billing_increment) do
14
+ if !value.nil? && !%w(1 5 6 10 15).include?(value)
15
+ key.failure(:invalid_billing_increment)
16
+ end
40
17
  end
41
- # rubocop:enable Metrics/MethodLength,
42
- # rubocop:enable Metrics/AbcSize,
43
- # rubocop:enable Lint/NestedMethodDefinition
44
18
  end
45
19
  end
46
20
  end
@@ -1,30 +1,11 @@
1
1
  module FreckleIO
2
2
  module Validator
3
- module ProjectGroup
4
- # rubocop:disable Metrics/MethodLength,
5
- # rubocop:disable Metrics/AbcSize,
6
- def self.validation(params, valid_keys)
7
- Dry::Validation.Schema do
8
- configure do
9
- config.messages_file = File.join(
10
- __dir__, "validation.yml"
11
- )
12
- config.namespace = :project_group
13
-
14
- predicates(RestrictedHash)
15
-
16
- option :allowed_keys
17
- end
18
-
19
- restricted_hash?(allowed_keys) do
20
- optional(:name).filled :str?
21
- optional(:project_ids).filled :str?
22
- optional(:per_page).filled :int?
23
- end
24
- end.with(allowed_keys: valid_keys).call(params)
3
+ class ProjectGroup < FreckleIO::Validator::BaseContract
4
+ schema do
5
+ optional(:name).filled(:string)
6
+ optional(:project_ids).filled(:string)
7
+ optional(:per_page).filled(:integer)
25
8
  end
26
- # rubocop:enable Metrics/MethodLength,
27
- # rubocop:enable Metrics/AbcSize,
28
9
  end
29
10
  end
30
11
  end
@@ -1,30 +1,11 @@
1
1
  module FreckleIO
2
2
  module Validator
3
- module Tag
4
- # rubocop:disable Metrics/MethodLength,
5
- # rubocop:disable Metrics/AbcSize,
6
- def self.validation(params, valid_keys)
7
- Dry::Validation.Schema do
8
- configure do
9
- config.messages_file = File.join(
10
- __dir__, "validation.yml"
11
- )
12
- config.namespace = :tag
13
-
14
- predicates(RestrictedHash)
15
-
16
- option :allowed_keys
17
- end
18
-
19
- restricted_hash?(allowed_keys) do
20
- optional(:name).filled :str?
21
- optional(:billable).filled :bool?
22
- optional(:per_page).filled :int?
23
- end
24
- end.with(allowed_keys: valid_keys).call(params)
3
+ class Tag < FreckleIO::Validator::BaseContract
4
+ schema do
5
+ optional(:name).filled(:string)
6
+ optional(:billable).filled(:bool)
7
+ optional(:per_page).filled(:integer)
25
8
  end
26
- # rubocop:enable Metrics/MethodLength,
27
- # rubocop:enable Metrics/AbcSize,
28
9
  end
29
10
  end
30
11
  end
@@ -1,43 +1,19 @@
1
1
  module FreckleIO
2
2
  module Validator
3
- module User
4
- # rubocop:disable Metrics/MethodLength,
5
- # rubocop:disable Metrics/AbcSize,
6
- # rubocop:disable Lint/NestedMethodDefinition
7
- def self.validation(params, valid_keys)
8
- Dry::Validation.Schema do
9
- configure do
10
- config.messages_file = File.join(
11
- __dir__, "validation.yml"
12
- )
13
- config.namespace = :user
14
-
15
- predicates(RestrictedHash)
16
-
17
- option :allowed_keys
18
-
19
- def valid_roles
20
- %w(supervisor leader coworker contractor)
21
- end
22
-
23
- def valid_states
24
- %w(disabled pending active suspended)
25
- end
26
- end
27
-
28
- restricted_hash?(allowed_keys) do
29
- optional(:name).filled :str?
30
- optional(:email).filled :str?
31
- optional(:email).value(format?: /\A[^@\s]+@[^@\s]+\z/)
32
- optional(:role).value(included_in?: valid_roles)
33
- optional(:state).value(included_in?: valid_states)
34
- optional(:per_page).filled :int?
35
- end
36
- end.with(allowed_keys: valid_keys).call(params)
3
+ class User < FreckleIO::Validator::BaseContract
4
+ schema do
5
+ optional(:name).filled(:string)
6
+ optional(:email).filled(:string)
7
+ optional(:per_page).filled(:integer)
8
+ optional(:role).value(
9
+ included_in?: %w(supervisor leader coworker contractor)
10
+ )
11
+ optional(:state).value(
12
+ included_in?: %w(disabled pending active suspended)
13
+ )
37
14
  end
38
- # rubocop:enable Metrics/MethodLength,
39
- # rubocop:enable Metrics/AbcSize,
40
- # rubocop:enable Lint/NestedMethodDefinition
15
+
16
+ rule(:email).validate(:email_format)
41
17
  end
42
18
  end
43
19
  end
@@ -1,14 +1,9 @@
1
1
  en:
2
- errors:
3
- rules:
4
- user:
5
- restricted_hash?: "has unknown keys. Allowed keys are: name, email, role, state and per_page"
6
- project:
7
- restricted_hash?: "has unknown keys. Allowed keys are: name, project_group_ids, billing_increment, enabled, billable and per_page"
8
- valid_increment?: "has invalid values. Allowed values are: 1, 5, 6, 10, 15"
9
- entry:
10
- restricted_hash?: "has unknown keys. Allowed keys are: user_ids, description, project_ids, tag_ids, tag_filter_type, invoice_ids, import_ids, from, to, invoiced, invoice_at_from, invoice_at_to, updated_from, updated_to, billable, approved_at_from, approved_at_to, approved_by_ids and per_page"
11
- tag:
12
- restricted_hash?: "has unknown keys. Allowed keys are: name, billable and per_page"
13
- project_group:
14
- restricted_hash?: "has unknown keys. Allowed keys are: name, project ids and per_page"
2
+ dry_validation:
3
+ errors:
4
+ invalid_email_format: "not a valid email format"
5
+ rules:
6
+ billing_increment:
7
+ invalid_billing_increment: "has invalid values. Allowed values are: 1, 5, 6, 10, 15"
8
+ tag_filter_type:
9
+ invalid_tag_filter_type: "has invalid values. Allowed values are: and, combination of"
data/lib/freckle_io.rb CHANGED
@@ -8,7 +8,7 @@ require "freckle_io/errors/connection"
8
8
  require "freckle_io/errors/params"
9
9
  require "freckle_io/request/multiple_pages"
10
10
  require "freckle_io/request/single_page"
11
- require "freckle_io/validator/restricted_hash"
11
+ require "freckle_io/validator/base_contract"
12
12
  require "freckle_io/validator/user"
13
13
  require "freckle_io/validator/project"
14
14
  require "freckle_io/validator/entry"