json_schematize 0.6.1 → 0.8.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
  SHA256:
3
- metadata.gz: d0b80648f60c06f94a7530ba812d49891e57d28549cd63f1ba42e7adfd74cb03
4
- data.tar.gz: 0b97d3b638941ce37b2907640840759fc9462df4447d04f3828847bcb580aa8d
3
+ metadata.gz: ddc1b50176fdee42d41912116919c05fdd1c34e17c7932b4e588cb380abfd8f5
4
+ data.tar.gz: ee85dc09adc5d4505e75d04aa524d43f2aa6859ee82eddf474fbdd471613f885
5
5
  SHA512:
6
- metadata.gz: cb8ac2f474f45303d6c9f17924ba1a92de71cb6cd645382ec12579e2d69274039ba8bc67c528c08f3fad0f2103265ac2792c8c88f12aec37b754b47a61f71691
7
- data.tar.gz: 3f49f060c7fbcefd0705256e23853eb4220c5d63636c75be1e15f721b3fa2d0d631965424101e69cee1c4108d1976191a4717d1643ff15250a746b48d0794002
6
+ metadata.gz: 21a5a7c6d3e194c1ba1149b3b6e37dfe6da7724ee317f8e2d3856b1b917dbcaedad510a8cce42f3c6340b3a66d5b662dc0cac11ce598916b73ef1c59a6aed739
7
+ data.tar.gz: '09d5cb8dd10a426f98b8fbbc89ab14cb76800f3c3bdb7acb0bb7d640a9a135453732d533b75703a6b639e19b937b8b32ad77c502f804840fbf3ae49b6ec06f7a'
data/.circleci/config.yml CHANGED
@@ -1,202 +1,29 @@
1
1
  version: 2.1
2
2
 
3
- # Declare the orbs that we'll use in our config.
4
- # read more about orbs: https://circleci.com/docs/2.0/using-orbs/
5
3
  orbs:
6
4
  ruby: circleci/ruby@1.0
5
+ node: circleci/node@2
6
+ cst: cst/framework@1
7
7
 
