smart_kv 0.2.7 → 0.2.8.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a40cd8eb22b67d869043b25fd77f73700f21c40dd0302cfc6d59d436fd89027f
4
- data.tar.gz: faca0c5c75a0437de06f2e8a7eddd64097578b49187a46f0aecc4abfcf350c26
3
+ metadata.gz: 2afa3abc6fd5ba511ca89207c137cdb000db8951a9ee102f60436eddc7c93e1f
4
+ data.tar.gz: b8afd1a1fc115af8bccd6ce4b78396eb38beb83f245ed1716e9d80dc25284ba8
5
5
  SHA512:
6
- metadata.gz: d4c7ee93525e01eb972ded20303bdb252897c009fbb6e0901d16e26481a7d859e8884b6f6cb44b51ea5569bb4ef8709cbfff05d1aaefbf2f188a1a898fd07bb2
7
- data.tar.gz: 0fb4bce5f669b7afb31b5430e6aeb69b768b1e5acce875a9249976162c11a716490893aea011a669259344684a8730f06695474724877bc702681c52d0db545b
6
+ metadata.gz: 76915e48518766aece378cfb2c9bb293f5a8001055b3606f7c415a49571ec2c27efb063a8c8d546c589927050a008b1d3bc96b576016731e34ceaeca7fdf1198
7
+ data.tar.gz: f5e2f791d15a128d681a302ad6f49b2bf7b37a876eaa8fcf51b2170d33899ef386c4946a13627d1c74ba301f67851c23cf34be139f41cfbff6b658c60baba769
data/README.md CHANGED
@@ -41,7 +41,7 @@ So, when you do this `d.change(hour: 1, minute: 5)`, it will yell:
41
41
  KeyError: unrecognized key: :minute in ChangeOptions
42
42
  ```
43
43
 
44
- Well, this is better. But, how do you know all the right options?
44
+ That's better. But, how do you know all the right options?
45
45
  Type: `ChangeOptions.keys`
46
46
 
47
47
 
@@ -102,6 +102,23 @@ c.abcd #=> 123
102
102
  ```
103
103
 
104
104
 
105
+ ### Get suggestions
106
+
107
+ When you make typo when writing a key of an options, you can get suggestions.
108
+
109
+ ```ruby
110
+ class LanguageScore < SmartKv
111
+ required :ruby
112
+ optional :rust, :kotlin, :elixir
113
+ end
114
+
115
+ LanguageScore.check({ruby: 100, korting: 90})
116
+
117
+ # SmartKv::KeyError: unrecognized key: :korting in LanguageScore.
118
+ # Did you mean? :kotlin
119
+ ```
120
+
121
+
105
122
  ### Not using it for options or configs?
106
123
 
107
124
  You can choose not to use it for options or configs. Maybe for strict request body keys?
@@ -115,6 +132,11 @@ end
115
132
  request.set_form_data(PostBody.check({app_key: "abc", secret_key: "def"}))
