environment_helpers 1.3.0 → 1.5.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: c789efc6ec01f80dab6e39fcf2ae8c1941642b61751e8585ed4765e7679260c2
4
- data.tar.gz: 29fab39b2237db66ef6d980880f606d4ec0ba4be4991ccb38a3aface1149d68f
3
+ metadata.gz: 5e1df5aabc663c1ed5969c56db3d1be35f6b329272718ce174b30260f4c2f1e8
4
+ data.tar.gz: 855f2cf510c568464310ef1bc30fb6115a6dff653618f25472a452fcf901cb77
5
5
  SHA512:
6
- metadata.gz: 617d37082c5f021bbf1691332e4cade122014508394c8f6f3a8b6e80e20847a57d41793a1fbb99ff3f9ca15bfd5f86666ff8b72883643681f72341757f88043e
7
- data.tar.gz: 040fc4d6d63f5306c96bdf39fd4814608912c23063b9ced4f101b9250c39cbbf0ebf93626e47d41813e8872bebc946dfcbd54d4003fcf994b711ba820c201672
6
+ metadata.gz: 2dcccd3be2e778d76ce595521efc58204b680acfbe3328c86e357946574c338e323ee7a4e479e39d768f97a67fb6ecb7bb2c7aad7c68db7ed2d6f30bd761f299
7
+ data.tar.gz: 6a9bccc3864329bf295f59c268d64bed2078d072f9eed08ce2ff3063ead716f2e3e5a14b333f710b01b6092ec3be595bb71e74548c83515f230dfb9306e51bd7
@@ -0,0 +1,29 @@
1
+ name: Quiet Quality
2
+
3
+ on: push
4
+ permissions: write-all
5
+
6
+ jobs:
7
+ check:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/checkout@v4
11
+ with:
12
+ fetch-depth: 0
13
+
14
+ - name: Show the merge-base
15
+ run: git merge-base origin/main ${{ github.sha }}
16
+ if: github.branch != 'main'
17
+
18
+ - name: Set up Ruby
19
+ uses: ruby/setup-ruby@v1
20
+ with:
21
+ ruby-version: 3.2
22
+
23
+ - name: Install gems
24
+ run: bundle install --jobs 4 --retry 3
25
+
26
+ - name: Run QuietQuality
27
+ run: |
28
+ gem install quiet_quality standard rubocop
29
+ qq -C .quiet_quality.ci-cd.yml
@@ -8,10 +8,12 @@ jobs:
8
8
  strategy:
9
9
  fail-fast: false
10
10
  matrix:
11
- ruby-version: ['2.6', '2.7', '3.0', '3.1', '3.2', 'head']
11
+ ruby-version: ['2.7', '3.0', '3.1', '3.2', 'head']
12
+ env:
13
+ NO_STEEP: "Because we need to test on versions that are older than steep supports"
12
14
 
13
15
  steps:
14
- - uses: actions/checkout@v3
16
+ - uses: actions/checkout@v4
15
17
 
16
18
  - name: Set up ruby
17
19
  uses: ruby/setup-ruby@v1