8
- common_envs: &common_envs
9
- environment:
10
- APP_BUNDLER_VERSION: "2.3.8"
11
- REDIS_URL: "redis://127.0.0.1"
12
-
13
- executors:
14
- gem:
15
- parameters:
16
- ruby-version:
17
- default: "3.0.0"
18
- type: string
19
- docker:
20
- - image: cimg/ruby:<< parameters.ruby-version >>
21
- - image: circleci/redis:6.0
22
-
23
- <<: *common_envs
24
-
25
- commands:
26
- bundler-preamble:
27
- description: "Install ruby and the Gemfile dependencies"
28
- parameters:
29
- ruby-version:
30
- type: string
31
- default: "3"
32
- description: "Ruby Gem version"
33
- key-name:
34
- type: string
35
- default: ""
36
- description: Custom name to add to the cache key
37
- cache-breaker:
38
- type: string
39
- default: "0"
40
- description: "Cache breaker to force new cache instantiation"
41
- keep-lock-file:
42
- type: boolean
43
- default: false
44
- description: "Retain lock file when bit is set to true. Otherwise generate a new one specific for this build"
45
- steps:
46
- - checkout
47
- - attach_workspace:
48
- at: workspace
49
- - unless:
50
- condition:
51
- equal: [ true, << parameters.keep-lock-file >> ]
52
- steps:
53
- - run:
54
- name: Remove Gemfile.lock
55
- command: rm Gemfile.lock
56
- - restore_cache:
57
- key: bundle-<< parameters.ruby-version >>-<< parameters.key-name >>-{{ checksum "Gemfile" }}-<< parameters.cache-breaker >>
58
- - ruby/install-deps:
59
- path: vendor/bundle
60
- with-cache: false
61
- - run:
62
- name: "Update dependencies"
63
- command: bundle update
64
- - save_cache:
65
- key: bundle-<< parameters.ruby-version >>-<< parameters.key-name >>-{{ checksum "Gemfile" }}-<< parameters.cache-breaker >>
66
- paths:
67
- - vendor/bundle
68
-
69
- jobs:
70
- publish-rubygems:
71
- executor: gem
72
- steps:
73
- - bundler-preamble:
74
- keep-lock-file: true
75
- - run:
76
- name: Publish to Ruby Gems
77
- command: |
78
- if [ -z "$GEM_HOST_API_KEY" ]; then
79
- echo 'Environment variable GEM_HOST_API_KEY is not present'
80
- exit 1
81
- fi
82
- gem_output=$(gem build json_schematize.gemspec)
83
- VERSION=$(printf "$gem_output" | awk '/Version: / {print $2}')
84
- FILE=$(printf "$gem_output" | awk '/File: / {print $2}')
85
-
86
- gem push ${FILE}
87
-
88
- publish-github:
89
- executor: gem
90
- steps:
91
- - bundler-preamble:
92
- keep-lock-file: true
93
- - run:
94
- name: 'Get Go'
95
- command: |
96
- sudo apt-get update -qq
97
- sudo apt-get -y --no-install-recommends install golang-go
98
- - run:
99
- name: 'Set Git stats'
100
- command: |
101
- git config user.name $GITHUB_USER
102
- git config user.email $GITHUB_EMAIL
103
- - run:
104
- name: Publish Git Release
105
- command: |
106
- curl -sSL https://github.com/tcnksm/ghr/releases/download/v0.13.0/ghr_v0.13.0_linux_amd64.tar.gz | tar xz -f - -C . ghr_v0.13.0_linux_amd64/ghr
107
- mv ghr_v0.13.0_linux_amd64/ghr .
108
- rm -rf ghr_v0.13.0_linux_amd64
109
- chmod 0755 ghr
110
-
111
- if [ -z "$GITHUB_TOKEN" ]; then
112
- echo 'Environment variable GITHUB_TOKEN is not present'
113
- exit 1
114
- fi
115
-
116
- if [ -z "$GITHUB_USER" ]; then
117
- echo 'Environment variable GITHUB_USER is not present'
118
- exit 1
119
- fi
120
-
121
- if [ $(git tag -l "$VERSION") ]; then
122
- echo "Pre existing version $VERSION, not tagging."
123
- exit 0
124
- fi
125
-
126
- gem_output=$(gem build json_schematize.gemspec)
127
- VERSION=$(printf "$gem_output" | awk '/Version: / {print $2}')
128
- FILE=$GEM_PATH$(printf "$gem_output" | awk '/File: / {print $2}')
129
-
130
- git tag -a $VERSION -m "$VERSION"
131
-
132
- SHA=$(git rev-parse HEAD)
133
- ./ghr -soft -t ${GITHUB_TOKEN} -u ${GITHUB_USER} -r json_schematize -c ${SHA} ${VERSION} ${FILE}
134
-
135
- test:
136
- parameters:
137
- ruby-version:
138
- default: "3.0.0"
139
- type: string
140
- description: "Ruby version to test against"
141
- executor:
142
- name: gem
143
- ruby-version: << parameters.ruby-version >>
144
- steps:
145
- - bundler-preamble:
146
- ruby-version: "<< parameters.ruby-version >>"
147
- - run:
148
- name: Setup Climate Control test-reporter
149
- command: |
150
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
151
- chmod +x ./cc-test-reporter
152
- - run:
153
- name: Waiting for Redis to be ready
154
- command: |
155
- for i in `seq 1 10`;
156
- do
157
- nc -z localhost 6379 && echo Success && exit 0
158
- echo -n .
159
- sleep 1
160
- done
161
- echo Failed waiting for Redis to be available && exit 1
162
- - run:
163
- name: Run and Report tests
164
- command: |
165
- ./cc-test-reporter before-build
166
- SIMPLE_COV_RUN=true bundle exec rspec --format RspecJunitFormatter --out test-results/rspec/rspec.xml --format progress --color
167
- - when:
168
- condition:
169
- equal:
170
- [
171
- required-test-ruby2.7.5,
172
- required-test-ruby<< parameters.ruby-version >>,
173
- ]
174
- steps:
175
- - run:
176
- name: Report CodeClimate Coverage
177
- command: ./cc-test-reporter after-build --coverage-input-type simplecov
178
8
  workflows:
179
9
  version: 2
180
10
  yeet-le-jobs:
181
11
  jobs:
182
- - test:
12
+ - cst/enforce-gem-version-bump
13
+ - cst/rspec-ruby:
14
+ rspec-system-args: "SIMPLE_COV_RUN=true"
15
+ cc-report-collect-ruby: "2.7.5"
183
16
  matrix:
184
17
  parameters:
