venduitz 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6cc6a028fa63bd40f96535d661fc2a8452d96148
4
- data.tar.gz: b583d6e4bf160b0b4b7c705439ef9f43711aed07
3
+ metadata.gz: 384de3930c931de488374367ac00caea085a6b62
4
+ data.tar.gz: a143824344b230d069ec60690c0e121c9af4b485
5
5
  SHA512:
6
- metadata.gz: 96466bc3eb64cc8bdb8b6f3f244168c644c19d617c8db78d0a0f8e9229ee3e5754a9156ea7e6c3574455ed55fe093ed4c0431c6817a412f50fb0acef051afa94
7
- data.tar.gz: ee9aeb8158cb506316a62471ee525f205bdc4b184f65e518268942f524bf368dfc836a9ff5346374b6112f5637d60f2b2bbf1dc0482c0a8c96ae9a15b6c29b52
6
+ metadata.gz: 1ab8cab911841cfcfd7a3a073d068f08b408103df125e87801ed26ef5fcfe40329858d0dae50f5b3bb1cdfa07b9114ea794bf3f3090b8ff04a773c646426732d
7
+ data.tar.gz: 132d6ad295873f43c0807cc0f43c605a4c48d571a74e81740eede1e28edc6606b5c404860be51716d8caa7e7fe37834b529af607b1a94e8ec8bbb4f98f702673
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- venduitz (0.1.0)
4
+ venduitz (0.2.0)
5
5
  multi_json
6
6
  oj
7
7
 
data/README.md CHANGED
@@ -70,6 +70,28 @@ res = SearchView.to_json(search, [:images])
70
70
  [200, {'Content-Type' => 'application/json'}, res]
71
71
  ```
72
72
 
73
+ ### Using Cache
74
+ To use cache you have to define a Driver for the Venduitz:
75
+ ```
76
+ # Defining the CacheDriver
77
+ Venduitz::Cache.driver = CacheDriver
78
+
79
+ # This cache driver must define some methods (specified on the Vendtuiz::Cache module)
80
+
81
+ # As common, generate your view but with some differences
82
+ # `true` in this case will enable the cache
83
+ res = SearchView.to_json(search, [:images], true)
84
+
85
+ # To use a 'partial views' the method #generate also supports cache
86
+ class CachedView < ProductView
87
+ prop :cover, -> (product) { ImageView.generate(product.cover, [], true) }
88
+ end
89
+
90
+ # To pass the expiration time to your driver just use a fourth argument
91
+ # to define the driver call options
92
+ res = SearchView.to_json(search, [:images], true, { expire_in: 10.minutes })
93
+ ```
94
+
73
95
  ## Development
74
96
  * Building the docker container: `docker build -t venduitz .`
75
97
  * Running the tests:
@@ -0,0 +1,84 @@
1
+ #
2
+ module Venduitz
3
+ # Module responsible for creating an interface
4
+ # for the different cache storages
5
+ module Cache
6
+ # Static methods
7
+ class << self
8
+ #
9
+ attr_accessor :digestor, :driver, :namespace
10
+
11
+ # Before use it you have to specify the driver used by
12
+ # this module. The driver must define the following
13
+ # methods:
14
+ # - exist?(key)
15
+ # - get(key)
16
+ # - set(key, value, options)
17
+ # - clear(options)
18
+
19
+ # Digest
20
+ def digest(object)
21
+ # The dumped data
22
+ dump = Marshal::dump(object)
23
+
24
+ # Check if the digestor is empty
25
+ digestor = Digest::MD5 if digestor.nil?
26
+
27
+ # Digest it
28
+ digestor.hexdigest dump
29
+ end
30
+
31
+ # Check if the key exists
32
+ def exist?(key)
33
+ _driver.exist?(key)
34
+ end
35
+
36
+ # Get the key
37
+ def get(key)
38
+ # Using the driver itself
39
+ _driver.get(key)
40
+ end
41
+
42
+ # Set the cache
43
+ # @param {Any} key The key used on the cache
44
+ # @param {Boolean} dump If is necessary to dump the Key
45
+ # @param {Any} value The value of the cache
46
+ def set(key, value, dump = true, options = {})
47
+ #
48
+ key = digest(key) if dump
49
+
50
+ # If the driver has any namespace method or fixed value
51
+ key = "#{namespace}/#{key}" if namespace?
52
+
53
+ #
54
+ _driver.set(key, value, options)
55
+ end
56
+
57
+ # Clear the full cache
58
+ # @param {Hash} opts Options to use while clear the cache
59
+ def clear(opts = nil)
60
+ _driver.clear(opts)
61
+ end
62
+
63
+ # Check if there is namespace
64
+ def namespace?
65
+ !@namespace.nil?
66
+ end
67
+
68
+ # Get the namespace
69
+ def namespace
70
+ @namespace.respond_to(:call) ? @namespace.call : @namespace
71
+ end
72
+
73
+ private
74
+
75
+ def _driver
76
+ # Check if the driver was defined
77
+ throw 'You have to define your cache driver before start using it' if driver.nil?
78
+
79
+ # Return the driver
80
+ driver
81
+ end
82
+ end
83
+ end
84
+ end
@@ -2,6 +2,6 @@
2
2
  module Venduitz
3
3
  # Gem version
4
4
  def self.version
5
- '0.2.0'.freeze
5
+ '0.3.0'.freeze
6
6
  end
7
7
  end
data/lib/venduitz/view.rb CHANGED
@@ -37,8 +37,16 @@ module Venduitz
37
37
  # for the specific argument
38
38
  # @param {Object} obj This must contain the declared properies and collections
39
39
  # @param {Array} excluded This array contain the keys that will not be added to the result
40
+ # @param {Boolean} cache This flag indicates if cache will be performed
41
+ # @param {Hash} cache_options Cache options
40
42
  # @return {Hash} JSON ready hash containing the specified view fields
41
- def generate(obj, excluded = [])
43
+ def generate(obj, excluded = [], cache = false, cache_options = {})
44
+ # Generate the cache key if cache is enabled
45
+ key = cache_key(obj, excluded, :generate) if cache
46
+
47
+ # Cache?
48
+ return Cache.get(key) if cache && Cache.exist?(key)
49
+
42
50
  # Reset the values to prevent errors
43
51
  @props = {} if @props.nil?
44
52
  @collects = {} if @collects.nil?
@@ -60,17 +68,47 @@ module Venduitz
60
68
  [collect, values.map {|val| info[:view].generate(val, info[:excluded]) }]
61
69
  end
62
70
 
63
- # Return the full hash
64
- Hash[props].merge(Hash[coll])
71
+ # Full hash
72
+ result = Hash[props].merge(Hash[coll])
73
+
74
+ # Check if cache has to be created
75
+ Cache.set(key, result, cache_options) if cache
76
+
77
+ # Return the result
78
+ result
65
79
  end
66
80
 
67
81
  # Parse it
68
82
  # @param {Object} obj This must contain the declared properies and collections
69
83
  # @param {Array} excluded This array contain the keys that will not be added to the result
84
+ # @param {Boolean} cache This flag indicates if cache will be performed
85
+ # @param {Hash} cache_options Cache options
70
86
  # @return {Hash} The JSON string itself
71
- def to_json(obj, excluded = [])
87
+ def to_json(obj, excluded = [], cache = false, cache_options = {})
88
+ # Generate the cache key if cache is enabled
89
+ key = cache_key(obj, excluded, :json) if cache
90
+
91
+ # Cache?
92
+ return Cache.get(key) if cache && Cache.exist?(key)
93
+
72
94
  # Transform the result into json
73
- MultiJson.dump generate(obj, excluded)
95
+ result = MultiJson.dump generate(obj, excluded)
96
+
97
+ # Cache must be performed?
98
+ Cache.set(key, result, cache_options) if cache
99
+
100
+ # Return the result
101
+ result
102
+ end
103
+
104
+ #
105
+ private
106
+
107
+ # Generate the cache key
108
+ # CACHE
109
+ # Key: "{object}/{excluded}/{type}"
110
+ def cache_key(obj, excluded, type)
111
+ "#{Cache.digest(obj)}/#{Cache.digest(excluded)}/#{type.to_s}"
74
112
  end
75
113
  end
76
114
  end
data/lib/venduitz.rb CHANGED
@@ -5,6 +5,8 @@ end
5
5
  # Dependencies
6
6
  require 'oj'
7
7
  require 'multi_json'
8
+ require 'digest/md5'
8
9
 
9
10
  # Core
11
+ require 'venduitz/cache'
10
12
  require 'venduitz/view'
@@ -0,0 +1,95 @@
1
+ # Include the helper
2
+ require 'spec_helper'
3
+
4
+ # Define a simple cache driver
5
+ class CacheDriver
6
+ # Define the storage
7
+ attr_reader :storage
8
+
9
+ # Init!
10
+ def initialize
11
+ # Initialize the storage
12
+ @storage = {}
13
+ end
14
+
15
+ #
16
+ def exist?(key)
17
+ @storage.key?(key)
18
+ end
19
+
20
+ #
21
+ def set(key, value, options = {})
22
+ @storage[key] = value
23
+ end
24
+
25
+ #
26
+ def get(key)
27
+ @storage[key]
28
+ end
29
+
30
+ #
31
+ def clear(options = nil)
32
+ @storage = {}
33
+ end
34
+ end
35
+
36
+ # Cache object tes
37
+ class CacheSample < SubSample
38
+ #
39
+ attr_reader :other
40
+
41
+ # Init!
42
+ def initialize(time)
43
+ @other = time
44
+ end
45
+ end
46
+
47
+ # Set the driver to the Venduitz
48
+ Venduitz::Cache.driver = CacheDriver.new
49
+
50
+ #
51
+ describe Venduitz::Cache do
52
+ #
53
+ before(:each) do
54
+ # Clear the cache
55
+ Venduitz::Cache.clear
56
+ end
57
+
58
+ #
59
+ it 'should set/get a cache withoud digest' do
60
+ # Set the cache (withoud digest)
61
+ Venduitz::Cache.set 'hello', 'here', false
62
+
63
+ # Assertions
64
+ expect(Venduitz::Cache.exist?('hello')).to eq(true)
65
+ expect(Venduitz::Cache.get('hello')).to eq('here')
66
+ end
67
+
68
+ #
69
+ it 'should set/get a cache withoud digest' do
70
+ # Set the cache (withoud digest)
71
+ Venduitz::Cache.set 'hello', 'here'
72
+
73
+ # Get the digested key
74
+ key = Venduitz::Cache.digest 'hello'
75
+
76
+ # Get it
77
+ expect(Venduitz::Cache.get(key)).to eq('here')
78
+ end
79
+
80
+ #
81
+ it 'should generate a view with cache' do
82
+ # Get the time now and save it
83
+ time = Time.now
84
+
85
+ # Gen the JSON
86
+ res = [SubSampleView.to_json(CacheSample.new(time), [], true)]
87
+
88
+ # Generate it again
89
+ res += [SubSampleView.to_json(CacheSample.new(time), [], true)]
90
+
91
+ # Check Cache entries
92
+ expect(Venduitz::Cache.driver.storage.keys.size).to eq(1)
93
+ expect(Venduitz::Cache.get(Venduitz::Cache.driver.storage.keys[0])).to eq(res[0])
94
+ end
95
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: venduitz
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabriel Corado
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-11 00:00:00.000000000 Z
11
+ date: 2016-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json
@@ -65,10 +65,12 @@ files:
65
65
  - Gemfile.lock
66
66
  - README.md
67
67
  - lib/venduitz.rb
68
+ - lib/venduitz/cache.rb
68
69
  - lib/venduitz/grape.rb
69
70
  - lib/venduitz/version.rb
70
71
  - lib/venduitz/view.rb
71
72
  - spec/spec_helper.rb
73
+ - spec/venduitz/cache_spec.rb
72
74
  - spec/venduitz/grape_spec.rb
73
75
  - spec/venduitz/view_spec.rb
74
76
  - venduitz.gemspec