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.
@@ -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: []