blix-rest 0.1.30
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +25 -0
- data/README.md +457 -0
- data/lib/blix/rest.rb +145 -0
- data/lib/blix/rest/controller.rb +512 -0
- data/lib/blix/rest/cucumber.rb +8 -0
- data/lib/blix/rest/cucumber/hooks.rb +5 -0
- data/lib/blix/rest/cucumber/request_steps.rb +207 -0
- data/lib/blix/rest/cucumber/resource_steps.rb +28 -0
- data/lib/blix/rest/cucumber/world.rb +273 -0
- data/lib/blix/rest/format.rb +15 -0
- data/lib/blix/rest/format_parser.rb +167 -0
- data/lib/blix/rest/handlebars_assets_fix.rb +10 -0
- data/lib/blix/rest/request_mapper.rb +332 -0
- data/lib/blix/rest/resource_cache.rb +50 -0
- data/lib/blix/rest/response.rb +26 -0
- data/lib/blix/rest/server.rb +208 -0
- data/lib/blix/rest/string_hash.rb +100 -0
- data/lib/blix/rest/version.rb +5 -0
- data/lib/blix/utils.rb +2 -0
- data/lib/blix/utils/misc.rb +62 -0
- data/lib/blix/utils/redis_store.rb +173 -0
- data/lib/blix/utils/yaml_config.rb +74 -0
- metadata +126 -0
@@ -0,0 +1,173 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'redis'
|
4
|
+
# require 'msgpack'
|
5
|
+
|
6
|
+
#
|
7
|
+
# options:
|
8
|
+
# :expire_secs - how long store should save data.
|
9
|
+
# :reset_expire_on_get - start the expire timer again on read.
|
10
|
+
|
11
|
+
module Blix
|
12
|
+
class RedisStore
|
13
|
+
|
14
|
+
attr_reader :_opts, :_prefix
|
15
|
+
|
16
|
+
STORE_PREFIX = 'session'
|
17
|
+
|
18
|
+
def initialize(opts = {})
|
19
|
+
@_opts = ::Blix::Rest::StringHash.new
|
20
|
+
@_opts[:prefix] = STORE_PREFIX
|
21
|
+
@_opts.merge!(opts)
|
22
|
+
@_prefix = _opts[:prefix]
|
23
|
+
end
|
24
|
+
|
25
|
+
#-----------------------------------------------------------------------------
|
26
|
+
|
27
|
+
# retrieve raw data and reset the expire time.
|
28
|
+
def get_data(id)
|
29
|
+
k = _key(id)
|
30
|
+
data = redis.get(k)
|
31
|
+
redis.expire(k, _opts[:expire_secs]) if data && _opts[:reset_expire_on_get] && _opts.key?(:expire_secs)
|
32
|
+
data
|
33
|
+
end
|
34
|
+
|
35
|
+
# store raw data
|
36
|
+
def store_data(id, data)
|
37
|
+
params = {}
|
38
|
+
params[:ex] = _opts[:expire_secs] if _opts.key?(:expire_secs)
|
39
|
+
redis.set(_key(id), data, params)
|
40
|
+
data
|
41
|
+
end
|
42
|
+
|
43
|
+
# delete a record from the store
|
44
|
+
def delete_data(id)
|
45
|
+
redis.del(_key(id))
|
46
|
+
end
|
47
|
+
|
48
|
+
# if decoding does not succeed then delete the data
|
49
|
+
# and return nil.
|
50
|
+
def get_hash(id)
|
51
|
+
str = get_data(id)
|
52
|
+
str && begin
|
53
|
+
_decode(str)
|
54
|
+
rescue Exception =>e
|
55
|
+
delete_data(id)
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def store_hash(id,hash)
|
61
|
+
store_data(id, _encode(hash || {}))
|
62
|
+
hash
|
63
|
+
end
|
64
|
+
|
65
|
+
# retrieve a session hash.
|
66
|
+
def get_session(id,opts={})
|
67
|
+
str = redis.get(_key(id))
|
68
|
+
opts = ::Blix::Rest::StringHash.new.merge(opts)
|
69
|
+
hash = begin
|
70
|
+
str && ::Blix::Rest::StringHash.new(_decode(str))
|
71
|
+
rescue
|
72
|
+
redis.del(_key(id))
|
73
|
+
hash = nil
|
74
|
+
end
|
75
|
+
if hash && (min_time = get_expiry_time(opts)) && (hash['_last_access'] < min_time)
|
76
|
+
delete_session(id)
|
77
|
+
raise SessionExpiredError
|
78
|
+
end
|
79
|
+
raise SessionExpiredError if !hash && opts[:nocreate]
|
80
|
+
|
81
|
+
hash ||= ::Blix::Rest::StringHash.new
|
82
|
+
hash['_last_access'] = Time.now
|
83
|
+
hash
|
84
|
+
end
|
85
|
+
|
86
|
+
# store a session hash
|
87
|
+
def store_session(id, hash)
|
88
|
+
params = {}
|
89
|
+
params[:ex] = _opts[:expire_secs] if _opts.key?(:expire_secs)
|
90
|
+
hash ||= {}
|
91
|
+
hash['_last_access'] = Time.now
|
92
|
+
redis.set(_key(id), _encode(hash), params)
|
93
|
+
hash
|
94
|
+
end
|
95
|
+
|
96
|
+
# delete a seession from the store
|
97
|
+
def delete_session(id)
|
98
|
+
redis.del(_key(id))
|
99
|
+
end
|
100
|
+
|
101
|
+
def _key(name)
|
102
|
+
_prefix + name
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
#-----------------------------------------------------------------------------
|
108
|
+
|
109
|
+
# remove all sessions from the store
|
110
|
+
def reset(name=nil)
|
111
|
+
keys = _all_keys(name)
|
112
|
+
redis.del(*keys) unless keys.empty?
|
113
|
+
end
|
114
|
+
|
115
|
+
def _all_keys(name=nil)
|
116
|
+
redis.keys("#{_prefix}#{name}*") || []
|
117
|
+
end
|
118
|
+
|
119
|
+
# the redis session store
|
120
|
+
def redis
|
121
|
+
@redis ||= begin
|
122
|
+
r = Redis.new
|
123
|
+
begin
|
124
|
+
r.ping
|
125
|
+
rescue Exception => e
|
126
|
+
Blix::Rest.logger.error "cannot reach redis server:#{e}"
|
127
|
+
raise
|
128
|
+
end
|
129
|
+
r
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# the number of sessions in the store
|
134
|
+
def length
|
135
|
+
_all_keys.length
|
136
|
+
end
|
137
|
+
|
138
|
+
# delete expired sessions from the store. this should be handled
|
139
|
+
# automatically by redis if the ttl is set on save correctly
|
140
|
+
def cleanup(opts = nil); end
|
141
|
+
|
142
|
+
def _encode(data)
|
143
|
+
Marshal.dump(data)
|
144
|
+
end
|
145
|
+
|
146
|
+
def _decode(msg)
|
147
|
+
Marshal.load(msg)
|
148
|
+
end
|
149
|
+
|
150
|
+
# redis takes care of this operation
|
151
|
+
def run_cleanup_thread(opts = nil); end
|
152
|
+
|
153
|
+
# redis takes care of this operation
|
154
|
+
def stop_cleanup_thread(_opts = nil); end
|
155
|
+
|
156
|
+
def cleaning?
|
157
|
+
false
|
158
|
+
end
|
159
|
+
|
160
|
+
private
|
161
|
+
|
162
|
+
def get_expiry_time(opts)
|
163
|
+
if expire = opts[:expire_secs] || opts['expire_secs']
|
164
|
+
Time.now - expire
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def get_expiry_secs(opts)
|
169
|
+
opts[:expire_secs] || opts['expire_secs']
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Blix
|
5
|
+
# read a configuration hash from a yaml file depending on the current environment
|
6
|
+
# and using a user specified file or default locations.
|
7
|
+
#
|
8
|
+
# options:
|
9
|
+
# :name # the config file name
|
10
|
+
# :file # the fixed file name
|
11
|
+
|
12
|
+
class YamlConfig
|
13
|
+
|
14
|
+
HOME_DIR = ENV['HOME'] || Dir.pwd
|
15
|
+
DEFAULT_FILE_NAME = 'blix'
|
16
|
+
DEFAULT_CONFIG_DIR = 'config'
|
17
|
+
|
18
|
+
class ConfigError < StandardError; end
|
19
|
+
|
20
|
+
# create a new configuration object
|
21
|
+
def initialize(*args)
|
22
|
+
if args.length > 2
|
23
|
+
raise ConfigError, 'too many arguments'
|
24
|
+
elsif args.length > 1
|
25
|
+
opts = args[1]
|
26
|
+
env = args[0]
|
27
|
+
elsif !args.empty?
|
28
|
+
if args[0].is_a? Hash
|
29
|
+
opts = args[0]
|
30
|
+
env = if defined? Blix::Rest.environment
|
31
|
+
Blix::Rest.environment
|
32
|
+
else
|
33
|
+
ENV['RACK_ENV']
|
34
|
+
end
|
35
|
+
else
|
36
|
+
opts = {}
|
37
|
+
env = args[0]
|
38
|
+
end
|
39
|
+
else
|
40
|
+
opts = {}
|
41
|
+
env = Blix::Rest.environment
|
42
|
+
end
|
43
|
+
|
44
|
+
raise ConfigError, 'environment required!' unless env
|
45
|
+
|
46
|
+
file_name = opts['name'] || opts[:name] || DEFAULT_FILE_NAME
|
47
|
+
file_name = file_name.to_s
|
48
|
+
file_name += '.yml' unless file_name[-4, 4] == '.yml'
|
49
|
+
|
50
|
+
# look for a file
|
51
|
+
if config_file = opts['file'] || opts[:file]
|
52
|
+
config_file = config_file.to_s
|
53
|
+
unless File.exist?(config_file)
|
54
|
+
raise ConfigError, "blix config file:#{config_file} not found"
|
55
|
+
end
|
56
|
+
elsif File.exist?("#{HOME_DIR}/.#{file_name}")
|
57
|
+
config_file = "#{HOME_DIR}/.#{file_name}"
|
58
|
+
elsif File.exist?("#{DEFAULT_CONFIG_DIR}/#{file_name}")
|
59
|
+
config_file = "#{DEFAULT_CONFIG_DIR}/#{file_name}"
|
60
|
+
else
|
61
|
+
raise ConfigError, 'no blix config file found - pass as :file / :name parameter or default config/blix.yml or ~.blix.yml'
|
62
|
+
end
|
63
|
+
|
64
|
+
yaml = YAML.safe_load File.read(config_file)
|
65
|
+
raise ConfigError, "cannot read yaml configuration data from #{config_file} for environment:#{env} " unless yaml && yaml.key?(env.to_s)
|
66
|
+
@config = yaml[env.to_s] || {}
|
67
|
+
end
|
68
|
+
|
69
|
+
def [](k)
|
70
|
+
@config[k.to_s]
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
metadata
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: blix-rest
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.30
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Clive Andrews
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-08-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: httpclient
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: multi_json
|
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'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rack
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: |-
|
70
|
+
Rack based framework focused on building JSON REST web services.
|
71
|
+
Concentrates on making the basics very easy to write and fast to execute.
|
72
|
+
Fully extensible through RACK middleware and your own code
|
73
|
+
email:
|
74
|
+
- gems@realitybites.eu
|
75
|
+
executables: []
|
76
|
+
extensions: []
|
77
|
+
extra_rdoc_files:
|
78
|
+
- README.md
|
79
|
+
- LICENSE
|
80
|
+
files:
|
81
|
+
- LICENSE
|
82
|
+
- README.md
|
83
|
+
- lib/blix/rest.rb
|
84
|
+
- lib/blix/rest/controller.rb
|
85
|
+
- lib/blix/rest/cucumber.rb
|
86
|
+
- lib/blix/rest/cucumber/hooks.rb
|
87
|
+
- lib/blix/rest/cucumber/request_steps.rb
|
88
|
+
- lib/blix/rest/cucumber/resource_steps.rb
|
89
|
+
- lib/blix/rest/cucumber/world.rb
|
90
|
+
- lib/blix/rest/format.rb
|
91
|
+
- lib/blix/rest/format_parser.rb
|
92
|
+
- lib/blix/rest/handlebars_assets_fix.rb
|
93
|
+
- lib/blix/rest/request_mapper.rb
|
94
|
+
- lib/blix/rest/resource_cache.rb
|
95
|
+
- lib/blix/rest/response.rb
|
96
|
+
- lib/blix/rest/server.rb
|
97
|
+
- lib/blix/rest/string_hash.rb
|
98
|
+
- lib/blix/rest/version.rb
|
99
|
+
- lib/blix/utils.rb
|
100
|
+
- lib/blix/utils/misc.rb
|
101
|
+
- lib/blix/utils/redis_store.rb
|
102
|
+
- lib/blix/utils/yaml_config.rb
|
103
|
+
homepage: https://github.com/realbite/blix-rest
|
104
|
+
licenses:
|
105
|
+
- MIT
|
106
|
+
metadata: {}
|
107
|
+
post_install_message:
|
108
|
+
rdoc_options: []
|
109
|
+
require_paths:
|
110
|
+
- lib
|
111
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
requirements: []
|
122
|
+
rubygems_version: 3.1.4
|
123
|
+
signing_key:
|
124
|
+
specification_version: 4
|
125
|
+
summary: Framework for HTTP REST services
|
126
|
+
test_files: []
|