microservice_dsl 0.2.3 → 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: f8a8ae1f8d70c4ea1091b3905c57fd921d9f0bbb
4
- data.tar.gz: 9a2c7de4b3e85ba3e35ed5ec4a96f9538817744b
3
+ metadata.gz: 8a2bf369380148747520edd76b31a7c2b0432636
4
+ data.tar.gz: aa81d1d988315d09114519949fae3e1ef87be783
5
5
  SHA512:
6
- metadata.gz: 4274ec10d2ce6c0bd8abebfc5b185654bcb83e9e03a1342ade08d1085d3a2b366e59afc9be8276d28db0265c237e8f2e74319ace87355b760c2d9f547bd1bb29
7
- data.tar.gz: b77bf817b794a1035ca6a106d88f6e8857c83aa51ffba5ac31b2d79c4f3756808683cdb1993a28434c47114018b037b08310d4117b8ecd5e776ec732a36fae33
6
+ metadata.gz: 6c57fa06ad3810d1d3c69909477e38015062dd3147a88bb16a586be82666aae314a77114d7dbbf5ad8a8044b4b4ce0e06fa948cbf1b219345a151b662f07e653
7
+ data.tar.gz: adf413de93464447b9fa80d287536819e4710f48552fdbd8906b1cd6e3cbf17e179ca5af3d62c0310c0f9b5827657535d9c184cb4c86470ddf9c1ce8c59547a8
@@ -1,3 +1,3 @@
1
1
  module MicroserviceDSL
2
- VERSION = "0.2.3"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -1,5 +1,8 @@
1
1
  require "microservice_dsl/version"
2
2
  require "typhoeus"
3
+ require "json"
4
+ require "digest"
5
+ require "redis"
3
6
 
4
7
  module Kernel
5
8
  private
@@ -10,7 +13,29 @@ module Kernel
10
13
  url = ENV["#{microservice.upcase}_URL"] || "http://#{microservice}.#{ENV['MS_DOMAIN'] || Rails.env}:#{ENV["MS_#{microservice.upcase}_PORT"] || '3000'}"
11
14
  url << "/#{args[:path]}" if args[:path]
12
15
  body = (args[:body].is_a? String) ? args[:body] : args[:body].to_json if args[:body]
13
- Typhoeus::Request.new(url, method: args[:method] || :get, headers: MicroserviceDSL.default_headers.merge(args[:headers] || {}).merge({MicroserviceDSL.hop_header => MicroserviceDSL.hop_string}), body: body, params: args[:params], timeout: ENV['MS_DEFAULT_TIMEOUT'] || 10)
16
+ headers = MicroserviceDSL.default_headers.merge(args[:headers] || {}).merge({MicroserviceDSL.hop_header => MicroserviceDSL.hop_string})
17
+ method = args[:method] || :get
18
+ req = Typhoeus::Request.new(url, method: method, headers: headers, body: body, params: args[:params], timeout: ENV['MS_DEFAULT_TIMEOUT'] || 10)
19
+
20
+ if method.to_s.downcase == "get"
21
+ req.on_complete do |res|
22
+ if res.code == 200 && etag = res.headers["etag"]
23
+ MicroserviceDSL.set_cache(url, etag, res)
24
+ end
25
+ end
26
+ if cached = MicroserviceDSL.get_cache(url, req)
27
+ req.options[:headers]["If-None-Match"] = cached[:etag]
28
+ req.on_complete do |res|
29
+ if res.code == 304
30
+ res.options[:response_body] = cached[:response][:body]
31
+ res.options[:response_code] = cached[:response][:code]
32
+ res.options[:headers] = Typhoeus::Response::Header.new(cached[:response][:headers])
33
+ end
34
+ end
35
+ end
36
+
37
+ end
38
+ req
14
39
  end
15
40
 
16
41
  def call_microservice(microservice, args={})
@@ -21,6 +46,83 @@ module Kernel
21
46
  end
22
47
 
23
48
  module MicroserviceDSL
49
+ def self.redis_reset!
50
+ @@redis=nil
51
+ end
52
+
53
+ def self.redis
54
+ return nil unless caching?
55
+ splitted = ENV["MS_CACHE_URL"].split(":")
56
+ host = splitted[0]
57
+ port = splitted[1] || "6379"
58
+ @@redis ||= Redis.new(host: host, port: port)
59
+ end
60
+
61
+ def self.caching?
62
+ if ENV["MS_CACHE_URL"]
63
+ return true
64
+ else
65
+ return false
66
+ end
67
+ end
68
+
69
+ def self.set_cache(url, etag, res)
70
+ return nil unless caching?
71
+ puts "Etag: #{etag}"
72
+ data = {
73
+ etag: etag,
74
+ response: {
75
+ body: res.body,
76
+ code: res.code,
77
+ headers: res.headers
78
+ }
79
+ }
80
+ puts data
81
+ redis.set([redis_hash_name, cache_key(url, res.request)].join(':'), JSON.dump(data))
82
+ end
83
+
84
+ def self.cache_key(url, req)
85
+ @@taggers ||= nil
86
+ url = url.gsub(":", "|")
87
+ unless @@taggers
88
+ url
89
+ else
90
+ @@taggers.map {|t| Digest::MD5.hexdigest(req.options[:headers][t])}.join("/") + "-" + url
91
+ end
92
+ end
93
+
94
+ def self.get_etag(url, req)
95
+ return nil unless caching?
96
+ if val = get_cache(url, req)
97
+ val[:etag]
98
+ else
99
+ nil
100
+ end
101
+ end
102
+
103
+ def self.has_cache?(url, etag, req)
104
+ return nil unless caching?
105
+ (stored_etag = get_etag(url, req)) && (stored_etag == etag) && stored_etag
106
+ end
107
+
108
+ def self.get_cache(url, req)
109
+ return nil unless caching?
110
+ if val = redis.get([redis_hash_name, cache_key(url, req)].join(':'))
111
+ JSON.parse(val, symbolize_names: true)
112
+ else
113
+ nil
114
+ end
115
+ end
116
+
117
+ def self.redis_hash_name
118
+ ENV["MS_CACHE_HASH"] || "msdsl"
119
+ end
120
+
121
+ def self.cache_taggers=(taggers)
122
+ raise unless taggers.is_a?(Array)
123
+ @@taggers = taggers
124
+ end
125
+
24
126
  def self.hop_header
25
127
  "X-Hop-Count"
26
128
  end
@@ -58,6 +160,17 @@ module MicroserviceDSL
58
160
  def self.hop_string
59
161
  [self.current_hop, self.next_hop].join(".")
60
162
  end
163
+
164
+ def self.hashable_string_for(obj)
165
+ case obj
166
+ when Hash
167
+ hashable_string_for(obj.sort_by {|sub_obj| sub_obj.first.to_s})
168
+ when Array
169
+ obj.map {|sub_obj| hashable_string_for(sub_obj)}.to_s
170
+ else
171
+ obj.to_s
172
+ end
173
+ end
61
174
  end
62
175
 
63
176
  require "microservice_dsl/railtie" if defined?(Rails)
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "typhoeus", "~> 1.1"
22
+ spec.add_dependency "redis"
22
23
 
23
24
  spec.add_development_dependency "bundler", "~> 1.12"
24
25
  spec.add_development_dependency "rake", "~> 10.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: microservice_dsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vincenzo Ferrara
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-02-06 00:00:00.000000000 Z
11
+ date: 2017-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: typhoeus
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: redis
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement