kettle-dev 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.
data/lib/kettle/dev.rb ADDED
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ # External gems
4
+ # It's not reasonable to test this ENV variable
5
+ # :nocov:
6
+ require "require_bench" if ENV.fetch("REQUIRE_BENCH", "false").casecmp("true").zero?
7
+ # :nocov:
8
+ require "version_gem"
9
+ require_relative "dev/version"
10
+
11
+ module Kettle
12
+ module Dev
13
+ # Base error type for kettle-dev.
14
+ class Error < StandardError; end
15
+
16
+ # Whether debug logging is enabled for kettle-dev internals.
17
+ # @return [Boolean]
18
+ DEBUGGING = ENV.fetch("DEBUG", "false").casecmp("true").zero?
19
+ # Whether we are running on CI.
20
+ # @return [Boolean]
21
+ IS_CI = ENV.fetch("CI", "false").casecmp("true") == 0
22
+ # Whether to benchmark requires with require_bench.
23
+ # @return [Boolean]
24
+ REQUIRE_BENCH = ENV.fetch("REQUIRE_BENCH", "false").casecmp("true").zero?
25
+
26
+ @defaults = []
27
+
28
+ class << self
29
+ # Install Rake tasks useful for development and tests.
30
+ #
31
+ # Adds RuboCop-LTS tasks, coverage tasks, and loads the
32
+ # gem-shipped rakelib directory so host projects get tasks from this gem.
33
+ # @return [void]
34
+ def install_tasks
35
+ linting_tasks
36
+ coverage_tasks
37
+ load("kettle/dev/tasks.rb")
38
+ end
39
+
40
+ # Registry for tasks that should be prerequisites of the default task
41
+ # @return [Array<String>]
42
+ attr_reader :defaults
43
+
44
+ # Register a task name to be run by the default task.
45
+ # Also enhances the :default task immediately if it exists.
46
+ # @param task_name [String, Symbol]
47
+ # @return [Array<String>] the updated defaults registry
48
+ def register_default(task_name)
49
+ task_name = task_name.to_s
50
+ unless defaults.include?(task_name)
51
+ defaults << task_name
52
+ if defined?(Rake) && Rake::Task.task_defined?(:default)
53
+ begin
54
+ Rake::Task[:default].enhance([task_name])
55
+ rescue StandardError => e
56
+ Kernel.warn("kettle-dev: failed to enhance :default with #{task_name}: #{e.message}") if DEBUGGING
57
+ end
58
+ end
59
+ end
60
+ defaults
61
+ end
62
+
63
+ private
64
+
65
+ ### LINTING TASKS
66
+ # Set up rubocop-lts, which cascades to rubocop-rubyX_X => rubocop_gradual)
67
+ # @return [void]
68
+ def linting_tasks
69
+ begin
70
+ # Lazy loaded because it won't be installed for Ruby < 2.7
71
+ require "rubocop/lts"
72
+
73
+ Rubocop::Lts.install_tasks
74
+ if Kettle::Dev::IS_CI
75
+ Kettle::Dev.register_default("rubocop_gradual:check")
76
+ else
77
+ Kettle::Dev.register_default("rubocop_gradual:autocorrect")
78
+ end
79
+ rescue LoadError
80
+ # OK, no styles for you.
81
+ end
82
+ end
83
+
84
+ ### TEST COVERAGE TASKS
85
+ # Set up kettle-soup-cover
86
+ # @return [void]
87
+ def coverage_tasks
88
+ begin
89
+ # Lazy loaded because it won't be installed for Ruby < 2.7
90
+ require "kettle-soup-cover"
91
+
92
+ Kettle::Soup::Cover.install_tasks
93
+ # NOTE: Coverage on CI is configured independent of this task.
94
+ # This task is for local development, as it opens results in browser
95
+ # :nocov:
96
+ Kettle::Dev.register_default("coverage") unless Kettle::Dev::IS_CI
97
+ # :nocov:
98
+ rescue LoadError
99
+ # OK, no soup for you.
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ Kettle::Dev::Version.class_eval do
107
+ extend VersionGem::Basic
108
+ end
@@ -0,0 +1,15 @@
1
+ # Stolen lovingly from @ticky:
2
+ # https://github.com/ticky/ruby-emoji-regex/blob/develop/lib/emoji_regex.rb
3
+ # because that project is Ruby >= 2.4, and this project is Ruby >= 2.3.
4
+ # That project is under the MIT license, same as this project:
5
+ # https://github.com/ticky/ruby-emoji-regex/blob/develop/LICENSE.md
6
+ # If the minimum_ruby_version numbers align, will switch to a real dependency.
7
+ # Wrapping it in a namespace to avoid collisions with the real emoji_regex.
8
+ module Kettle
9
+ module EmojiRegex
10
+ # Matches characters which are emoji, as defined by the Unicode standard's `emoji-test` data file, https://unicode.org/Public/emoji/14.0/emoji-test.txt
11
+ #
12
+ # "#️⃣" (U+0023,U+FE0F,U+20E3) is matched, but not "#️" (U+0023,U+FE0F) or "#" (U+0023).
13
+ REGEX = /[#*0-9]\uFE0F?\u20E3|[\u00A9\u00AE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F202}\u{1F237}\u{1F321}\u{1F324}-\u{1F32C}\u{1F336}\u{1F37D}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}\u{1F39F}\u{1F3CD}\u{1F3CE}\u{1F3D4}-\u{1F3DF}\u{1F3F5}\u{1F3F7}\u{1F43F}\u{1F4FD}\u{1F549}\u{1F54A}\u{1F56F}\u{1F570}\u{1F573}\u{1F576}-\u{1F579}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}\u{1F6CB}\u{1F6CD}-\u{1F6CF}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6F0}\u{1F6F3}]\uFE0F?|[\u261D\u270C\u270D\u{1F574}\u{1F590}][\uFE0F\u{1F3FB}-\u{1F3FF}]?|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\uFE0F\u{1F3FB}-\u{1F3FF}]?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\u270A\u270B\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F57A}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91F}\u{1F930}-\u{1F934}\u{1F936}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}\u{1F9D3}\u{1F9D5}\u{1FAC3}-\u{1FAC5}\u{1FAF0}\u{1FAF2}-\u{1FAF8}][\u{1F3FB}-\u{1F3FF}]?|[\u{1F3C3}\u{1F6B6}\u{1F9CE}][\u{1F3FB}-\u{1F3FF}]?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|[\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}\u{1F6B5}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\u{1F46F}\u{1F9DE}\u{1F9DF}](?:\u200D[\u2640\u2642]\uFE0F?)?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F343}\u{1F345}-\u{1F34A}\u{1F34C}-\u{1F37C}\u{1F37E}-\u{1F384}\u{1F386}-\u{1F393}\u{1F3A0}-\u{1F3C1}\u{1F3C5}\u{1F3C6}\u{1F3C8}\u{1F3C9}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F8}-\u{1F407}\u{1F409}-\u{1F414}\u{1F416}-\u{1F425}\u{1F427}-\u{1F43A}\u{1F43C}-\u{1F43E}\u{1F440}\u{1F444}\u{1F445}\u{1F451}-\u{1F465}\u{1F46A}\u{1F479}-\u{1F47B}\u{1F47D}-\u{1F480}\u{1F484}\u{1F488}-\u{1F48E}\u{1F490}\u{1F492}-\u{1F4A9}\u{1F4AB}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F5A4}\u{1F5FB}-\u{1F62D}\u{1F62F}-\u{1F634}\u{1F637}-\u{1F641}\u{1F643}\u{1F644}\u{1F648}-\u{1F64A}\u{1F680}-\u{1F6A2}\u{1F6A4}-\u{1F6B3}\u{1F6B7}-\u{1F6BF}\u{1F6C1}-\u{1F6C5}\u{1F6D0}-\u{1F6D2}\u{1F6D5}-\u{1F6D7}\u{1F6DC}-\u{1F6DF}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FC}\u{1F7E0}-\u{1F7EB}\u{1F7F0}\u{1F90D}\u{1F90E}\u{1F910}-\u{1F917}\u{1F920}-\u{1F925}\u{1F927}-\u{1F92F}\u{1F93A}\u{1F93F}-\u{1F945}\u{1F947}-\u{1F976}\u{1F978}-\u{1F9B4}\u{1F9B7}\u{1F9BA}\u{1F9BC}-\u{1F9CC}\u{1F9D0}\u{1F9E0}-\u{1F9FF}\u{1FA70}-\u{1FA7C}\u{1FA80}-\u{1FA88}\u{1FA90}-\u{1FABD}\u{1FABF}-\u{1FAC2}\u{1FACE}-\u{1FADB}\u{1FAE0}-\u{1FAE8}]|\u26D3\uFE0F?(?:\u200D\u{1F4A5})?|\u2764\uFE0F?(?:\u200D[\u{1F525}\u{1FA79}])?|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1F4}\u{1F1F2}|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1F6}\u{1F1E6}|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FD}\u{1F1F0}|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F344}(?:\u200D\u{1F7EB})?|\u{1F34B}(?:\u200D\u{1F7E9})?|\u{1F3F3}\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\u{1F308}))?|\u{1F3F4}(?:\u200D\u2620\uFE0F?|\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0073}\u{E0063}\u{E0074}|\u{E0077}\u{E006C}\u{E0073})\u{E007F})?|\u{1F408}(?:\u200D\u2B1B)?|\u{1F415}(?:\u200D\u{1F9BA})?|\u{1F426}(?:\u200D[\u2B1B\u{1F525}])?|\u{1F43B}(?:\u200D\u2744\uFE0F?)?|\u{1F441}\uFE0F?(?:\u200D\u{1F5E8}\uFE0F?)?|\u{1F468}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}(?:\u200D\u{1F466})?|\u{1F467}(?:\u200D[\u{1F466}\u{1F467}])?)|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:\u{1F48B}\u200D)?\u{1F468}|\u{1F466}(?:\u200D\u{1F466})?|\u{1F467}(?:\u200D[\u{1F466}\u{1F467}])?)|\u{1F3FB}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:\u{1F48B}\u200D)?\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]))?|\u{1F3FC}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:\u{1F48B}\u200D)?\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]))?|\u{1F3FD}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:\u{1F48B}\u200D)?\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]))?|\u{1F3FE}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:\u{1F48B}\u200D)?\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]))?|\u{1F3FF}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:\u{1F48B}\u200D)?\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]))?)?|\u{1F469}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:\u{1F48B}\u200D)?[\u{1F468}\u{1F469}]|\u{1F466}(?:\u200D\u{1F466})?|\u{1F467}(?:\u200D[\u{1F466}\u{1F467}])?|\u{1F469}\u200D(?:\u{1F466}(?:\u200D\u{1F466})?|\u{1F467}(?:\u200D[\u{1F466}\u{1F467}])?))|\u{1F3FB}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:[\u{1F468}\u{1F469}]|\u{1F48B}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FF}]|\u{1F91D}\u200D[\u{1F468}\u{1F469}][\u{1F3FC}-\u{1F3FF}]))?|\u{1F3FC}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:[\u{1F468}\u{1F469}]|\u{1F48B}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FF}]|\u{1F91D}\u200D[\u{1F468}\u{1F469}][\u{1F3FB}\u{1F3FD}-\u{1F3FF}]))?|\u{1F3FD}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:[\u{1F468}\u{1F469}]|\u{1F48B}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FF}]|\u{1F91D}\u200D[\u{1F468}\u{1F469}][\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]))?|\u{1F3FE}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:[\u{1F468}\u{1F469}]|\u{1F48B}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FF}]|\u{1F91D}\u200D[\u{1F468}\u{1F469}][\u{1F3FB}-\u{1F3FD}\u{1F3FF}]))?|\u{1F3FF}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:[\u{1F468}\u{1F469}]|\u{1F48B}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FF}]|\u{1F91D}\u200D[\u{1F468}\u{1F469}][\u{1F3FB}-\u{1F3FE}]))?)?|\u{1F62E}(?:\u200D\u{1F4A8})?|\u{1F635}(?:\u200D\u{1F4AB})?|\u{1F636}(?:\u200D\u{1F32B}\uFE0F?)?|\u{1F642}(?:\u200D[\u2194\u2195]\uFE0F?)?|\u{1F93C}(?:[\u{1F3FB}-\u{1F3FF}]|\u200D[\u2640\u2642]\uFE0F?)?|\u{1F9D1}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u{1F91D}\u200D\u{1F9D1}|\u{1F9D1}\u200D\u{1F9D2}(?:\u200D\u{1F9D2})?|\u{1F9D2}(?:\u200D\u{1F9D2})?)|\u{1F3FB}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}[\u{1F3FC}-\u{1F3FF}]|\u{1F91D}\u200D\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]))?|\u{1F3FC}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|\u{1F91D}\u200D\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]))?|\u{1F3FD}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|\u{1F91D}\u200D\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]))?|\u{1F3FE}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|\u{1F91D}\u200D\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]))?|\u{1F3FF}(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|[\u{1F9AF}\u{1F9BC}\u{1F9BD}](?:\u200D\u27A1\uFE0F?)?|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u2764\uFE0F?\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}[\u{1F3FB}-\u{1F3FE}]|\u{1F91D}\u200D\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]))?)?|\u{1FAF1}(?:\u{1F3FB}(?:\u200D\u{1FAF2}[\u{1F3FC}-\u{1F3FF}])?|\u{1F3FC}(?:\u200D\u{1FAF2}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}])?|\u{1F3FD}(?:\u200D\u{1FAF2}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}])?|\u{1F3FE}(?:\u200D\u{1FAF2}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}])?|\u{1F3FF}(?:\u200D\u{1FAF2}[\u{1F3FB}-\u{1F3FE}])?)?/
14
+ end
15
+ end
data/lib/kettle-dev.rb ADDED
@@ -0,0 +1,23 @@
1
+ # rubocop:disable Naming/FileName# USAGE:
2
+ # In your `spec/spec_helper.rb`,
3
+ # just prior to loading the library under test:
4
+ #
5
+ # require "kettle-dev"
6
+ #
7
+ # In your `Rakefile` file:
8
+ #
9
+ # require "kettle/dev"
10
+ # Kettle::Dev.install_tasks
11
+ #
12
+
13
+ # For technical reasons, if we move to Zeitwerk, this cannot be require_relative.
14
+ # See: https://github.com/fxn/zeitwerk#for_gem_extension
15
+ # Hook for other libraries to load this library (e.g. via bundler)
16
+ #
17
+ # @example In your spec/spec_helper.rb
18
+ # require "kettle-dev"
19
+ # @example In your Rakefile
20
+ # require "kettle/dev"
21
+ # Kettle::Dev.install_tasks
22
+ require "kettle/dev"
23
+ # rubocop:enable Naming/FileName
@@ -0,0 +1,29 @@
1
+ module Kettle
2
+ module Dev
3
+ module CIHelpers
4
+ def self.project_root: () -> String
5
+
6
+ def self.repo_info: () -> [String, String]?
7
+
8
+ def self.current_branch: () -> String?
9
+
10
+ def self.workflows_list: (?String root) -> Array[String]
11
+
12
+ def self.exclusions: () -> Array[String]
13
+
14
+ def self.latest_run: (
15
+ owner: String,
16
+ repo: String,
17
+ workflow_file: String,
18
+ ?branch: String?,
19
+ ?token: String?
20
+ ) -> { "status" => String?, "conclusion" => String?, "html_url" => String?, "id" => untyped }?
21
+
22
+ def self.success?: ({ "status" => String?, "conclusion" => String? } | nil run) -> bool
23
+
24
+ def self.failed?: ({ "status" => String?, "conclusion" => String? } | nil run) -> bool
25
+
26
+ def self.default_token: () -> String?
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,70 @@
1
+ module Kettle
2
+ module Dev
3
+ # Helpers shared by kettle:dev Rake tasks for templating and file ops.
4
+ module TemplateHelpers
5
+ # Symbol actions recorded by templating helpers
6
+ type template_action = :create | :replace | :skip | :dir_create | :dir_replace
7
+
8
+ # Root of the host project where Rake was invoked
9
+ def self.project_root: () -> String
10
+
11
+ # Root of this gem's checkout (repository root when working from source)
12
+ def self.gem_checkout_root: () -> String
13
+
14
+ # Simple yes/no prompt.
15
+ def self.ask: (String prompt, bool default) -> bool
16
+
17
+ # Write file content creating directories as needed
18
+ def self.write_file: (String dest_path, String content) -> void
19
+
20
+ # Record a template action for a destination path
21
+ def self.record_template_result: (String dest_path, template_action action) -> void
22
+
23
+ # Access all template results (read-only clone)
24
+ def self.template_results: () -> Hash[String, { action: template_action, timestamp: ::Time }]
25
+
26
+ # Returns true if the given path was created or replaced by the template task in this run
27
+ def self.modified_by_template?: (String dest_path) -> bool
28
+
29
+ # Ensure git working tree is clean before making changes in a task.
30
+ # If not a git repo, this is a no-op.
31
+ def self.ensure_clean_git!: (root: String, task_label: String) -> void
32
+
33
+ # Copy a single file with interactive prompts for create/replace.
34
+ def self.copy_file_with_prompt: (
35
+ String src_path,
36
+ String dest_path,
37
+ ?allow_create: bool,
38
+ ?allow_replace: bool
39
+ ) -> void
40
+
41
+ # Copy a directory tree, prompting before creating or overwriting.
42
+ def self.copy_dir_with_prompt: (String src_dir, String dest_dir) -> void
43
+
44
+ # Apply common token replacements used when templating text files
45
+ def self.apply_common_replacements: (
46
+ String content,
47
+ gh_org: String?,
48
+ gem_name: String,
49
+ namespace: String,
50
+ namespace_shield: String,
51
+ gem_shield: String
52
+ ) -> String
53
+
54
+ # Parse gemspec metadata and derive useful strings
55
+ # When no gemspec is present, gemspec_path may be nil; gh_org/gh_repo may be nil when not derivable.
56
+ def self.gemspec_metadata: (?String root) -> {
57
+ gemspec_path: String?,
58
+ gem_name: String,
59
+ min_ruby: String,
60
+ homepage: String,
61
+ gh_org: String?,
62
+ gh_repo: String?,
63
+ namespace: String,
64
+ namespace_shield: String,
65
+ entrypoint_require: String,
66
+ gem_shield: String,
67
+ }
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,19 @@
1
+ module Kettle
2
+ module Dev
3
+ module Version
4
+ VERSION: String
5
+ end
6
+
7
+ class Error < ::StandardError
8
+ end
9
+
10
+ DEBUGGING: bool
11
+ IS_CI: bool
12
+ REQUIRE_BENCH: bool
13
+
14
+ # Singleton methods
15
+ def self.install_tasks: () -> void
16
+ def self.defaults: () -> Array[String]
17
+ def self.register_default: (String | Symbol task_name) -> Array[String]
18
+ end
19
+ end
data.tar.gz.sig ADDED
@@ -0,0 +1,3 @@
1
+ O8w����w���%���{pDm�'h'�-o�aox�M,�Ǣm����d�}j٧��� ���v���9���aݩ���*�1�����l.#���'�������`�pq�R�|������^���1,�X4xYf}��@lM�E|*Uf]ȡKԧ�!�
2
+ 9IpF#8t�̴���� ��a�&<�g.#�gw�h�>�e�2�� ���„_Ö�UG^P��rvx�3��b> x����s1�@����Aog��@�@�\#�%^�^ӌn�姖q)���%�k�b˜"
3
+ �R%��E���,d��L�2�-Y�_e�O5�P��T"��g��lE ����P��Z���j�a���̟&(�S��8��N�� �-�E .��G3�`
metadata ADDED
@@ -0,0 +1,267 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kettle-dev
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Peter H. Boling
8
+ bindir: exe
9
+ cert_chain:
10
+ - |
11
+ -----BEGIN CERTIFICATE-----
12
+ MIIEgDCCAuigAwIBAgIBATANBgkqhkiG9w0BAQsFADBDMRUwEwYDVQQDDAxwZXRl
13
+ ci5ib2xpbmcxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
14
+ A2NvbTAeFw0yNTA1MDQxNTMzMDlaFw00NTA0MjkxNTMzMDlaMEMxFTATBgNVBAMM
15
+ DHBldGVyLmJvbGluZzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
16
+ LGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAruUoo0WA
17
+ uoNuq6puKWYeRYiZekz/nsDeK5x/0IEirzcCEvaHr3Bmz7rjo1I6On3gGKmiZs61
18
+ LRmQ3oxy77ydmkGTXBjruJB+pQEn7UfLSgQ0xa1/X3kdBZt6RmabFlBxnHkoaGY5
19
+ mZuZ5+Z7walmv6sFD9ajhzj+oIgwWfnEHkXYTR8I6VLN7MRRKGMPoZ/yvOmxb2DN
20
+ coEEHWKO9CvgYpW7asIihl/9GMpKiRkcYPm9dGQzZc6uTwom1COfW0+ZOFrDVBuV
21
+ FMQRPswZcY4Wlq0uEBLPU7hxnCL9nKK6Y9IhdDcz1mY6HZ91WImNslOSI0S8hRpj
22
+ yGOWxQIhBT3fqCBlRIqFQBudrnD9jSNpSGsFvbEijd5ns7Z9ZMehXkXDycpGAUj1
23
+ to/5cuTWWw1JqUWrKJYoifnVhtE1o1DZ+LkPtWxHtz5kjDG/zR3MG0Ula0UOavlD
24
+ qbnbcXPBnwXtTFeZ3C+yrWpE4pGnl3yGkZj9SMTlo9qnTMiPmuWKQDatAgMBAAGj
25
+ fzB9MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQE8uWvNbPVNRXZ
26
+ HlgPbc2PCzC4bjAhBgNVHREEGjAYgRZwZXRlci5ib2xpbmdAZ21haWwuY29tMCEG
27
+ A1UdEgQaMBiBFnBldGVyLmJvbGluZ0BnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
28
+ ggGBAJbnUwfJQFPkBgH9cL7hoBfRtmWiCvdqdjeTmi04u8zVNCUox0A4gT982DE9
29
+ wmuN12LpdajxZONqbXuzZvc+nb0StFwmFYZG6iDwaf4BPywm2e/Vmq0YG45vZXGR
30
+ L8yMDSK1cQXjmA+ZBKOHKWavxP6Vp7lWvjAhz8RFwqF9GuNIdhv9NpnCAWcMZtpm
31
+ GUPyIWw/Cw/2wZp74QzZj6Npx+LdXoLTF1HMSJXZ7/pkxLCsB8m4EFVdb/IrW/0k
32
+ kNSfjtAfBHO8nLGuqQZVH9IBD1i9K6aSs7pT6TW8itXUIlkIUI2tg5YzW6OFfPzq
33
+ QekSkX3lZfY+HTSp/o+YvKkqWLUV7PQ7xh1ZYDtocpaHwgxe/j3bBqHE+CUPH2vA
34
+ 0V/FwdTRWcwsjVoOJTrYcff8pBZ8r2MvtAc54xfnnhGFzeRHfcltobgFxkAXdE6p
35
+ DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt
36
+ L9nRqA==
37
+ -----END CERTIFICATE-----
38
+ date: 2025-08-24 00:00:00.000000000 Z
39
+ dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: version_gem
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.1'
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 1.1.8
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '1.1'
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 1.1.8
60
+ - !ruby/object:Gem::Dependency
61
+ name: bundler-audit
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: 0.9.2
67
+ type: :runtime
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: 0.9.2
74
+ - !ruby/object:Gem::Dependency
75
+ name: rake
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '13.0'
81
+ type: :runtime
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '13.0'
88
+ - !ruby/object:Gem::Dependency
89
+ name: require_bench
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '1.0'
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 1.0.4
98
+ type: :runtime
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '1.0'
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: 1.0.4
108
+ - !ruby/object:Gem::Dependency
109
+ name: appraisal2
110
+ requirement: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '3.0'
115
+ type: :runtime
116
+ prerelease: false
117
+ version_requirements: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: '3.0'
122
+ - !ruby/object:Gem::Dependency
123
+ name: kettle-test
124
+ requirement: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '1.0'
129
+ type: :runtime
130
+ prerelease: false
131
+ version_requirements: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: '1.0'
136
+ - !ruby/object:Gem::Dependency
137
+ name: ruby-progressbar
138
+ requirement: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: '1.13'
143
+ type: :runtime
144
+ prerelease: false
145
+ version_requirements: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - "~>"
148
+ - !ruby/object:Gem::Version
149
+ version: '1.13'
150
+ - !ruby/object:Gem::Dependency
151
+ name: stone_checksums
152
+ requirement: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - "~>"
155
+ - !ruby/object:Gem::Version
156
+ version: '1.0'
157
+ type: :runtime
158
+ prerelease: false
159
+ version_requirements: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - "~>"
162
+ - !ruby/object:Gem::Version
163
+ version: '1.0'
164
+ - !ruby/object:Gem::Dependency
165
+ name: gitmoji-regex
166
+ requirement: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - "~>"
169
+ - !ruby/object:Gem::Version
170
+ version: '1.0'
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: 1.0.3
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '1.0'
181
+ - - ">="
182
+ - !ruby/object:Gem::Version
183
+ version: 1.0.3
184
+ description: "\U0001F372 Kettle::Dev is a meta tool from kettle-rb to streamline development
185
+ and testing. Acts as a shim dependency, pulling in many other dependencies, to give
186
+ you OOTB productivity with a RubyGem, or Ruby app project. Configures a complete
187
+ set of Rake tasks, for all the libraries is brings in, so they arrive ready to go.
188
+ Fund overlooked open source projects - bottom of stack, dev/test dependencies: floss-funding.dev"
189
+ email:
190
+ - floss@galtzo.com
191
+ executables: []
192
+ extensions: []
193
+ extra_rdoc_files:
194
+ - CHANGELOG.md
195
+ - CITATION.cff
196
+ - CODE_OF_CONDUCT.md
197
+ - CONTRIBUTING.md
198
+ - LICENSE.txt
199
+ - README.md
200
+ - REEK
201
+ - RUBOCOP.md
202
+ - SECURITY.md
203
+ - checksums/kettle-dev-1.0.0.gem.sha256
204
+ - checksums/kettle-dev-1.0.0.gem.sha512
205
+ files:
206
+ - CHANGELOG.md
207
+ - CITATION.cff
208
+ - CODE_OF_CONDUCT.md
209
+ - CONTRIBUTING.md
210
+ - LICENSE.txt
211
+ - README.md
212
+ - REEK
213
+ - RUBOCOP.md
214
+ - SECURITY.md
215
+ - checksums/kettle-dev-1.0.0.gem.sha256
216
+ - checksums/kettle-dev-1.0.0.gem.sha512
217
+ - lib/kettle-dev.rb
218
+ - lib/kettle/dev.rb
219
+ - lib/kettle/dev/ci_helpers.rb
220
+ - lib/kettle/dev/tasks.rb
221
+ - lib/kettle/dev/template_helpers.rb
222
+ - lib/kettle/dev/version.rb
223
+ - lib/kettle/emoji_regex.rb
224
+ - sig/kettle/dev.rbs
225
+ - sig/kettle/dev/ci_helpers.rbs
226
+ - sig/kettle/dev/template_helpers.rbs
227
+ homepage: https://github.com/galtzo-floss/kettle-dev
228
+ licenses:
229
+ - MIT
230
+ metadata:
231
+ homepage_uri: https://kettle-dev.galtzo.com/
232
+ source_code_uri: https://github.com/galtzo-floss/kettle-dev/tree/v1.0.0
233
+ changelog_uri: https://github.com/galtzo-floss/kettle-dev/blob/v1.0.0/CHANGELOG.md
234
+ bug_tracker_uri: https://github.com/galtzo-floss/kettle-dev/issues
235
+ documentation_uri: https://www.rubydoc.info/gems/kettle-dev/1.0.0
236
+ funding_uri: https://github.com/sponsors/pboling
237
+ wiki_uri: https://github.com/galtzo-floss/kettle-dev/wiki
238
+ news_uri: https://www.railsbling.com/tags/kettle-dev
239
+ discord_uri: https://discord.gg/3qme4XHNKN
240
+ rubygems_mfa_required: 'true'
241
+ rdoc_options:
242
+ - "--title"
243
+ - "kettle-dev - \U0001F372 A kettle-rb meta tool to streamline development and testing"
244
+ - "--main"
245
+ - README.md
246
+ - "--exclude"
247
+ - "^sig/"
248
+ - "--line-numbers"
249
+ - "--inline-source"
250
+ - "--quiet"
251
+ require_paths:
252
+ - lib
253
+ required_ruby_version: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: 2.3.0
258
+ required_rubygems_version: !ruby/object:Gem::Requirement
259
+ requirements:
260
+ - - ">="
261
+ - !ruby/object:Gem::Version
262
+ version: '0'
263
+ requirements: []
264
+ rubygems_version: 3.7.1
265
+ specification_version: 4
266
+ summary: "\U0001F372 A kettle-rb meta tool to streamline development and testing"
267
+ test_files: []
metadata.gz.sig ADDED
Binary file