README.md in kredis-0.1.2 vs README.md in kredis-0.2.0
- old
+ new
@@ -1,12 +1,95 @@
# Kredis
-Keyed Redis encapsulates higher-level data structures around a single key, so you can interact with them as coherent objects rather than isolated procedural commands.
+Kredis (Keyed Redis) encapsulates higher-level types and data structures around a single key, so you can interact with them as coherent objects rather than isolated procedural commands. These higher-level structures can be configured as attributes within Active Models and Active Records using a declarative DSL.
+Kredis is configured using env-aware yaml files, using `Rails.application.config_for`, so you can locate the data structures on separate redis instances, if you've reached a scale where a single shared instance is no longer sufficient.
-## Development
+Kredis provides namespacing support for keys such that you can safely run parallel testing against the data structures without different tests trampling each others data.
-...
+
+## Examples
+
+Kredis provides typed scalars for strings, integers, decimals, floats, booleans, datetimes, and json hashes:
+
+```ruby
+string = Kredis.string "mystring"
+string.value = "hello world!" # => SET mystring "hello world"
+"hello world!" == string.value # => GET mystring
+
+integer = Kredis.string "myinteger"
+integer.value = 5 # => SET myinteger "5"
+5 == string.value # => GET myinteger
+
+json = Kredis.json "myjson"
+integer.value = { "one" => 1, "two" => "2" } # => SET myjson "{\"one\":1,\"two\":\"2\"}"
+{ "one" => 1, "two" => "2" } == string.value # => GET myjson
+```
+
+There are data structures for counters, enums, flags, lists, uniqe lists, sets, and slots:
+
+```ruby
+list = Kredis.list "mylist", typed: :integer
+list.append([ 1, 2, 3 ]) # => LPUSH mylist "1" "2" "3"
+list << 4 # => LPUSH mylist "4"
+[ 1, 2, 3, 4 ] == list.elements # LRANGE 0 -1
+
+set = Kredis.set "myset", typed: :datetime
+set.add(DateTime.tomorrow, DateTime.yesterday) # => SADD myset "2021-02-03 00:00:00 +0100" "2021-02-01 00:00:00 +0100"
+set << DateTime.tomorrow # => SADD myset "2021-02-03 00:00:00 +0100"
+2 == set.size # => SCARD myset
+[ DateTime.tomorrow, DateTime.yesterday ] == set.elements # => SMEMBERS myset
+
+counter = Kredis.counter "mycounter", expires_in: 15.minutes
+counter.increment by: 2 # => SETEX "mycounter" 900 0 + INCR "mycounter" 2
+2 == counter.value # => GET "mycounter"
+travel 16.minutes
+0 == counter.value # => GET "mycounter"
+```
+
+You can use all these structures in models:
+
+```ruby
+class Person < ApplicationRecord
+ kredis_list :names
+ kredis_list :names_with_custom_key, key: ->(p) { "person:#{p.id}:names_customized" }
+ kredis_unique_list :skills, limit: 2
+ kredis_enum :morning, values: %w[ bright blue black ], default: "bright"
+end
+
+person = Person.find(5)
+person.names.append "David", "Heinemeier", "Hansson" # => SADD person:5:names "David" "Heinemeier" "Hansson"
+true == person.morning.bright?
+person.morning.value = "blue"
+true == person.morning.blue?
+```
+
+
+## Installation
+
+1. Add the `kredis` gem to your Gemfile: `gem 'kredis'`
+2. Run `./bin/bundle install`
+3. Add a default configuration under `config/redis/shared.yml`
+
+A default configuration can look like this for `config/redis/shared.yml`:
+
+```yaml
+production: &production
+ host: <%= ENV.fetch("REDIS_SHARED_HOST", "127.0.0.1") %>
+ port: <%= ENV.fetch("REDIS_SHARED_PORT", "6379") %>
+ timeout: 1
+
+development: &development
+ host: <%= ENV.fetch("REDIS_SHARED_HOST", "127.0.0.1") %>
+ port: <%= ENV.fetch("REDIS_SHARED_PORT", "6379") %>
+ timeout: 1
+
+test:
+ <<: *development
+```
+
+Additional configurations can be added under `config/redis/*.yml` and referenced when a type is created.
+
## License
Kredis is released under the [MIT License](https://opensource.org/licenses/MIT).