blix-rest 0.1.30
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 +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: []
|