185
18
  ruby-version: ["2.7.5" , "3.0.0", "3.0.3"]
186
19
  alias: required-matrix-tests
187
- name: required-test-ruby<< matrix.ruby-version >>
188
- - publish-github:
189
- requires:
190
- - required-matrix-tests
191
- filters:
192
- branches:
193
- only:
194
- - main
195
- - publish-rubygems:
20
+ name: test-ruby<< matrix.ruby-version >>
21
+ - cst/publish-gem:
22
+ publish-git: true
23
+ publish-default-gem: true
196
24
  requires:
197
25
  - required-matrix-tests
198
26
  filters:
199
27
  branches:
200
28
  only:
201
29
  - main
202
-
data/Gemfile CHANGED
@@ -4,7 +4,7 @@ source "https://rubygems.org"
4
4
 
5
5
  gemspec
6
6
 
7
- gem 'redis'
7
+ gem 'activesupport'
8
8
  gem 'faker'
9
9
  gem 'pry'
10
10
  gem 'rspec', '~> 3.0'
data/Gemfile.lock CHANGED
@@ -1,14 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- json_schematize (0.6.1)
4
+ json_schematize (0.7.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ activesupport (7.0.2.4)
10
+ concurrent-ruby (~> 1.0, >= 1.0.2)
11
+ i18n (>= 1.6, < 2)
12
+ minitest (>= 5.1)
13
+ tzinfo (~> 2.0)
9
14
  byebug (11.1.3)
10
15
  coderay (1.1.3)
11
- concurrent-ruby (1.1.10)
16
+ concurrent-ruby (1.1.9)
12
17
  diff-lcs (1.5.0)
13
18
  docile (1.4.0)
14
19
  faker (2.20.0)
@@ -16,6 +21,7 @@ GEM
16
21
  i18n (1.10.0)
17
22
  concurrent-ruby (~> 1.0)
18
23
  method_source (1.0.0)
24
+ minitest (5.15.0)
19
25
  pry (0.13.1)
20
26
  coderay (~> 1.1)
21
27
  method_source (~> 1.0)
@@ -23,7 +29,6 @@ GEM
23
29
  byebug (~> 11.0)
24
30
  pry (~> 0.13.0)
25
31
  rake (12.3.3)
26
- redis (4.6.0)
27
32
  rspec (3.11.0)
28
33
  rspec-core (~> 3.11.0)
29
34
  rspec-expectations (~> 3.11.0)
@@ -33,7 +38,7 @@ GEM
33
38
  rspec-expectations (3.11.0)
34
39
  diff-lcs (>= 1.2.0, < 2.0)
35
40
  rspec-support (~> 3.11.0)
36
- rspec-mocks (3.11.1)
41
+ rspec-mocks (3.11.0)
37
42
  diff-lcs (>= 1.2.0, < 2.0)
38
43
  rspec-support (~> 3.11.0)
39
44
  rspec-support (3.11.0)
@@ -45,17 +50,19 @@ GEM
45
50
  simplecov_json_formatter (~> 0.1)
46
51
  simplecov-html (0.12.3)
47
52
  simplecov_json_formatter (0.1.4)
53
+ tzinfo (2.0.4)
54
+ concurrent-ruby (~> 1.0)
48
55
 
49
56
  PLATFORMS
50
57
  x86_64-linux
51
58
 
52
59
  DEPENDENCIES
60
+ activesupport
53
61
  faker
54
62
  json_schematize!
55
63
  pry
56
64
  pry-byebug
57
65
  rake (~> 12.0)
58
- redis
59
66
  rspec (~> 3.0)
60
67
  rspec_junit_formatter
61
68
  simplecov
data/docker-compose.yml CHANGED
@@ -10,13 +10,6 @@ services:
10
10
  - .:/gem
11
11
  - ..:/local
12
12
  - bundle-cache:/usr/local/bundle:delegated
13
- environment:
14
- REDIS_URL: redis://redis
15
- links:
16
- - redis
17
- redis:
18
- image: redis
19
- expose:
20
- - 6379
13
+
21
14
  volumes:
22
15
  bundle-cache:
@@ -29,6 +29,8 @@ Gem::Specification.new do |spec|
29
29
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
30
  spec.require_paths = ["lib"]
31
31
 
32
+ spec.add_dependency "class_composer", "~> 1.0"
33
+
32
34
  spec.add_development_dependency "pry-byebug"
33
35
  spec.add_development_dependency "rake", "~> 12.0"
34
36
  spec.add_development_dependency "rspec", "~> 3.0"
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JsonSchematize::Cache::ClassMethods
4
+ module Client
5
+
6
+ def __deserialize_keys__(key_hash_bytes)
7
+ return [{}, 0] if key_hash_bytes.nil?
8
+
9
+ min_expire = Time.now.to_i
10
+ key_hash = Marshal.load(key_hash_bytes)
11
+ keys_removed = 0
12
+ key_hash.each do |key, expire|
13
+ next if expire.to_i > min_expire
14
+
15
+ key_hash.delete(key)
16
+ keys_removed += 1
17
+ end
18
+
19
+ [key_hash, keys_removed]
20
+ rescue StandardError => e
21
+ ::Kernel.warn("Yikes!! Failed to parse. Returning empty. #{e.message}")
22
+ [{}, 0]
23
+ end
24
+
25
+ def __update_record_keeper__!(expire:, cache_key:, delete_key: false)
26
+ record_of_truth = cached_keys(with_expire: true)
27
+ if delete_key
28
+ record_of_truth.delete(cache_key)
29
+ else
30
+ record_of_truth[cache_key] = expire
31
+ end
32
+ serialized_string = Marshal.dump(record_of_truth)
33
+
34
+ cache_client.write(cache_namespace, serialized_string)
35
+ end
36
+
37
+ def __delete_record__!(key)
38
+ __update_record_keeper__!(expire: nil, cache_key: key, delete_key: true)
39
+ end
40
+
41
+ def cached_keys(with_expire: false, count_removed: false)
42
+ raw_string = cache_client.read(cache_namespace)
43
+ key_hash, keys_removed = __deserialize_keys__(raw_string)
44
+ return key_hash if with_expire
45
+ return keys_removed if count_removed
46
+
47
+ key_hash.keys
48
+ end
49
+
50
+ def cached_items(key_includes: nil)
51
+ clear_unscored_items! if rand > cache_configuration[:stochastic_cache_bust]
52
+
53
+ cached_keys.map do |key|
54
+ if key_includes
55
+ next unless key.include?(key_includes)
56
+ end
57
+
58
+ serialized_string = cache_client.read(key)
59
+ Marshal.load(serialized_string)
60
+ end.compact
61
+ end
62
+
63
+ def clear_cache!
64
+ cache_client.delete_multi(([cache_namespace] + cached_keys))
65
+ end
66
+
67
+ def clear_unscored_items!
68
+ cached_keys(count_removed: true)
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JsonSchematize::Cache::ClassMethods
4
+ module Configuration
5
+ def cache_options(key: nil, cache_client: nil, cache_namespace: nil, ttl: nil, update_on_change: nil, stochastic_cache_bust: nil)
6
+ cache_configuration[:key] = key if key
7
+ cache_configuration[:ttl] = ttl if ttl
8
+ cache_configuration[:stochastic_cache_bust] = stochastic_cache_bust if stochastic_cache_bust
9
+ cache_configuration[:update_on_change] = update_on_change if update_on_change
10
+ cache_namespace = cache_configuration[:cache_namespace] = cache_namespace if cache_namespace
11
+
12
+ self.cache_client = cache_configuration[:cache_client] = cache_client if cache_client
13
+ end
14
+
15
+ def cache_namespace
16
+ cache_configuration[:cache_namespace] ||= "jss:#{self.name.downcase}"
17
+ end
18
+
19
+ def cache_namespace=(namespace)
20
+ cache_configuration[:cache_namespace] = namespace
21
+ end
22
+
23
+ def cache_configuration
24
+ @cache_configuration ||= begin
25
+ {
26
+ cache_client: JsonSchematize.configuration.cache_client,
27
+ cache_namespace: JsonSchematize.configuration.cache_namespace,
28
+ key: JsonSchematize.configuration.cache_key,
29
+ stochastic_cache_bust: JsonSchematize.configuration.cache_stochastic_bust,
30
+ ttl: JsonSchematize.configuration.cache_ttl,
31
+ update_on_change: JsonSchematize.configuration.cache_update_on_change,
32
+ }
33
+ end
34
+ end
35
+
36
+ def cache_client=(client)
37
+ cache_configuration[:cache_client] = client
38
+ end
39
+
40
+ def cache_client
41
+ cache_configuration[:cache_client].is_a?(Proc) ? cache_configuration[:cache_client].call : cache_configuration[:cache_client]
42
+ end
43
+ end
44
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module JsonSchematize
2
4
  module Cache
3
5
  module InstanceMethods
@@ -12,16 +14,17 @@ module JsonSchematize
12
14
 
13
15
  def __update_cache_item__(with_delete: true)
14
16
  __clear_entry__! if with_delete # needs to get done first in the event the cache_key changes
15
- client = self.class.redis_client
17
+ client = self.class.cache_client
16
18
  ttl = self.class.cache_configuration[:ttl].to_i
17
19
  score = Time.now.to_i + ttl
18
- client.zadd(__cache_namespace__, score, __cache_key__)
19
- client.set(__cache_key__, Marshal.dump(self), ex: ttl)
20
+ self.class.__update_record_keeper__!(expire: score, cache_key: __cache_key__)
21
+
22
+ client.write(__cache_key__, Marshal.dump(self), expires_in: ttl)
20
23
  end
21
24
 
22
25
  def __clear_entry__!
23
- self.class.redis_client.zrem(__cache_namespace__, __cache_key__)
24
- self.class.redis_client.unlink(__cache_key__)
26
+ self.class.cache_client.delete(__cache_key__)
27
+ self.class.__delete_record__!(__cache_key__)
25
28
  end
26
29
 
27
30
  def __cache_key__
@@ -1,15 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "json_schematize/cache/instance_methods"
4
- require "json_schematize/cache/class_methods"
4
+ require "json_schematize/cache/class_methods/client"
5
+ require "json_schematize/cache/class_methods/configuration"
5
6
 
6
7
  module JsonSchematize
7
8
  module Cache
8
- def self.included(base)
9
- raise StandardError, "Yikes! JsonSchematize::Cache Needs Redis to work. Include it as a gem" unless defined?(Redis)
9
+ module ClassMethods; end
10
10
 
11
+ def self.included(base)
11
12
  base.include(JsonSchematize::Cache::InstanceMethods)
12
- base.extend(JsonSchematize::Cache::ClassMethods)
13
+ base.extend(JsonSchematize::Cache::ClassMethods::Client)
14
+ base.extend(JsonSchematize::Cache::ClassMethods::Configuration)
13
15
  end
14
16
  end
15
17
  end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "class_composer"
4
+ require "json_schematize/errors"
5
+
6
+ module JsonSchematize
7
+ class Configuration
8
+ include ClassComposer::Generator
9
+
10
+ DEFAULT_ONE_MIN = 60 * 60
11
+ DEFAULT_ONE_HOUR = DEFAULT_ONE_MIN * 60
12
+ DEFAULT_ONE_DAY = DEFAULT_ONE_HOUR * 24
13
+ DEFAULT_CACHE_OPTIONS = {
14
+ cache_client: nil,
15
+ cache_key: ->(val, _custom_key) { val.hash },
16
+ cache_namespace: nil,
17
+ cache_stochastic_bust: 0.8,
18
+ cache_ttl: DEFAULT_ONE_DAY,
19
+ cache_update_on_change: true,
20
+ }
21
+
22
+ add_composer :cache_key, allowed: Proc, default: DEFAULT_CACHE_OPTIONS[:cache_key], validation_error_klass: ::JsonSchematize::ConfigError, invalid_message: -> (val) { _assign_msg_("cache_key", "->(val, cusom_key) { val.hash }", "Default proc to assign cache key") }
23
+ add_composer :cache_namespace, allowed: [String, Symbol]
24
+ add_composer :cache_stochastic_bust, allowed: [Float, Integer], default: DEFAULT_CACHE_OPTIONS[:cache_stochastic_bust]
25
+ add_composer :cache_ttl, allowed: [Float, Integer], default: DEFAULT_CACHE_OPTIONS[:cache_ttl]
26
+ add_composer :cache_update_on_change, allowed: [TrueClass, FalseClass], default: DEFAULT_CACHE_OPTIONS[:cache_update_on_change]
27
+
28
+ def cache_hash
29
+ DEFAULT_CACHE_OPTIONS.map do |key, value|
30
+ val = public_send(key)
31
+ [key, val]
32
+ end.to_h
33
+ end
34
+
35
+ def cache_key=(value)
36
+ if value.is_a? Proc
37
+ @key = value
38
+ return @key
39
+ end
40
+
41
+ assign = _assign_msg_("cache_key", "->(val, cusom_key) { val.hash }", "Default proc to assign cache key")
42
+ msg = "cache_key must be a proc. \n#{assign}"
43
+ raise JsonSchematize::ConfigError, msg
44
+ end
45
+
46
+ def cache_client=(client)
47
+ min_required = [:read, :write, :delete_multi, :read_multi]
48
+ min_required.each do |meth|
49
+ next if client.methods.include?(meth)
50
+
51
+ assign = _assign_msg_("cache_client", "_initialized_client_", "Preferably an ActiveSupport::Cache::Store supported client")
52
+ msg = "Passed in client does not accept minimum values. #{min_required} are required methods \n#{assign}"
53
+ raise JsonSchematize::ConfigError, msg
54
+ end
55
+
56
+
57
+ @cache_client = client
58
+ end
59
+
60
+ def cache_client
61
+ return @cache_client unless @cache_client.nil?
62
+
63
+ begin
64
+ Kernel.require 'active_support'
65
+ rescue LoadError
66
+ assign = _assign_msg_("cache_client", "ActiveSupport::Cache::MemoryStore.new", "A ActiveSupport::Cache::Store supported client")
67
+ msg = "Default client missing. Attempted to use 'active_support/cache' but not loaded. \n#{assign}"
68
+ raise JsonSchematize::ConfigError, msg
69
+ end
70
+
71
+ @cache_client = ActiveSupport::Cache::MemoryStore.new
72
+ @cache_client
73
+ end
74
+
75
+ private
76
+
77
+ def _assign_msg_(key, assignment, comment)
78
+ config = " config.#{key} = #{assignment} # #{comment}"
79
+ "\n\n# Initializer for json_schematize\n" \
80
+ "JsonSchematize.configure do |config|\n" \
81
+ "#{config}\n" \
82
+ "end\n\n"
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JsonSchematize
4
+ class Error < StandardError; end
5
+ class ConfigError < Error; end
6
+ class FieldError < Error; end
7
+
8
+ class InvalidField < Error; end
9
+ class InvalidFieldByValidator < InvalidField; end
10
+ class InvalidFieldByType < InvalidField; end
11
+ class InvalidFieldByArrayOfTypes < InvalidField; end
12
+
13
+ ## Customized class errors
14
+ class UndefinedBoolean < Error; end
15
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JsonSchematize
4
- VERSION = "0.6.1"
4
+ VERSION = "0.8.0"
5
5
  end
@@ -1,21 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "json_schematize/version"
4
-
5
3
  require "json_schematize/base"
6
4
  require "json_schematize/boolean"
7
- require "json_schematize/generator"
5
+ require "json_schematize/configuration"
8
6
  require "json_schematize/empty_value"
7
+ require "json_schematize/errors"
8
+ require "json_schematize/generator"
9
9
  require "json_schematize/version"
10
10
 
11
11
  module JsonSchematize
12
- class Error < StandardError; end
13
- class FieldError < Error; end
14
- class InvalidField < Error; end
15
- class InvalidFieldByValidator < InvalidField; end
16
- class InvalidFieldByType < InvalidField; end
17
- class InvalidFieldByArrayOfTypes < InvalidField; end
12
+ def self.configure
13
+ yield configuration if block_given?
14
+ end
15
+
16
+ def self.configuration
17
+ @configuration ||= JsonSchematize::Configuration.new
18
+ end
19
+
20
+ def self.configuration=(object)
21
+ raise ConfigError, "Expected configuration to be a JsonSchematize::Configuration" unless object.is_a?(JsonSchematize::Configuration)
22
+
23
+ @configuration = object
24
+ end
18
25
 
19
- ## Customized class errors
20
- class UndefinedBoolean < Error; end
26
+ def self.cache_client
27
+ configuration.cache_client
28
+ end
21
29
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_schematize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Taylor
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-02 00:00:00.000000000 Z
11
+ date: 2022-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: class_composer
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: pry-byebug
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -92,9 +106,12 @@ files:
92
106
  - lib/json_schematize/base.rb
93
107
  - lib/json_schematize/boolean.rb
94
108
  - lib/json_schematize/cache.rb
95
- - lib/json_schematize/cache/class_methods.rb
109
+ - lib/json_schematize/cache/class_methods/client.rb
110
+ - lib/json_schematize/cache/class_methods/configuration.rb
96
111
  - lib/json_schematize/cache/instance_methods.rb
112
+ - lib/json_schematize/configuration.rb
97
113
  - lib/json_schematize/empty_value.rb
114
+ - lib/json_schematize/errors.rb
98
115
  - lib/json_schematize/field.rb
99
116
  - lib/json_schematize/field_transformations.rb
100
117
  - lib/json_schematize/field_validators.rb
@@ -122,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
139
  - !ruby/object:Gem::Version
123
140
  version: '0'
124
141
  requirements: []
125
- rubygems_version: 3.2.3
142
+ rubygems_version: 3.3.11
126
143
  signing_key:
127
144
  specification_version: 4
128
145
  summary: This gem gives you the ability to turn API results into a standardized schema's
@@ -1,81 +0,0 @@
1
- module JsonSchematize
2
- module Cache
3
- module ClassMethods
4
- DEFAULT_ONE_MIN = 60 * 60
5
- DEFAULT_ONE_HOUR = DEFAULT_ONE_MIN * 60
6
- DEFAULT_ONE_DAY = DEFAULT_ONE_HOUR * 24
7
- DEFAULT_URL = ENV["CACHE_LAYER_REDIS_URL"] || ENV["REDIS_URL"]
8
- DEFAULTS = {
9
- redis_url: DEFAULT_URL,
10
- ttl: DEFAULT_ONE_DAY,
11
- key: ->(val, _custom_key) { val.hash },
12
- update_on_change: true,
13
- redis_client: ->() { ::Redis.new(url: DEFAULT_URL) },
14
- stochastic_cache_bust: 0.8,
15
- }
16
-
17
- def cache_options(key: nil, redis_url: nil, redis_client: nil, cache_namespace: nil, ttl: nil, update_on_change: nil, stochastic_cache_bust: nil)
18
- cache_configuration[:key] = key if key
19
- cache_configuration[:ttl] = ttl if ttl
20
- cache_configuration[:stochastic_cache_bust] = stochastic_cache_bust if stochastic_cache_bust
21
- cache_configuration[:update_on_change] = update_on_change if update_on_change
22
- cache_namespace = cache_configuration[:cache_namespace] = cache_namespace if cache_namespace
23
-
24
- self.redis_client = cache_configuration[:redis_client] = redis_client if redis_client
25
- self.redis_url = cache_configuration[:redis_url] = redis_url if redis_url
26
- end
27
-
28
- def cache_namespace
29
- cache_configuration[:cache_namespace] ||= "jss:#{self.name.downcase}"
30
- end
31
-
32
- def cache_namespace=(namespace)
33
- cache_configuration[:cache_namespace] = namespace
34
- end
35
-
36
- def cache_configuration
37
- @cache_configuration ||= DEFAULTS.clone
38
- end
39
-
40
- def redis_client=(client)
41
- cache_configuration[:redis_client] = client
42
- end
43
-
44
- def redis_url=(url)
45
- cache_configuration[:redis_url] = url
46
- cache_configuration[:redis_client] = ::Redis.new(url: url)
47
- end
48
-
49
- def redis_client
50
- cache_configuration[:redis_client].is_a?(Proc) ? cache_configuration[:redis_client].call : cache_configuration[:redis_client]
51
- end
52
-
53
- def cached_keys
54
- max_length = Time.now.to_i + cache_configuration[:ttl].to_i + 10
55
- redis_client.zrangebyscore(cache_namespace, Time.now.to_i, "+inf")
56
- end
57
-
58
- def cached_items(key_includes: nil)
59
- clear_unscored_items! if rand > cache_configuration[:stochastic_cache_bust]
60
-
61
- cached_keys.map do |key|
62
- if key_includes
63
- next unless key.include?(key_includes)
64
- end
65
-
66
- serialized_string = redis_client.get(key)
67
- Marshal.load(serialized_string)
68
- end
69
- end
70
-
71
- def clear_cache!
72
- redis_client.unlink(*cached_keys) if cached_keys.length > 0
73
- redis_client.unlink(cache_namespace)
74
- end
75
-
76
- def clear_unscored_items!
77
- redis_client.zremrangebyscore(cache_namespace, "-inf", Time.now.to_i)
78
- end
79
- end
80
- end
81
- end