@@ -0,0 +1,18 @@
1
+ name: Steep Type Checking
2
+
3
+ on: push
4
+
5
+ jobs:
6
+ check:
7
+ runs-on: ubuntu-latest
8
+ steps:
9
+ - uses: actions/checkout@v4
10
+
11
+ - name: Set up ruby
12
+ uses: ruby/setup-ruby@v1
13
+ with:
14
+ ruby-version: 3.3
15
+ bundler-cache: true
16
+
17
+ - name: Run Steep
18
+ run: bundle exec steep check
data/.mdl_rules.rb ADDED
@@ -0,0 +1,2 @@
1
+ all
2
+ rule "MD013", ignore_code_blocks: true
data/.mdlrc ADDED
@@ -0,0 +1,2 @@
1
+ style File.expand_path("../.mdl_rules.rb", __FILE__)
2
+ git_recurse true
@@ -0,0 +1,7 @@
1
+ ---
2
+ default_tools: ["standardrb", "rubocop", "markdown_lint", "rspec"]
3
+ executor: concurrent
4
+ comparison_branch: origin/main
5
+ annotator: github_stdout
6
+ changed_files: false
7
+ filter_messages: false
@@ -0,0 +1,7 @@
1
+ ---
2
+ default_tools: ["standardrb", "rubocop", "markdown_lint", "rspec"]
3
+ executor: concurrent
4
+ comparison_branch: origin/main
5
+ logging: light
6
+ changed_files: false
7
+ filter_messages: false
data/CHANGELOG.md ADDED
@@ -0,0 +1,42 @@
1
+ # Changelog
2
+
3
+ ## Release 1.5.0
4
+
5
+ * Add rbs/steep, and enforce types in CI (.rbs file is exported as part
6
+ of the gem) (#28, resolves #21)
7
+ * Support env-based customization of the truthy/falsey strings used by
8
+ `ENV.boolean` (#29, resolves #27)
9
+ * Update github workflows to use checkout@v4 (which should have no real
10
+ impact on us, aside from staying current). (#30)
11
+ * Update README to explain `ENV.array`
12
+
13
+ ## Release 1.4.0
14
+
15
+ * Drop support for ruby 2.6
16
+ * Setup `quiet_quality` through the gemspec
17
+ * Setup `markdownlint` and comply with its rules (#25)
18
+ * Setup `rspec-cover_it` to enforce test-coverage (#24)
19
+
20
+ ## Release 1.3.0
21
+
22
+ * Support `ENV.date_time` (#19, resolves #6)
23
+
24
+ ## Release 1.2.1
25
+
26
+ * Require `set` before loading the gem, since we support rubies before 3.2 (#18)
27
+
28
+ ## Release 1.2.0
29
+
30
+ * Support `ENV.file_path` returning Pathname objects (#16, resolves #13)
31
+
32
+ ## Release 1.1.0
33
+
34
+ * Support `ENV.integer_range` (#15, resolves #5)
35
+
36
+ ## Release 1.0.1
37
+
38
+ * Specify dependencies more tightly (#14)
39
+
40
+ ## Release 1.0.0
41
+
42
+ (Initial release)
data/Gemfile CHANGED
@@ -1,3 +1,7 @@
1
1
  source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
+
5
+ unless ENV["NO_STEEP"]
6
+ gem "steep", "~> 1.6.0"
7
+ end
data/README.md CHANGED
@@ -1,36 +1,40 @@
1
1
  # EnvironmentHelpers
2
- This gem adds a set of convenience helpers to `ENV`, allowing you to access environment variables
3
- in a more structures and consistent way. Have you seen any line like these?
4
2
 
5
- ```
3
+ This gem adds a set of convenience helpers to `ENV`, allowing you to access
4
+ environment variables in a more structures and consistent way. Have you seen
5
+ any line like these?
6
+
7
+ ```ruby
6
8
  enable_bar = ENV.fetch("ENABLE_BAR", "false") == "true"
7
9
  foo_count = ENV.fetch("FOO_TOTAL", "100").to_i
8
10
  ```
9
11
 
10
- This works okay! And it's not really that complicated, working out what's going on here isn't
11
- that difficult. How about this?
12
+ This works okay! And it's not really that complicated, working out what's going
13
+ on here isn't that difficult. How about this?
12
14
 
13
- ```
15
+ ```ruby
14
16
  enable_foo = ENV.fetch("ENABLE_FOO", "false") != "true"
15
17
  ```
16
18
 
17
- That.. looks very similar, but means the opposite thing. Also not that tricky. You don't start
18
- to _wish_ for a tool like EnvironmentHelpers until these constructions get complex and compounded.
19
- But.. if you're using a 12-factor style of configuration, you probably have these ENV-fetches
20
- sprinkled _everywhere_, so making them moderately clearer or simpler can pay off fairly quickly.
19
+ That.. looks very similar, but means the opposite thing. Also not that tricky.
20
+ You don't start to _wish_ for a tool like EnvironmentHelpers until these
21
+ constructions get complex and compounded. But.. if you're using a 12-factor
22
+ style of configuration, you probably have these ENV-fetches sprinkled
23
+ _everywhere_, so making them moderately clearer or simpler can pay off fairly
24
+ quickly.
21
25
 
22
26
  ## Installation
23
27
 
24
- ```
28
+ ```ruby
25
29
  gem "environment_helper"
26
30
  ```
27
31
 
28
- There's not much to it - add the gem to your gemfile and when it's loaded it'll add some extra
29
- methods onto `ENV` for your use.
32
+ There's not much to it - add the gem to your gemfile and when it's loaded it'll
33
+ add some extra methods onto `ENV` for your use.
30
34
 
31
35
  ## Usage
32
36
 
33
- ```shell
37
+ ```ruby
34
38
  ENV.string("APP_NAME", default: "local")
35
39
  ENV.symbol("BUSINESS_DOMAIN", default: :engineering, required: true)
36
40
  ENV.boolean("ENABLE_FEATURE_FOO", default: false)
@@ -39,34 +43,58 @@ ENV.integer("MAX_THREAD_COUNT", default: 5)
39
43
  ENV.file_path("FILE_PATH", default: "/some/path", required: true)
40
44
  ENV.date("SCHEDULED_DATE", required: true, format: "%Y-%m-%d")
41
45
  ENV.date_time("RUN_AT", required: true, default: DateTime.now)
46
+ ENV.array("QUEUE_NAMES", of: :strings, required: false, default: ["high", "low"])
42
47
  ```
43
48
 
44
- Each of the supplied methods takes a positional parameter for the name of the environment variable,
45
- and then two optional named parameters `default` and `required` (there's no point in supplying
46
- both, but nothing stops you from doing so). The `default` value is the value used if the variable
47
- isn't present in the environment. If `required` is set to a truthy value, then if the variable isn't
48
- present in the environment, an `EnvironmentHelpers::MissingVariableError` is raised.
49
+ Each of the supplied methods takes a positional parameter for the name of the
50
+ environment variable, and then two optional named parameters `default` and
51
+ `required` (there's no point in supplying both, but nothing stops you from doing
52
+ so). The `default` value is the value used if the variable isn't present in the
53
+ environment. If `required` is set to a truthy value, then if the variable isn't
54
+ present in the environment, an `EnvironmentHelpers::MissingVariableError` is
55
+ raised.
49
56
 
50
57
  The available methods added to `ENV`:
51
58
 
52
- * `string` - environment values are already strings, so this is the simplest of the methods.
53
- * `symbol` - produces a symbol, and enforces that the default value is either `nil` or a Symbol.
54
- * `boolean` - produces `nil`, `true`, or `false` (and only allows those as defaults). Supports..
55
- a fair variety of strings to map onto those boolean value, though you should probably just use
56
- "true" and "false" really. If you specify `required: true` and get a value like "maybe?", it'll
57
- raise an `EnvironmentHelpers::InvalidBooleanText` exception.
58
- * `integer_range` - produces an integer Range object. It accepts `N-N`, `N..N`, or `N...N`, (the
59
- latter means 'excluding the upper bound, as in ruby).
60
- * `integer` - produces an integer from the environment variable, by calling `to_i` on it (if it's
61
- present). Note that this means that providing a value like "hello" means you'll get `0`, since
62
- that's what ruby does when you call `"hello".to_i`.
63
- * `file_path` - produces a `Pathname` initialized with the path specified by the environment variable.
64
- * `date` - produces a `Date` object, using `Date.strptime`. The default format string is `%Y-%m-%d`,
65
- which would parse a date like `2023-12-25`. It will handle invalid values (or format strings) like
66
- the variable not being present, though if it's specified as `required`, you will see a different
67
- exception in each case.
68
- * `date_time` - produces a `DateTime` object, using either `DateTime.strptime` or `DateTime.iso8601`.
69
- The default format is `:iso8601`, and `:unix` is also an allowed 'format'. But if it is supplied
70
- as a _string_, it will be handled as a strptime format string (the `:unix` format is equivalent to
71
- the format string `"%s"`). It handles invalid or unparseable values like `ENV.date` does, in that
72
- they are treated as if not supplied.
59
+ * `string` - environment values are already strings, so this is the simplest of
60
+ the methods.
61
+ * `symbol` - produces a symbol, and enforces that the default value is either
62
+ `nil` or a Symbol.
63
+ * `boolean` - produces `nil`, `true`, or `false` (and only allows those as
64
+ defaults). Supports.. a fair variety of strings to map onto those boolean
65
+ value, though you should probably just use "true" and "false" really. If you
66
+ specify `required: true` and get a value like "maybe?", it'll raise an
67
+ `EnvironmentHelpers::InvalidBooleanText` exception.
68
+ * `integer_range` - produces an integer Range object. It accepts `N-N`, `N..N`,
69
+ or `N...N`, (the latter means 'excluding the upper bound, as in ruby).
70
+ * `integer` - produces an integer from the environment variable, by calling
71
+ `to_i` on it (if it's present). Note that this means that providing a value
72
+ like "hello" means you'll get `0`, since that's what ruby does when you call
73
+ `"hello".to_i`.
74
+ * `file_path` - produces a `Pathname` initialized with the path specified by the
75
+ environment variable.
76
+ * `date` - produces a `Date` object, using `Date.strptime`. The default format
77
+ string is `%Y-%m-%d`, which would parse a date like `2023-12-25`. It will
78
+ handle invalid values (or format strings) like the variable not being present,
79
+ though if it's specified as `required`, you will see a different exception in
80
+ each case.
81
+ * `date_time` - produces a `DateTime` object, using either `DateTime.strptime`
82
+ or `DateTime.iso8601`. The default format is `:iso8601`, and `:unix` is also
83
+ an allowed 'format'. But if it is supplied as a _string_, it will be handled
84
+ as a strptime format string (the `:unix` format is equivalent to the format
85
+ string `"%s"`). It handles invalid or unparseable values like `ENV.date` does,
86
+ in that they are treated as if not supplied.
87
+ * `array` - produces an array of strings, symbols, or integers, depending on the
88
+ value of the `of` parameter. You can specify the delimiter using a `delimiter`
89
+ parameter (it defaults to a comma).
90
+
91
+ ## Configuration
92
+
93
+ If you want to specify your own list of truthy/falsey strings, you can do that
94
+ by setting either or both of these environment variables, supplying comma-
95
+ separated (whitespace-free) strings:
96
+
97
+ * `ENVIRONMENT_HELPERS_TRUTHY_STRINGS` - the default value used is
98
+ `true,yes,on,enabled,enable,allow,t,y,1,ok,okay`
99
+ * `ENVIRONMENT_HELPERS_FALSEY_STRINGS` - the default value used is
100
+ `false,no,off,disabled,disable,deny,f,n,0,nope`
data/Steepfile ADDED
@@ -0,0 +1,17 @@
1
+ D = Steep::Diagnostic
2
+
3
+ target :lib do
4
+ signature "sig"
5
+ check "lib"
6
+ configure_code_diagnostics(D::Ruby.default)
7
+ library "pathname"
8
+ library "date"
9
+ end
10
+
11
+ target :test do
12
+ signature "sig"
13
+ check "test"
14
+ configure_code_diagnostics(D::Ruby.default)
15
+ library "pathname"
16
+ library "date"
17
+ end
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
  DESC
14
14
  spec.homepage = "https://github.com/nevinera/environment_helpers"
15
15
  spec.license = "MIT"
16
- spec.required_ruby_version = Gem::Requirement.new(">= 2.6.0")
16
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
17
17
 
18
18
  spec.metadata["homepage_uri"] = spec.homepage
19
19
  spec.metadata["source_code_uri"] = spec.homepage
@@ -30,7 +30,10 @@ Gem::Specification.new do |spec|
30
30
 
31
31
  spec.add_development_dependency "rspec", "~> 3.10"
32
32
  spec.add_development_dependency "simplecov", "~> 0.22.0"
33
+ spec.add_development_dependency "rspec-cover_it", "~> 0.1.0"
33
34
  spec.add_development_dependency "pry", "~> 0.14"
34
35
  spec.add_development_dependency "standard", "~> 1.28"
35
36
  spec.add_development_dependency "rubocop", "~> 1.50"
37
+ spec.add_development_dependency "quiet_quality", "~> 1.3.0"
38
+ spec.add_development_dependency "mdl", "~> 0.12"
36
39
  end
@@ -1,7 +1,5 @@
1
1
  module EnvironmentHelpers
2
2
  module BooleanHelpers
3
- TRUTHY_STRINGS = %w[true yes on enabled enable allow t y 1 ok okay].to_set
4
- FALSEY_STRINGS = %w[false no off disabled disable deny f n 0 nope].to_set
5
3
  BOOLEAN_VALUES = [true, false, nil].to_set
6
4
 
7
5
  def boolean(name, default: nil, required: false)
@@ -19,12 +17,26 @@ module EnvironmentHelpers
19
17
 
20
18
  def truthy_text?(text)
21
19
  return false if text.nil?
22
- TRUTHY_STRINGS.include?(text.strip.downcase)
20
+ truthy_strings.include?(text.strip.downcase)
23
21
  end
24
22
 
25
23
  def falsey_text?(text)
26
24
  return false if text.nil?
27
- FALSEY_STRINGS.include?(text.strip.downcase)
25
+ falsey_strings.include?(text.strip.downcase)
26
+ end
27
+
28
+ def truthy_strings
29
+ @_truthy_strings ||=
30
+ ENV.fetch("ENVIRONMENT_HELPERS_TRUTHY_STRINGS", "true,yes,on,enabled,enable,allow,t,y,1,ok,okay")
31
+ .split(",")
32
+ .to_set
33
+ end
34
+
35
+ def falsey_strings
36
+ @_falsey_strings ||=
37
+ ENV.fetch("ENVIRONMENT_HELPERS_FALSEY_STRINGS", "false,no,off,disabled,disable,deny,f,n,0,nope")
38
+ .split(",")
39
+ .to_set
28
40
  end
29
41
  end
30
42
  end
@@ -0,0 +1,45 @@
1
+ module EnvironmentHelpers
2
+ module EnumerableHelpers
3
+ VALID_TYPES = %i[strings symbols integers]
4
+
5
+ TYPE_HANDLERS = {
6
+ integers: :to_i,
7
+ strings: :to_s,
8
+ symbols: :to_sym
9
+ }
10
+
11
+ TYPE_MAP = {
12
+ integers: Integer,
13
+ strings: String,
14
+ symbols: Symbol
15
+ }
16
+
17
+ def array(key, of: :strings, delimiter: ",", default: nil, required: false)
18
+ check_default_type(:array, default, Array)
19
+ check_valid_data_type!(of)
20
+ check_default_data_types!(default, of)
21
+
22
+ values = fetch_value(key, required: required)
23
+ return default if values.nil?
24
+
25
+ values.split(delimiter).map { |value| value.send(TYPE_HANDLERS[of]) }
26
+ end
27
+
28
+ private
29
+
30
+ def check_valid_data_type!(type)
31
+ unless VALID_TYPES.include?(type)
32
+ fail(InvalidType, "Valid types: #{VALID_TYPES.join(", ")}. Got: #{type}.")
33
+ end
34
+ end
35
+
36
+ def check_default_data_types!(default, type)
37
+ return if default.nil?
38
+ invalid = Array(default).reject { |val| val.is_a? TYPE_MAP[type] }
39
+
40
+ unless invalid.empty?
41
+ fail(BadDefault, "Default array contains values not of type `#{type}': #{invalid.join(", ")}")
42
+ end
43
+ end
44
+ end
45
+ end
@@ -6,7 +6,7 @@ module EnvironmentHelpers
6
6
  check_range_endpoint(:integer_range, default.end) if default
7
7
 
8
8
  text = fetch_value(name, required: required)
9
- range = parse_range_from(text)
9
+ range = text ? parse_range_from(text) : nil
10
10
  return range if range
11
11
  return default unless required
12
12
  fail(InvalidRangeText, "Required Integer Range environment variable #{name} had inappropriate content '#{text}'")
@@ -6,7 +6,7 @@ module EnvironmentHelpers
6
6
 
7
7
  def symbol(name, default: nil, required: false)
8
8
  check_default_type(:symbol, default, Symbol)
9
- string(name, default: default, required: required)&.to_sym
9
+ string(name, default: default&.to_s, required: required)&.to_sym
10
10
  end
11
11
  end
12
12
  end
@@ -1,3 +1,3 @@
1
1
  module EnvironmentHelpers
2
- VERSION = "1.3.0"
2
+ VERSION = "1.5.0"
3
3
  end
@@ -2,13 +2,14 @@
2
2
  # And we're compatible back to 2.6
3
3
  require "set" # rubocop:disable Lint/RedundantRequireStatement
4
4
 
5
- require_relative "./environment_helpers/access_helpers"
6
- require_relative "./environment_helpers/string_helpers"
7
- require_relative "./environment_helpers/boolean_helpers"
8
- require_relative "./environment_helpers/range_helpers"
9
- require_relative "./environment_helpers/numeric_helpers"
10
- require_relative "./environment_helpers/file_helpers"
11
- require_relative "./environment_helpers/datetime_helpers"
5
+ require_relative "environment_helpers/access_helpers"
6
+ require_relative "environment_helpers/string_helpers"
7
+ require_relative "environment_helpers/boolean_helpers"
8
+ require_relative "environment_helpers/range_helpers"
9
+ require_relative "environment_helpers/numeric_helpers"
10
+ require_relative "environment_helpers/file_helpers"
11
+ require_relative "environment_helpers/datetime_helpers"
12
+ require_relative "environment_helpers/enumerable_helpers"
12
13
 
13
14
  module EnvironmentHelpers
14
15
  Error = Class.new(::StandardError)
@@ -16,6 +17,7 @@ module EnvironmentHelpers
16
17
  BadDefault = Class.new(Error)
17
18
  BadFormat = Class.new(Error)
18
19
 
20
+ InvalidType = Class.new(Error)
19
21
  InvalidValue = Class.new(Error)
20
22
  InvalidBooleanText = Class.new(InvalidValue)
21
23
  InvalidRangeText = Class.new(InvalidValue)
@@ -30,6 +32,7 @@ module EnvironmentHelpers
30
32
  include NumericHelpers
31
33
  include FileHelpers
32
34
  include DatetimeHelpers
35
+ include EnumerableHelpers
33
36
  end
34
37
 
35
38
  ENV.extend(EnvironmentHelpers)
@@ -0,0 +1,96 @@
1
+ module EnvironmentHelpers
2
+ VERSION: String
3
+
4
+ class Error < StandardError
5
+ end
6
+
7
+ class MissingVariableError < Error
8
+ end
9
+
10
+ class BadDefault < Error
11
+ end
12
+
13
+ class BadFormat < Error
14
+ end
15
+
16
+ class InvalidType < Error
17
+ end
18
+
19
+ class InvalidValue < Error
20
+ end
21
+
22
+ class InvalidBooleanText < InvalidValue
23
+ end
24
+
25
+ class InvalidRangeText < InvalidValue
26
+ end
27
+
28
+ class InvalidIntegerText < InvalidValue
29
+ end
30
+
31
+ class InvalidDateText < InvalidValue
32
+ end
33
+
34
+ class InvalidDateTimeText < InvalidValue
35
+ end
36
+
37
+ module AccessHelpers
38
+ # (Actually provided by ENV, which these are all extended onto)
39
+ def fetch: (String name) -> String?
40
+ | (String name, String? default) -> String?
41
+
42
+ private def fetch_value: (String name, required: bool) -> String?
43
+ private def check_default_type: (String | Symbol context, untyped value, *Class types) -> void
44
+ private def check_default_value: (String | Symbol context, untyped value, allow: Enumerable[untyped]) -> void
45
+ end
46
+
47
+ module FileHelpers : AccessHelpers
48
+ def file_path: (String name, default: String?, required: bool) -> Pathname?
49
+ end
50
+
51
+ module DatetimeHelpers : AccessHelpers
52
+ type date_time_result = DateTime? | Time?
53
+ def date: (String name, format: String, default: Date?, required: bool) -> Date?
54
+ def date_time: (String name, format: String | Symbol, default: date_time_result, required: bool) -> date_time_result
55
+ private def parse_date_from: (String? text, format: String) -> Date?
56
+ private def parse_date_time_from: (String? text, format: String | Symbol) -> DateTime?
57
+ private def iso8601_date_time: (String) -> DateTime?
58
+ private def unix_date_time: (String) -> DateTime?
59
+ private def strptime_date_time: (String, format: String) -> DateTime?
60
+ end
61
+
62
+ module NumericHelpers : AccessHelpers
63
+ def integer: (String name, default: Integer?, required: bool) -> Integer?
64
+ end
65
+
66
+ module RangeHelpers : AccessHelpers
67
+ def integer_range: (String name, default: Range[Integer]?, required: bool) -> Range[Integer]?
68
+ private def check_range_endpoint: (String | Symbol context, untyped value) -> void
69
+ private def parse_range_bound_from: (String?) -> Integer?
70
+ private def parse_range_from: (String) -> Range[Integer]?
71
+ end
72
+
73
+ module BooleanHelpers : AccessHelpers
74
+ BOOLEAN_VALUES: Set[bool]
75
+ def boolean: (String name, default: bool?, required: bool) -> boolish
76
+ private def truthy_text?: (String?) -> boolish
77
+ private def falsey_text?: (String?) -> boolish
78
+ private def truthy_strings: () -> Set[String]
79
+ private def falsey_strings: () -> Set[String]
80
+ end
81
+
82
+ module EnumerableHelpers : AccessHelpers
83
+ VALID_TYPES: Array[Symbol]
84
+ TYPE_HANDLERS: Hash[Symbol, Symbol]
85
+ TYPE_MAP: Hash[Symbol, Class]
86
+ type arrayable = Integer | String | Symbol
87
+ def array: (String key, of: Symbol, delimiter: String, default: Array[arrayable]?, required: bool) -> Array[arrayable]?
88
+ private def check_valid_data_type!: (Symbol) -> void
89
+ private def check_default_data_types!: (Array[arrayable]?, Symbol) -> void
90
+ end
91
+
92
+ module StringHelpers : AccessHelpers
93
+ def string: (String name, default: String?, required: bool) -> String?
94
+ def symbol: (String name, default: Symbol?, required: bool) -> Symbol?
95
+ end
96
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: environment_helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Mueller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-16 00:00:00.000000000 Z
11
+ date: 2023-11-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.22.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-cover_it
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.1.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.1.0
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: pry
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +94,34 @@ dependencies:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
96
  version: '1.50'
97
+ - !ruby/object:Gem::Dependency
98
+ name: quiet_quality
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 1.3.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 1.3.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: mdl
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.12'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.12'
83
125
  description: |
84
126
  Convenience helpers for more simply accessing data passed to applications through the
85
127
  environment that may have types and/or defaults
@@ -89,24 +131,33 @@ executables: []
89
131
  extensions: []
90
132
  extra_rdoc_files: []
91
133
  files:
92
- - ".github/workflows/lint.yml"
134
+ - ".github/workflows/quality.yml"
93
135
  - ".github/workflows/rspec.yml"
136
+ - ".github/workflows/type_check.yml"
94
137
  - ".gitignore"
138
+ - ".mdl_rules.rb"
139
+ - ".mdlrc"
140
+ - ".quiet_quality.ci-cd.yml"
141
+ - ".quiet_quality.yml"
95
142
  - ".rspec"
96
143
  - ".rubocop.yml"
144
+ - CHANGELOG.md
97
145
  - Gemfile
98
146
  - LICENSE
99
147
  - README.md
148
+ - Steepfile
100
149
  - environment_helpers.gemspec
101
150
  - lib/environment_helpers.rb
102
151
  - lib/environment_helpers/access_helpers.rb
103
152
  - lib/environment_helpers/boolean_helpers.rb
104
153
  - lib/environment_helpers/datetime_helpers.rb
154
+ - lib/environment_helpers/enumerable_helpers.rb
105
155
  - lib/environment_helpers/file_helpers.rb
106
156
  - lib/environment_helpers/numeric_helpers.rb
107
157
  - lib/environment_helpers/range_helpers.rb
108
158
  - lib/environment_helpers/string_helpers.rb
109
159
  - lib/environment_helpers/version.rb
160
+ - sig/environment_helpers.rbs
110
161
  homepage: https://github.com/nevinera/environment_helpers
111
162
  licenses:
112
163
  - MIT
@@ -121,14 +172,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
121
172
  requirements:
122
173
  - - ">="
123
174
  - !ruby/object:Gem::Version
124
- version: 2.6.0
175
+ version: 2.7.0
125
176
  required_rubygems_version: !ruby/object:Gem::Requirement
126
177
  requirements:
127
178
  - - ">="
128
179
  - !ruby/object:Gem::Version
129
180
  version: '0'
130
181
  requirements: []
131
- rubygems_version: 3.1.6
182
+ rubygems_version: 3.4.10
132
183
  signing_key:
133
184
  specification_version: 4
134
185
  summary: A set of convenience methods for accessing environment data
@@ -1,30 +0,0 @@
1
- name: Linters
2
-
3
- on: [push]
4
-
5
- jobs:
6
- StandardRB:
7
- runs-on: ubuntu-latest
8
- steps:
9
- - uses: actions/checkout@v2
10
-
11
- - name: Set up ruby
12
- uses: ruby/setup-ruby@v1
13
- with:
14
- ruby-version: 3.2
15
-
16
- - name: Cache gems
17
- uses: actions/cache@v1
18
- with:
19
- path: vendor/bundle
20
- key: ${{ runner.os }}-linters-${{ hashFiles('Gemfile.lock') }}
21
- restore-keys:
22
- ${{ runner.os }}-linters-
23
- - name: Install gems
24
- run: bundle install --jobs 4 --retry 3
25
-
26
- - name: Run standard
27
- run: bundle exec standardrb
28
-
29
- - name: Run rubocop (complexity checks)
30
- run: bundle exec rubocop --parallel