README.md in smart_kv-0.1.3 vs README.md in smart_kv-0.1.4
- old
+ new
@@ -1,40 +1,81 @@
# SmartKv
[![Build Status](https://travis-ci.org/styd/smart_kv.svg?branch=master)](https://travis-ci.org/styd/smart_kv)
+[![Coverage Status](https://coveralls.io/repos/github/styd/smart_kv/badge.svg?branch=master)](https://coveralls.io/github/styd/smart_kv?branch=master)
+[![Gem Version](https://badge.fury.io/rb/smart_kv.svg)](https://rubygems.org/gems/smart_kv)
-Best practice of writing configurations by strictly allowing and requiring keys.
+Best practice of writing options or configurations by strictly allowing and requiring keys.
-It doesn't have to be a configuration.
+It doesn't have to be options or configurations.
You can use it for strict request body or other use cases too.
-## Installation
+## Background
-Add this line to your application's Gemfile:
+Have you ever used ruby options like this:
```ruby
-gem 'smart_kv'
+# this example is for rails
+d = DateTime.now
+e = d.change(hour: 1, minute: 5)
```
-And then execute:
+and then move on with your life.. until you realize that the code doesn't behave as you expected it to behave.
+But why? Everything looks fine, right? Yes, it does look fine.. but it's not fine.
- $ bundle
+So, what's the problem?
+The problem was the option key `:minute` was not recognized.
+Eh? :confused:
+Why didn't it tell me if it was not recognized?
-## Usage
+I wish that too.
+But `Hash` has a default value of `nil` if key is not found (same thing applies to `OpenStruct`) - so, it will not raise error -
+and most developers won't bother checking each options' key made by the users of the library or method.
+If only the source of the `DateTime#change` method starts like this:
+
```ruby
+# this class can be defined on its own file
+class ChangeOptions < SmartKv
+ optional :nsec, :usec, :year, :month, :day, :hour, :min, :sec, :offset, :start
+end
+
+class DateTime
+...
+ def change(options)
+ options = ChangeOptions.new(options)
+ ...
+ end
+end
+```
+
+So, when you do this `d.change(hour: 1, minute: 5)`, it will yell:
+
+```
+NotImplementedError: unrecognized key(s): `:minute' in ChangeOptions
+```
+
+Well, this is better. But, how do you know all the right options?
+Type: `ChangeOptions.optional_keys` and `ChangeOptions.required_keys`.
+
+
+## More Usage Example
+
+```ruby
class Config < SmartKv
required :some_key, :second_key
optional :an_option
end
Config.new({some_key: "val"})
```
This will complain that you're not using the `:second key`.
-Guess what the `optional` do!
+If you add another key that is not recognized, it will complain too.
+If there is a key that you don't always use but want it to be recognized, mark it as `optional`.
+
### Inheritable
```ruby
class ChildConfig < Config
required :first_key
@@ -43,10 +84,11 @@
ChildConfig.new({first_key: "val", second_key: "val 2"})
```
This will also complain that you're not using the `:some_key`.
+
### Directly callable
Whatever given as input is callable directly.
```ruby
@@ -55,10 +97,11 @@
c2 = Config.new(OpenStruct.new({some_key: "val", second_key: "val 2"}))
c2.second_key
```
+
### Override callable object
You can change the callable object to any class that accepts hash as input of its new class method.
```ruby
@@ -69,37 +112,55 @@
c = Convertable.new({abcd: 123})
c.abcd #=> 123
```
-### Not using it for config
-You can choose not to use it for config. Maybe for strict request body keys?
+### Not using it for options or configs?
+You can choose not to use it for options or configs. Maybe for strict request body keys?
+
```ruby
class PostBody < SmartKv
required :app_key, :secret_key
end
.
.
request.set_form_data(PostBody.new({app_key: "abc", secret_key: "def"}))
```
+
+## Installation
+
+Add this line to your application's Gemfile:
+
+```ruby
+gem 'smart_kv'
+```
+
+And then execute:
+
+ $ bundle
+
+
## Coming Soon
-- [ ] Make it serializable
- [X] Convertable from hash (as input) to OpenStruct (the resulting object) or another object and vice versa
-- [ ] Accept config file (e.g. `json`, `yaml`, etc.) or file path as input
+- [ ] Suggests corrections for unrecognized keys using DidYouMean (and maybe change the spell checking threshold?)
- [ ] Support nested/deep key value object as input
- [ ] Make some nested keys from the same parent key required and some others optional
+- [ ] Accept config file (e.g. `json`, `yaml`, etc.) or file path as input
+
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/styd/smart_kv. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
+
## License
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
+
## Code of Conduct
Everyone interacting in the SmartKv project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/styd/smart_kv/blob/master/CODE_OF_CONDUCT.md).