kreds 0.1.0 → 1.0.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: 13f6ab3b6f9ddb0cb9a04d9b9bd802b8cce3ed6498fd07046fa2ad42684402c5
4
- data.tar.gz: b94371b06a5786c60f7bb92b147ad67b48ac0ddede98a8211a51d57d08256c3b
3
+ metadata.gz: bd360d0e070613f6faa2659de2f39cd477f4e4f4e9b2b8b040698ad6569b7b19
4
+ data.tar.gz: 6a8d3d9693fe0d81a8fa44495db0e147704f9db807620f83716166579d7a17c0
5
5
  SHA512:
6
- metadata.gz: 693e1d768edaa7867809efe75f5f10b349e755b181859740c3c0d19fae62e491ad60f7c703a1d8e05e4b455e2132391a439fbb2668b0892007646e050f3c18b0
7
- data.tar.gz: fa4330a91248bc4bf1c6dff36995d74cbad6f1254be6b55b02f9185a8ceb6e839d1e1fbe26d262bd4dc7c3fb5564a3dac51f0309b206cf24d69e56f880f7f6c9
6
+ metadata.gz: f97393f35e509b0c25ed21edcbb412ccf15dee7afc06542fc81d166d14a227d6255be674bc7463bb4cd6bcb8f7d163ce645ae808e7ad5ce1657f3bc33bb45e71
7
+ data.tar.gz: f8ea75d9b59928922488e95a49d7a0de81e61ac2aaf412384727644844623174a8b628f539bcf9a685889e20ae18ebfea4c213db12d83e0bf0a7eb43f3d30c39
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## v1.0.0
2
+
3
+ - Dropped support for Rails 7.0
4
+ - Dropped support for Ruby 3.1
5
+ - Replaced `Kreds::BlankValueError` and `Kreds::UnknownKeyError` with `Kreds::BlankCredentialsError` and `Kreds::UnknownCredentialsError`, respectively
6
+ - Added optional fallback to environment variables for `Kreds.fetch!` method
7
+ - Added shortcut method `Kreds.var!` for fetching values directly from environment variables
8
+ - Added `Kreds.env_fetch!` method for fetching values from credentials per Rails environment
9
+ - Added `Kreds.show` method for displaying all credentials as a hash
10
+
1
11
  ## v0.1.0
2
12
 
3
13
  - Initial release
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/kreds.svg)](http://badge.fury.io/rb/kreds)
4
4
  [![Github Actions badge](https://github.com/enjaku4/kreds/actions/workflows/ci.yml/badge.svg)](https://github.com/enjaku4/kreds/actions/workflows/ci.yml)
5
5
 
6
- Kreds is a simpler and shorter way to access Rails credentials with safety built in. Rails credentials are a convenient way to store secrets, but retrieving them could be more intuitive. That’s where Kreds comes in.
6
+ Kreds is a simpler, shorter, and safer way to access Rails credentials, with a few additional features built in. Rails credentials are a convenient way to store secrets, but retrieving them could be more intuitive — that’s where Kreds comes in.
7
7
 
8
8
  Instead of writing:
9
9
 
@@ -17,7 +17,7 @@ You can simply use:
17
17
  Kreds.fetch!(:recaptcha, :site_key)
18
18
  ```
19
19
 
20
- This not only shortens your code but also ensures an exception is raised if a key is missing or a value is blank, with a clear, human-readable error message.
20
+ This not only shortens your code but also ensures an exception is raised if a key is missing or a value is blank with a clear, human-readable error message.
21
21
 
22
22
  ## Installation
23
23
 
@@ -35,17 +35,65 @@ bundle install
35
35
 
36
36
  ## Usage
37
37
 
38
- Kreds provides a single method `.fetch!(*keys)`:
38
+ ### Fetch from credentials
39
39
 
40
40
  ```ruby
41
41
  Kreds.fetch!(:aws, :s3, :credentials, :access_key_id)
42
42
  ```
43
43
 
44
- If you make a typo, such as writing `access_key` instead of `access_key_id`, Kreds will raise `Kreds::UnknownKeyError` with the message: `Key not found: [:aws][:s3][:credentials][:access_key]`. The same applies to any incorrect key in the path.
44
+ If you make a typo, such as writing `access_key` instead of `access_key_id`, Kreds will raise `Kreds::UnknownCredentialsError` with the message: `Credentials key not found: [:aws][:s3][:credentials][:access_key]`.
45
45
 
46
- Similarly, if you add an extra key that doesn’t exist, such as: `Kreds.fetch!(:aws, :s3, :credentials, :access_key_id, :id)`, Kreds will raise `Kreds::UnknownKeyError` with the message: `Key not found: [:aws][:s3][:credentials][:access_key_id][:id]`.
46
+ Similarly, if you add an extra key that doesn’t exist: `Kreds.fetch!(:aws, :s3, :credentials, :access_key_id, :id)`, Kreds will raise `Kreds::UnknownCredentialsError` with the message: `Credentials key not found: [:aws][:s3][:credentials][:access_key_id][:id]`.
47
47
 
48
- Kreds also ensures that values are not left blank. For example, if all keys are correct but the value for `access_key_id` is empty, Kreds will raise `Kreds::BlankValueError` with the message: `Blank value for: [:aws][:s3][:credentials][:access_key_id]`.
48
+ If all keys are correct but the value is blank, Kreds will raise `Kreds::BlankCredentialsError` with the message: `Blank value in credentials: [:aws][:s3][:credentials][:access_key_id]`.
49
+
50
+ ### Fallback to environment variables
51
+
52
+ You can optionally provide a fallback environment variable:
53
+
54
+ ```ruby
55
+ Kreds.fetch!(:aws, :s3, :credentials, :access_key_id, env_var: "AWS_ACCESS_KEY_ID")
56
+ ```
57
+
58
+ If the key is missing or blank in credentials, Kreds will attempt to fetch the value from the specified environment variable.
59
+
60
+ If both sources are missing or blank, a combined error is raised.
61
+
62
+ ### Directly fetch from environment variable
63
+
64
+ You can also fetch directly from an environment variable:
65
+
66
+ ```ruby
67
+ Kreds.var!("AWS_ACCESS_KEY_ID")
68
+ ```
69
+
70
+ This raises `Kreds::UnknownEnvironmentVariableError` if the variable is missing, and `Kreds::BlankEnvironmentVariableError` if it is present but the value is blank.
71
+
72
+ ### Fetch per Rails environment
73
+
74
+ If your credentials are scoped by Rails environment (e.g., `:production`, `:staging`, `:development`), you can fetch keys under the current environment using:
75
+
76
+ ```ruby
77
+ Kreds.env_fetch!(:recaptcha, :site_key)
78
+ ```
79
+
80
+ This will look for the key in `Rails.application.credentials[Rails.env]`. For example, in the `production` environment, it will look for `Rails.application.credentials[:production][:recaptcha][:site_key]`, and raise the same errors if the key is missing or the value is blank.
81
+
82
+ You can also provide an optional fallback environment variable:
83
+
84
+ ```ruby
85
+ Kreds.env_fetch!(:recaptcha, :site_key, var: "RECAPTCHA_SITE_KEY")
86
+ ```
87
+
88
+ ### Show credentials
89
+
90
+ To inspect all credentials as a hash:
91
+
92
+ ```ruby
93
+ Kreds.show
94
+ ```
95
+
96
+ Useful for debugging or working in the Rails console.
49
97
 
50
98
  ## Problems?
51
99
 
data/kreds.gemspec CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
  spec.metadata["rubygems_mfa_required"] = "true"
12
12
  spec.summary = "The missing shorthand for Rails credentials"
13
13
  spec.license = "MIT"
14
- spec.required_ruby_version = ">= 3.1", "< 3.5"
14
+ spec.required_ruby_version = ">= 3.2", "< 3.5"
15
15
 
16
16
  spec.files = [
17
17
  "kreds.gemspec", "README.md", "CHANGELOG.md", "LICENSE.txt"
@@ -19,5 +19,5 @@ Gem::Specification.new do |spec|
19
19
 
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_dependency "rails", ">= 7.0", "< 8.1"
22
+ spec.add_dependency "rails", ">= 7.1", "< 8.1"
23
23
  end
data/lib/kreds/fetch.rb CHANGED
@@ -1,20 +1,70 @@
1
1
  module Kreds
2
2
  module Fetch
3
- def fetch!(*keys)
3
+ def fetch!(*keys, var: nil)
4
+ validate_keys!(keys)
5
+ validate_var!(var)
6
+
4
7
  path = []
5
8
 
6
9
  keys.reduce(Rails.application.credentials) do |hash, key|
7
10
  path << key
11
+ fetch_key(hash, key, path, keys)
12
+ end
13
+ rescue Kreds::BlankCredentialsError, Kreds::UnknownCredentialsError => e
14
+ fallback_to_var(e, var)
15
+ end
8
16
 
9
- result = hash.fetch(key)
17
+ def env_fetch!(*keys, var: nil)
18
+ fetch!(Rails.env, *keys, var: var)
19
+ end
10
20
 
11
- raise(BlankValueError, "Blank value for: [:#{path.join("][:")}]") if result.blank?
12
- raise(UnknownKeyError, "Key not found: [:#{path.join("][:")}][:#{keys[path.size]}]") if !result.is_a?(Hash) && keys != path
21
+ def var!(var)
22
+ validate_var!(var)
13
23
 
14
- result
15
- end
24
+ result, success = check_var(var)
25
+ success ? result : raise(result)
26
+ end
27
+
28
+ private
29
+
30
+ def validate_keys!(keys)
31
+ raise Kreds::InvalidArgumentError, "No keys provided" if keys.empty?
32
+
33
+ return if keys.all? { _1.is_a?(Symbol) || _1.is_a?(String) }
34
+
35
+ raise Kreds::InvalidArgumentError, "Credentials Key must be a Symbol or a String"
36
+ end
37
+
38
+ def validate_var!(var)
39
+ raise Kreds::InvalidArgumentError, "Environment variable must be a String" if var.present? && !var.is_a?(String)
40
+ end
41
+
42
+ def fetch_key(hash, key, path, keys)
43
+ value = hash.fetch(key.to_sym)
44
+
45
+ raise Kreds::BlankCredentialsError, "Blank value in credentials: [:#{path.join("][:")}]" if value.blank?
46
+ raise Kreds::UnknownCredentialsError, "Credentials key not found: [:#{path.join("][:")}][:#{keys[path.size]}]" if !value.is_a?(Hash) && keys != path
47
+
48
+ value
49
+ rescue KeyError
50
+ raise Kreds::UnknownCredentialsError, "Credentials key not found: [:#{path.join("][:")}]"
51
+ end
52
+
53
+ def fallback_to_var(error, var)
54
+ return raise error if var.blank?
55
+
56
+ result, success = check_var(var)
57
+ success ? result : raise(Kreds::Error, [error.message, result.message].join(", "))
58
+ end
59
+
60
+ def check_var(var)
61
+ value = ENV.fetch(var)
62
+
63
+ return [Kreds::BlankEnvironmentVariableError.new("Blank value in environment variable: #{var.inspect}"), false] if value.blank?
64
+
65
+ [value, true]
16
66
  rescue KeyError
17
- raise UnknownKeyError, "Key not found: [:#{path.join("][:")}]"
67
+ [Kreds::UnknownEnvironmentVariableError.new("Environment variable not found: #{var.inspect}"), false]
18
68
  end
19
69
  end
20
70
  end
data/lib/kreds/show.rb ADDED
@@ -0,0 +1,7 @@
1
+ module Kreds
2
+ module Show
3
+ def show
4
+ Rails.application.credentials.as_json.deep_symbolize_keys
5
+ end
6
+ end
7
+ end
data/lib/kreds/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Kreds
2
- VERSION = "0.1.0"
2
+ VERSION = "1.0.0"
3
3
  end
data/lib/kreds.rb CHANGED
@@ -3,12 +3,16 @@ require_relative "kreds/version"
3
3
  require "rails"
4
4
 
5
5
  require_relative "kreds/fetch"
6
+ require_relative "kreds/show"
6
7
 
7
8
  module Kreds
8
9
  class Error < StandardError; end
9
-
10
- class UnknownKeyError < Error; end
11
- class BlankValueError < Error; end
10
+ class InvalidArgumentError < Error; end
11
+ class BlankCredentialsError < Error; end
12
+ class BlankEnvironmentVariableError < Error; end
13
+ class UnknownCredentialsError < Error; end
14
+ class UnknownEnvironmentVariableError < Error; end
12
15
 
13
16
  extend ::Kreds::Fetch
17
+ extend ::Kreds::Show
14
18
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kreds
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - enjaku4
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-03-06 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: rails
@@ -15,7 +15,7 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '7.0'
18
+ version: '7.1'
19
19
  - - "<"
20
20
  - !ruby/object:Gem::Version
21
21
  version: '8.1'
@@ -25,7 +25,7 @@ dependencies:
25
25
  requirements:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
- version: '7.0'
28
+ version: '7.1'
29
29
  - - "<"
30
30
  - !ruby/object:Gem::Version
31
31
  version: '8.1'
@@ -39,6 +39,7 @@ files:
39
39
  - kreds.gemspec
40
40
  - lib/kreds.rb
41
41
  - lib/kreds/fetch.rb
42
+ - lib/kreds/show.rb
42
43
  - lib/kreds/version.rb
43
44
  homepage: https://github.com/enjaku4/kreds
44
45
  licenses:
@@ -55,7 +56,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
55
56
  requirements:
56
57
  - - ">="
57
58
  - !ruby/object:Gem::Version
58
- version: '3.1'
59
+ version: '3.2'
59
60
  - - "<"
60
61
  - !ruby/object:Gem::Version
61
62
  version: '3.5'
@@ -65,7 +66,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
66
  - !ruby/object:Gem::Version
66
67
  version: '0'
67
68
  requirements: []
68
- rubygems_version: 3.6.2
69
+ rubygems_version: 3.6.7
69
70
  specification_version: 4
70
71
  summary: The missing shorthand for Rails credentials
71
72
  test_files: []