116
133
  ```
117
134
 
135
+ ### Alternative
136
+
137
+ One close alternative that is quite similar in objective is probably
138
+ [dry-schema](https://github.com/dry-rb/dry-schema).
139
+
118
140
 
119
141
  ## Installation
120
142
 
data/lib/smart_kv.rb CHANGED
@@ -1,11 +1,11 @@
1
1
  require_relative "smart_kv/version"
2
- require_relative "smart_kv/check"
3
- require_relative "smart_kv/meat"
2
+ require_relative "smart_kv/helper"
3
+ require_relative "smart_kv/core"
4
4
 
5
5
  class SmartKv
6
- if Check.has_did_you_mean_key_error?
6
+ if Helper.has_did_you_mean_key_error?
7
7
  require_relative "smart_kv/did_you_mean"
8
8
  end
9
9
 
10
- extend Meat
10
+ extend Core
11
11
  end
@@ -1,10 +1,9 @@
1
+ require 'set'
1
2
  require_relative "errors"
2
- require_relative "convert"
3
+ require_relative "helper"
3
4
 
4
- module SmartKv::Meat
5
- # The meat of the gem
6
-
7
- include SmartKv::Convert
5
+ module SmartKv::Core
6
+ include SmartKv::Helper
8
7
 
9
8
  def required(*args)
10
9
  init_required
@@ -19,7 +18,7 @@ module SmartKv::Meat
19
18
  end
20
19
 
21
20
  def init_required
22
- @required ||= superclass == SmartKv ? Set.new : superclass.required.dup
21
+ @required ||= superclass == SmartKv ? ::Set.new : superclass.required.dup
23
22
  end
24
23
 
25
24
  def optional(*args)
@@ -35,33 +34,31 @@ module SmartKv::Meat
35
34
  end
36
35
 
37
36
  def init_optional
38
- @optional ||= superclass == SmartKv ? Set.new : superclass.optional.dup
37
+ @optional ||= superclass == SmartKv ? ::Set.new : superclass.optional.dup
39
38
  end
40
39
 
41
40
  def keys
42
- Array(@required) + Array(@optional)
41
+ init_required; init_optional
42
+ @required + @optional
43
43
  end
44
44
 
45
45
  def check(kv={})
46
- prevent_direct_instantiation
46
+ prevent_direct_usage
47
47
 
48
48
  object_class = callable_class || kv.class
49
49
  kv = kv.dup
50
50
 
51
- unless SmartKv::Check.production?
52
- required_keys = Array(@required)
53
- optional_keys = Array(@optional)
54
-
51
+ unless SmartKv::Helper.production?
55
52
  hash = kv.to_h
56
53
  missing_keys = required_keys - hash.keys
57
54
  unless missing_keys.empty?
58
55
  raise SmartKv::KeyError, "missing required key(s): #{missing_keys.map{|k| k.to_sym.inspect }.join(', ')} in #{self.class}"
59
56
  end
60
57
 
61
- unrecognized_keys = hash.keys - required_keys - optional_keys
58
+ unrecognized_keys = hash.keys - keys.to_a
62
59
  unless unrecognized_keys.empty?
63
60
  key = unrecognized_keys.first
64
- raise SmartKv::KeyError.new("unrecognized key: #{key.inspect} for #{self}.", key: key, receiver: (keys - hash.keys).map {|k| [k, nil] }.to_h)
61
+ raise SmartKv::KeyError.new("unrecognized key: #{key.inspect} in #{self}.", key: key, receiver: (keys - hash.keys).map {|k| [k, nil] }.to_h)
65
62
  end
66
63
  end
67
64
 
@@ -79,9 +76,9 @@ module SmartKv::Meat
79
76
 
80
77
  private
81
78
 
82
- def prevent_direct_instantiation
79
+ def prevent_direct_usage
83
80
  if self == SmartKv
84
- raise SmartKv::CheckError, "only subclass of SmartKv is meant to be used".freeze
81
+ raise SmartKv::DirectUsageError, "only subclass of SmartKv is meant to be used".freeze
85
82
  end
86
83
  end
87
84
  end
@@ -1,5 +1,5 @@
1
1
  class SmartKv
2
- CheckError = Class.new(StandardError)
2
+ DirectUsageError = Class.new(StandardError)
3
3
 
4
4
  class KeyError < ::KeyError
5
5
  attr_reader :key, :receiver
@@ -1,4 +1,4 @@
1
- module SmartKv::Convert
1
+ module SmartKv::Helper
2
2
  def to_callable_object(object_class, kv)
3
3
  if object_class == Struct
4
4
  Struct.new(*kv.to_h.keys).new(*kv.to_h.values)
@@ -10,4 +10,14 @@ module SmartKv::Convert
10
10
  object_class.new(kv.to_h)
11
11
  end
12
12
  end
13
+
14
+ module_function
15
+
16
+ def has_did_you_mean_key_error?
17
+ defined?(DidYouMean::KeyErrorChecker)
18
+ end
19
+
20
+ def production?
21
+ (ENV['RAILS_ENV'] || ENV['RACK_ENV']) == "production"
22
+ end
13
23
  end
@@ -1,3 +1,3 @@
1
1
  class SmartKv
2
- VERSION = "0.2.7"
2
+ VERSION = "0.2.8.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_kv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.2.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adrian Setyadi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-03-18 00:00:00.000000000 Z
11
+ date: 2020-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -127,11 +127,10 @@ files:
127
127
  - bin/console
128
128
  - bin/setup
129
129
  - lib/smart_kv.rb
130
- - lib/smart_kv/check.rb
131
- - lib/smart_kv/convert.rb
130
+ - lib/smart_kv/core.rb
132
131
  - lib/smart_kv/did_you_mean.rb
133
132
  - lib/smart_kv/errors.rb
134
- - lib/smart_kv/meat.rb
133
+ - lib/smart_kv/helper.rb
135
134
  - lib/smart_kv/version.rb
136
135
  - smart_kv.gemspec
137
136
  homepage: https://github.com/styd/smart_kv
@@ -153,8 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
152
  - !ruby/object:Gem::Version
154
153
  version: '0'
155
154
  requirements: []
156
- rubyforge_project:
157
- rubygems_version: 2.7.6
155
+ rubygems_version: 3.1.2
158
156
  signing_key:
159
157
  specification_version: 4
160
158
  summary: Smart checks for your options or configurations.
@@ -1,11 +0,0 @@
1
- module SmartKv::Check
2
- def has_did_you_mean_key_error?
3
- defined?(DidYouMean::KeyErrorChecker)
4
- end
5
- module_function :has_did_you_mean_key_error?
6
-
7
- def production?
8
- (ENV['RAILS_ENV'] || ENV['RACK_ENV']) == "production"
9
- end
10
- module_function :production?
11
- end