jetstream_bridge 2.3.0 → 2.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.
@@ -37,8 +37,7 @@ module JetstreamBridge
37
37
  def log_all_blocked(name, blocked)
38
38
  if blocked.any?
39
39
  Logging.warn(
40
- "Stream #{name}: all missing subjects belong to other streams; unchanged. " \
41
- "blocked=#{blocked.inspect}",
40
+ "Stream #{name}: all missing subjects belong to other streams; unchanged. blocked=#{blocked.inspect}",
42
41
  tag: 'JetstreamBridge::Stream'
43
42
  )
44
43
  else
@@ -54,8 +53,7 @@ module JetstreamBridge
54
53
 
55
54
  def log_not_created(name, blocked)
56
55
  Logging.warn(
57
- "Not creating stream #{name}: all desired subjects belong to other streams. " \
58
- "blocked=#{blocked.inspect}",
56
+ "Not creating stream #{name}: all desired subjects belong to other streams. blocked=#{blocked.inspect}",
59
57
  tag: 'JetstreamBridge::Stream'
60
58
  )
61
59
  end
@@ -70,10 +68,24 @@ module JetstreamBridge
70
68
  msg += " (skipped overlapped=#{blocked.inspect})" if blocked.any?
71
69
  Logging.info(msg, tag: 'JetstreamBridge::Stream')
72
70
  end
71
+
72
+ def log_config_updated(name, storage:)
73
+ Logging.info(
74
+ "Updated stream #{name} config; storage=#{storage.inspect}",
75
+ tag: 'JetstreamBridge::Stream'
76
+ )
77
+ end
78
+
79
+ def log_retention_mismatch(name, have:, want:)
80
+ Logging.warn(
81
+ "Stream #{name} retention mismatch (have=#{have.inspect}, want=#{want.inspect}). " \
82
+ "Retention is immutable; skipping retention change.",
83
+ tag: 'JetstreamBridge::Stream'
84
+ )
85
+ end
73
86
  end
74
87
 
75
- # Ensures a stream exists and updates only uncovered subjects, using work-queue semantics:
76
- # Persist with zero consumers; delete after the first ack (retention: 'workqueue').
88
+ # Ensures a stream exists and updates only uncovered subjects, using work-queue semantics.
77
89
  class Stream
78
90
  RETENTION = 'workqueue'
79
91
  STORAGE = 'file'
@@ -89,17 +101,12 @@ module JetstreamBridge
89
101
  info ? ensure_update(jts, name, info, desired) : ensure_create(jts, name, desired)
90
102
  rescue NATS::JetStream::Error => e
91
103
  if StreamSupport.overlap_error?(e) && (attempts += 1) <= 1
92
- Logging.warn(
93
- "Overlap race while ensuring #{name}; retrying once...",
94
- tag: 'JetstreamBridge::Stream'
95
- )
104
+ Logging.warn("Overlap race while ensuring #{name}; retrying once...", tag: 'JetstreamBridge::Stream')
96
105
  sleep(0.05)
97
106
  retry
98
107
  elsif StreamSupport.overlap_error?(e)
99
- Logging.warn(
100
- "Overlap persists ensuring #{name}; leaving unchanged. err=#{e.message.inspect}",
101
- tag: 'JetstreamBridge::Stream'
102
- )
108
+ Logging.warn("Overlap persists ensuring #{name}; leaving unchanged. err=#{e.message.inspect}",
109
+ tag: 'JetstreamBridge::Stream')
103
110
  nil
104
111
  else
105
112
  raise
@@ -109,18 +116,27 @@ module JetstreamBridge
109
116
 
110
117
  private
111
118
 
112
- # ---- keep ensure_update small (<=20 lines, lower ABC) ----
113
119
  def ensure_update(jts, name, info, desired_subjects)
114
120
  existing = StreamSupport.normalize_subjects(info.config.subjects || [])
115
121
  to_add = StreamSupport.missing_subjects(existing, desired_subjects)
122
+ add_subjects(jts, name, existing, to_add) if to_add.any?
116
123
 
117
- return add_subjects(jts, name, existing, to_add) if to_add.any?
124
+ # Retention is immutable; warn if different and do not include on update.
125
+ have_ret = info.config.retention.to_s.downcase
126
+ if have_ret != RETENTION
127
+ StreamSupport.log_retention_mismatch(name, have: have_ret, want: RETENTION)
128
+ end
118
129
 
119
- if config_needs_update?(info)
120
- apply_update(jts, name, existing)
121
- return log_config_updated(name)
130
+ # Storage can be updated; do it without passing retention.
131
+ have_storage = info.config.storage.to_s.downcase
132
+ if have_storage != STORAGE
133
+ apply_update(jts, name, existing, storage: STORAGE)
134
+ StreamSupport.log_config_updated(name, storage: STORAGE)
135
+ return
122
136
  end
123
137
 
138
+ return if to_add.any?
139
+
124
140
  StreamSupport.log_already_covered(name)
125
141
  end
126
142
 
@@ -129,36 +145,18 @@ module JetstreamBridge
129
145
  allowed, blocked = OverlapGuard.partition_allowed(jts, name, to_add)
130
146
  return StreamSupport.log_all_blocked(name, blocked) if allowed.empty?
131
147
 
132
- target = merge_subjects(existing, allowed)
148
+ target = (existing + allowed).uniq
133
149
  OverlapGuard.check!(jts, name, target)
150
+ # Do not pass retention on update to avoid 10052.
134
151
  apply_update(jts, name, target)
135
152
  StreamSupport.log_updated(name, allowed, blocked)
136
153
  end
137
154
 
138
- def merge_subjects(existing, allowed)
139
- (existing + allowed).uniq
140
- end
141
-
142
- def config_needs_update?(info)
143
- info.config.retention.to_s.downcase != RETENTION ||
144
- info.config.storage.to_s.downcase != STORAGE
145
- end
146
-
147
- def apply_update(jts, name, subjects)
148
- jts.update_stream(
149
- name: name,
150
- subjects: subjects,
151
- retention: RETENTION,
152
- storage: STORAGE
153
- )
154
- end
155
-
156
- def log_config_updated(name)
157
- Logging.info(
158
- "Updated stream #{name} config; retention=#{RETENTION.inspect} " \
159
- "storage=#{STORAGE.inspect}",
160
- tag: 'JetstreamBridge::Stream'
161
- )
155
+ # Only include mutable fields on update (subjects, storage). Never retention.
156
+ def apply_update(jts, name, subjects, storage: nil)
157
+ params = { name: name, subjects: subjects }
158
+ params[:storage] = storage if storage
159
+ jts.update_stream(**params)
162
160
  end
163
161
 
164
162
  def ensure_create(jts, name, desired_subjects)
@@ -4,5 +4,5 @@
4
4
  #
5
5
  # Version constant for the gem.
6
6
  module JetstreamBridge
7
- VERSION = '2.3.0'
7
+ VERSION = '2.5.0'
8
8
  end
@@ -46,7 +46,7 @@ module JetstreamBridge
46
46
  config.use_dlq
47
47
  end
48
48
 
49
- def ensure_topology!
49
+ def ensure_topology?
50
50
  Connection.connect!
51
51
  true
52
52
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jetstream_bridge
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Attara
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-08-21 00:00:00.000000000 Z
11
+ date: 2025-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: activerecord
14
+ name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '6.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: activesupport
28
+ name: activerecord
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -53,33 +53,19 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2.4'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rails
56
+ name: oj
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '6.0'
61
+ version: '3.16'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '6.0'
69
- - !ruby/object:Gem::Dependency
70
- name: bundler-audit
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: 0.9.1
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: 0.9.1
68
+ version: '3.16'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: rake
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +136,20 @@ dependencies:
150
136
  - - "~>"
151
137
  - !ruby/object:Gem::Version
152
138
  version: '1.21'
139
+ - !ruby/object:Gem::Dependency
140
+ name: bundler-audit
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 0.9.1
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 0.9.1
153
153
  description: |-
154
154
  Publisher/Consumer utilities for NATS JetStream with environment-scoped subjects,
155
155
  overlap guards, DLQ routing, retries/backoff, and optional Inbox/Outbox patterns.
@@ -160,20 +160,6 @@ executables: []
160
160
  extensions: []
161
161
  extra_rdoc_files: []
162
162
  files:
163
- - ".github/workflows/release.yml"
164
- - ".gitignore"
165
- - ".idea/.gitignore"
166
- - ".idea/dictionaries/project.xml"
167
- - ".idea/jetstream_bridge.iml"
168
- - ".idea/misc.xml"
169
- - ".idea/modules.xml"
170
- - ".idea/vcs.xml"
171
- - ".rubocop.yml"
172
- - Gemfile
173
- - Gemfile.lock
174
- - LICENSE
175
- - README.md
176
- - jetstream_bridge.gemspec
177
163
  - lib/generators/jetstream_bridge/initializer/initializer_generator.rb
178
164
  - lib/generators/jetstream_bridge/initializer/templates/jetstream_bridge.rb
179
165
  - lib/generators/jetstream_bridge/install/install_generator.rb
@@ -181,11 +167,14 @@ files:
181
167
  - lib/generators/jetstream_bridge/migrations/templates/create_jetstream_inbox_events.rb.erb
182
168
  - lib/generators/jetstream_bridge/migrations/templates/create_jetstream_outbox_events.rb.erb
183
169
  - lib/jetstream_bridge.rb
170
+ - lib/jetstream_bridge/consumer/backoff_strategy.rb
184
171
  - lib/jetstream_bridge/consumer/consumer.rb
185
172
  - lib/jetstream_bridge/consumer/consumer_config.rb
173
+ - lib/jetstream_bridge/consumer/dlq_publisher.rb
186
174
  - lib/jetstream_bridge/consumer/inbox/inbox_message.rb
187
175
  - lib/jetstream_bridge/consumer/inbox/inbox_processor.rb
188
176
  - lib/jetstream_bridge/consumer/inbox/inbox_repository.rb
177
+ - lib/jetstream_bridge/consumer/message_context.rb
189
178
  - lib/jetstream_bridge/consumer/message_processor.rb
190
179
  - lib/jetstream_bridge/consumer/subscription_manager.rb
191
180
  - lib/jetstream_bridge/core/config.rb
@@ -1,150 +0,0 @@
1
- name: Release JetstreamBridge (on tag)
2
-
3
- on:
4
- push:
5
- tags:
6
- - "v*"
7
-
8
- jobs:
9
- release:
10
- runs-on: ubuntu-latest
11
- permissions:
12
- contents: write
13
- packages: write
14
-
15
- env:
16
- RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
17
- # Force Bundler to ignore platform-specific precompiled variants (e.g., arm64-darwin)
18
- BUNDLER_FORCE_RUBY_PLATFORM: "true"
19
-
20
- steps:
21
- - name: Checkout
22
- uses: actions/checkout@v4
23
- with:
24
- fetch-depth: 0
25
-
26
- - name: Derive version from tag
27
- id: ver
28
- shell: bash
29
- run: |
30
- set -euo pipefail
31
- RAW="${GITHUB_REF_NAME}" # e.g. v0.3.2
32
- if [[ ! "$RAW" =~ ^v[0-9]+(\.[0-9]+){2}(-[0-9A-Za-z\.-]+)?$ ]]; then
33
- echo "Tag must look like vX.Y.Z (optionally -rcN). Got: $RAW"
34
- exit 1
35
- fi
36
- VERSION="${RAW#v}"
37
- echo "version=$VERSION" >> "$GITHUB_OUTPUT"
38
- echo "Using version: $VERSION"
39
-
40
- # Install Ruby BEFORE any `ruby -e` or bundler calls
41
- - name: Set up Ruby
42
- uses: ruby/setup-ruby@v1
43
- with:
44
- ruby-version: "3.2"
45
- bundler-cache: false
46
-
47
- - name: Read version.rb
48
- id: file
49
- shell: bash
50
- run: |
51
- set -euo pipefail
52
- FILE_VERSION=$(ruby -e "puts(File.read('lib/jetstream_bridge/version.rb')[/VERSION\\s*=\\s*['\"]([^'\"]+)['\"]/,1])")
53
- echo "file_version=$FILE_VERSION" >> "$GITHUB_OUTPUT"
54
- echo "version.rb currently: $FILE_VERSION"
55
-
56
- - name: Patch version.rb to match tag (no commit)
57
- if: ${{ steps.ver.outputs.version != steps.file.outputs.file_version }}
58
- shell: bash
59
- run: |
60
- set -euo pipefail
61
- echo "Patching version.rb from '${{ steps.file.outputs.file_version }}' to '${{ steps.ver.outputs.version }}' for this build…"
62
- sed -i "s/VERSION\\s*=\\s*['\"][^'\"]\\+['\"]/VERSION = '${{ steps.ver.outputs.version }}'/" lib/jetstream_bridge/version.rb
63
- grep VERSION lib/jetstream_bridge/version.rb
64
-
65
- - name: Prepare Bundler (non-frozen; add Linux/Ruby platforms)
66
- shell: bash
67
- run: |
68
- set -euo pipefail
69
- rm -f .bundle/config || true
70
- bundle config set --local frozen false
71
- bundle config set --local deployment false
72
- bundle config set --local path vendor/bundle
73
- bundle lock --add-platform x86_64-linux || true
74
- bundle lock --add-platform ruby || true
75
-
76
- - name: Install dependencies
77
- shell: bash
78
- run: |
79
- set -euo pipefail
80
- bundle install --jobs 4
81
-
82
- # Optional tests
83
- # - name: Run tests
84
- # run: bundle exec rake
85
-
86
- - name: Build gem
87
- id: build
88
- shell: bash
89
- run: |
90
- set -euo pipefail
91
- gem build jetstream_bridge.gemspec
92
- GEMFILE=$(ls -1 *.gem | tail -n1)
93
- echo "gemfile=${GEMFILE}" >> "$GITHUB_OUTPUT"
94
- ls -l "$GEMFILE"
95
-
96
- - name: Generate CHANGELOG for this release
97
- id: changelog
98
- shell: bash
99
- run: |
100
- set -euo pipefail
101
- TAG="${GITHUB_REF_NAME}"
102
-
103
- # Find previous tag (semantic aware); fallback to first commit
104
- PREV_TAG=$(git tag --sort=-v:refname | sed -n '2p' || true)
105
- if [[ -z "$PREV_TAG" ]]; then
106
- FIRST_COMMIT=$(git rev-list --max-parents=0 HEAD)
107
- RANGE="$FIRST_COMMIT..$TAG"
108
- else
109
- RANGE="$PREV_TAG..$TAG"
110
- fi
111
-
112
- DATE=$(date -u +'%Y-%m-%d')
113
- {
114
- echo "## $TAG — $DATE"
115
- echo
116
- echo "### Changes"
117
- # Exclude merge commits, show subject, short sha, author
118
- if ! git log --no-merges --format='- %s (%h) — %an' "$RANGE"; then
119
- echo "- Initial release"
120
- fi
121
- echo
122
- } > CHANGELOG.md
123
-
124
- echo "prev_tag=${PREV_TAG}" >> "$GITHUB_OUTPUT"
125
- echo "Generated CHANGELOG for range: $RANGE"
126
- sed -n '1,200p' CHANGELOG.md
127
-
128
- - name: Create/Update GitHub Release and upload .gem
129
- uses: softprops/action-gh-release@v2
130
- with:
131
- tag_name: ${{ github.ref_name }}
132
- name: "JetstreamBridge ${{ github.ref_name }}"
133
- files: |
134
- ${{ steps.build.outputs.gemfile }}
135
- CHANGELOG.md
136
- draft: false
137
- generate_release_notes: false
138
- body_path: CHANGELOG.md
139
- prerelease: ${{ contains(steps.ver.outputs.version, '-') }}
140
-
141
- # Publish only if token present
142
- - name: Push to RubyGems
143
- if: ${{ env.RUBYGEMS_API_KEY != '' }}
144
- shell: bash
145
- run: |
146
- set -euo pipefail
147
- mkdir -p ~/.gem
148
- printf -- "---\n:rubygems_api_key: $RUBYGEMS_API_KEY\n" > ~/.gem/credentials
149
- chmod 0600 ~/.gem/credentials
150
- gem push "${{ steps.build.outputs.gemfile }}"
data/.gitignore DELETED
@@ -1,56 +0,0 @@
1
- *.gem
2
- *.rbc
3
- /.config
4
- /coverage/
5
- /InstalledFiles
6
- /pkg/
7
- /spec/reports/
8
- /spec/examples.txt
9
- /test/tmp/
10
- /test/version_tmp/
11
- /tmp/
12
-
13
- # Used by dotenv library to load environment variables.
14
- # .env
15
-
16
- # Ignore Byebug command history file.
17
- .byebug_history
18
-
19
- ## Specific to RubyMotion:
20
- .dat*
21
- .repl_history
22
- build/
23
- *.bridgesupport
24
- build-iPhoneOS/
25
- build-iPhoneSimulator/
26
-
27
- ## Specific to RubyMotion (use of CocoaPods):
28
- #
29
- # We recommend against adding the Pods directory to your .gitignore. However
30
- # you should judge for yourself, the pros and cons are mentioned at:
31
- # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
32
- #
33
- # vendor/Pods/
34
-
35
- ## Documentation cache and generated files:
36
- /.yardoc/
37
- /_yardoc/
38
- /doc/
39
- /rdoc/
40
-
41
- ## Environment normalization:
42
- /.bundle/
43
- /vendor/bundle
44
- /lib/bundler/man/
45
-
46
- # for a library or gem, you might want to ignore these files since the code is
47
- # intended to run in multiple environments; otherwise, check them in:
48
- # Gemfile.lock
49
- # .ruby-version
50
- # .ruby-gemset
51
-
52
- # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
53
- .rvmrc
54
-
55
- # Used by RuboCop. Remote config files pulled in from inherit_from directive.
56
- # .rubocop-https?--*
data/.idea/.gitignore DELETED
@@ -1,8 +0,0 @@
1
- # Default ignored files
2
- /shelf/
3
- /workspace.xml
4
- # Editor-based HTTP Client requests
5
- /httpRequests/
6
- # Datasource local storage ignored files
7
- /dataSources/
8
- /dataSources.local.xml
@@ -1,17 +0,0 @@
1
- <component name="ProjectDictionaryState">
2
- <dictionary name="project">
3
- <words>
4
- <w>acks</w>
5
- <w>activesupport</w>
6
- <w>backoffs</w>
7
- <w>dedup</w>
8
- <w>esub</w>
9
- <w>msgs</w>
10
- <w>pipefail</w>
11
- <w>psub</w>
12
- <w>sname</w>
13
- <w>softprops</w>
14
- <w>workqueue</w>
15
- </words>
16
- </dictionary>
17
- </component>
@@ -1,102 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <module type="RUBY_MODULE" version="4">
3
- <component name="ModuleRunConfigurationManager">
4
- <shared />
5
- </component>
6
- <component name="NewModuleRootManager">
7
- <content url="file://$MODULE_DIR$">
8
- <sourceFolder url="file://$MODULE_DIR$/features" isTestSource="true" />
9
- <sourceFolder url="file://$MODULE_DIR$/spec" isTestSource="true" />
10
- <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
11
- </content>
12
- <orderEntry type="inheritedJdk" />
13
- <orderEntry type="sourceFolder" forTests="false" />
14
- <orderEntry type="library" scope="PROVIDED" name="actioncable (v8.0.2, rbenv: 3.3.6) [gem]" level="application" />
15
- <orderEntry type="library" scope="PROVIDED" name="actionmailbox (v8.0.2, rbenv: 3.3.6) [gem]" level="application" />
16
- <orderEntry type="library" scope="PROVIDED" name="actionmailer (v8.0.2, rbenv: 3.3.6) [gem]" level="application" />
17
- <orderEntry type="library" scope="PROVIDED" name="actionpack (v8.0.2, rbenv: 3.3.6) [gem]" level="application" />
18
- <orderEntry type="library" scope="PROVIDED" name="actiontext (v8.0.2, rbenv: 3.3.6) [gem]" level="application" />
19
- <orderEntry type="library" scope="PROVIDED" name="actionview (v8.0.2, rbenv: 3.3.6) [gem]" level="application" />
20
- <orderEntry type="library" scope="PROVIDED" name="activejob (v8.0.2, rbenv: 3.3.6) [gem]" level="application" />
21
- <orderEntry type="library" scope="PROVIDED" name="activemodel (v8.0.2, rbenv: 3.3.6) [gem]" level="application" />
22
- <orderEntry type="library" scope="PROVIDED" name="activerecord (v8.0.2, rbenv: 3.3.6) [gem]" level="application" />
23
- <orderEntry type="library" scope="PROVIDED" name="activestorage (v8.0.2, rbenv: 3.3.6) [gem]" level="application" />
24
- <orderEntry type="library" scope="PROVIDED" name="activesupport (v8.0.2, rbenv: 3.3.6) [gem]" level="application" />
25
- <orderEntry type="library" scope="PROVIDED" name="ast (v2.4.3, rbenv: 3.3.6) [gem]" level="application" />
26
- <orderEntry type="library" scope="PROVIDED" name="base64 (v0.3.0, rbenv: 3.3.6) [gem]" level="application" />
27
- <orderEntry type="library" scope="PROVIDED" name="benchmark (v0.4.1, rbenv: 3.3.6) [gem]" level="application" />
28
- <orderEntry type="library" scope="PROVIDED" name="bigdecimal (v3.2.2, rbenv: 3.3.6) [gem]" level="application" />
29
- <orderEntry type="library" scope="PROVIDED" name="builder (v3.3.0, rbenv: 3.3.6) [gem]" level="application" />
30
- <orderEntry type="library" scope="PROVIDED" name="bundler (v2.6.3, rbenv: 3.3.6) [gem]" level="application" />
31
- <orderEntry type="library" scope="PROVIDED" name="bundler-audit (v0.9.2, rbenv: 3.3.6) [gem]" level="application" />
32
- <orderEntry type="library" scope="PROVIDED" name="concurrent-ruby (v1.3.5, rbenv: 3.3.6) [gem]" level="application" />
33
- <orderEntry type="library" scope="PROVIDED" name="connection_pool (v2.5.3, rbenv: 3.3.6) [gem]" level="application" />
34
- <orderEntry type="library" scope="PROVIDED" name="crass (v1.0.6, rbenv: 3.3.6) [gem]" level="application" />
35
- <orderEntry type="library" scope="PROVIDED" name="date (v3.4.1, rbenv: 3.3.6) [gem]" level="application" />
36
- <orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.6.2, rbenv: 3.3.6) [gem]" level="application" />
37
- <orderEntry type="library" scope="PROVIDED" name="drb (v2.2.3, rbenv: 3.3.6) [gem]" level="application" />
38
- <orderEntry type="library" scope="PROVIDED" name="erubi (v1.13.1, rbenv: 3.3.6) [gem]" level="application" />
39
- <orderEntry type="library" scope="PROVIDED" name="globalid (v1.2.1, rbenv: 3.3.6) [gem]" level="application" />
40
- <orderEntry type="library" scope="PROVIDED" name="i18n (v1.14.7, rbenv: 3.3.6) [gem]" level="application" />
41
- <orderEntry type="library" scope="PROVIDED" name="io-console (v0.8.0, rbenv: 3.3.6) [gem]" level="application" />
42
- <orderEntry type="library" scope="PROVIDED" name="irb (v1.15.2, rbenv: 3.3.6) [gem]" level="application" />
43
- <orderEntry type="library" scope="PROVIDED" name="json (v2.13.2, rbenv: 3.3.6) [gem]" level="application" />
44
- <orderEntry type="library" scope="PROVIDED" name="language_server-protocol (v3.17.0.5, rbenv: 3.3.6) [gem]" level="application" />
45
- <orderEntry type="library" scope="PROVIDED" name="lint_roller (v1.1.0, rbenv: 3.3.6) [gem]" level="application" />
46
- <orderEntry type="library" scope="PROVIDED" name="logger (v1.7.0, rbenv: 3.3.6) [gem]" level="application" />
47
- <orderEntry type="library" scope="PROVIDED" name="loofah (v2.24.0, rbenv: 3.3.6) [gem]" level="application" />
48
- <orderEntry type="library" scope="PROVIDED" name="mail (v2.8.1, rbenv: 3.3.6) [gem]" level="application" />
49
- <orderEntry type="library" scope="PROVIDED" name="marcel (v1.0.4, rbenv: 3.3.6) [gem]" level="application" />
50
- <orderEntry type="library" scope="PROVIDED" name="mini_mime (v1.1.5, rbenv: 3.3.6) [gem]" level="application" />
51
- <orderEntry type="library" scope="PROVIDED" name="minitest (v5.25.5, rbenv: 3.3.6) [gem]" level="application" />
52
- <orderEntry type="library" scope="PROVIDED" name="nats-pure (v2.5.0, rbenv: 3.3.6) [gem]" level="application" />
53
- <orderEntry type="library" scope="PROVIDED" name="net-imap (v0.5.6, rbenv: 3.3.6) [gem]" level="application" />
54
- <orderEntry type="library" scope="PROVIDED" name="net-pop (v0.1.2, rbenv: 3.3.6) [gem]" level="application" />
55
- <orderEntry type="library" scope="PROVIDED" name="net-protocol (v0.2.2, rbenv: 3.3.6) [gem]" level="application" />
56
- <orderEntry type="library" scope="PROVIDED" name="net-smtp (v0.5.1, rbenv: 3.3.6) [gem]" level="application" />
57
- <orderEntry type="library" scope="PROVIDED" name="nio4r (v2.7.4, rbenv: 3.3.6) [gem]" level="application" />
58
- <orderEntry type="library" scope="PROVIDED" name="nokogiri (v1.18.7, rbenv: 3.3.6) [gem]" level="application" />
59
- <orderEntry type="library" scope="PROVIDED" name="parallel (v1.27.0, rbenv: 3.3.6) [gem]" level="application" />
60
- <orderEntry type="library" scope="PROVIDED" name="parser (v3.3.9.0, rbenv: 3.3.6) [gem]" level="application" />
61
- <orderEntry type="library" scope="PROVIDED" name="pp (v0.6.2, rbenv: 3.3.6) [gem]" level="application" />
62
- <orderEntry type="library" scope="PROVIDED" name="prettyprint (v0.2.0, rbenv: 3.3.6) [gem]" level="application" />
63
- <orderEntry type="library" scope="PROVIDED" name="prism (v1.4.0, rbenv: 3.3.6) [gem]" level="application" />
64
- <orderEntry type="library" scope="PROVIDED" name="psych (v5.2.3, rbenv: 3.3.6) [gem]" level="application" />
65
- <orderEntry type="library" scope="PROVIDED" name="racc (v1.8.1, rbenv: 3.3.6) [gem]" level="application" />
66
- <orderEntry type="library" scope="PROVIDED" name="rack (v3.1.13, rbenv: 3.3.6) [gem]" level="application" />
67
- <orderEntry type="library" scope="PROVIDED" name="rack-session (v2.1.0, rbenv: 3.3.6) [gem]" level="application" />
68
- <orderEntry type="library" scope="PROVIDED" name="rack-test (v2.2.0, rbenv: 3.3.6) [gem]" level="application" />
69
- <orderEntry type="library" scope="PROVIDED" name="rackup (v2.2.1, rbenv: 3.3.6) [gem]" level="application" />
70
- <orderEntry type="library" scope="PROVIDED" name="rails (v8.0.2, rbenv: 3.3.6) [gem]" level="application" />
71
- <orderEntry type="library" scope="PROVIDED" name="rails-dom-testing (v2.2.0, rbenv: 3.3.6) [gem]" level="application" />
72
- <orderEntry type="library" scope="PROVIDED" name="rails-html-sanitizer (v1.6.2, rbenv: 3.3.6) [gem]" level="application" />
73
- <orderEntry type="library" scope="PROVIDED" name="railties (v8.0.2, rbenv: 3.3.6) [gem]" level="application" />
74
- <orderEntry type="library" scope="PROVIDED" name="rainbow (v3.1.1, rbenv: 3.3.6) [gem]" level="application" />
75
- <orderEntry type="library" scope="PROVIDED" name="rake (v13.2.1, rbenv: 3.3.6) [gem]" level="application" />
76
- <orderEntry type="library" scope="PROVIDED" name="rdoc (v6.13.1, rbenv: 3.3.6) [gem]" level="application" />
77
- <orderEntry type="library" scope="PROVIDED" name="regexp_parser (v2.11.2, rbenv: 3.3.6) [gem]" level="application" />
78
- <orderEntry type="library" scope="PROVIDED" name="reline (v0.6.1, rbenv: 3.3.6) [gem]" level="application" />
79
- <orderEntry type="library" scope="PROVIDED" name="rspec (v3.13.1, rbenv: 3.3.6) [gem]" level="application" />
80
- <orderEntry type="library" scope="PROVIDED" name="rspec-core (v3.13.5, rbenv: 3.3.6) [gem]" level="application" />
81
- <orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v3.13.5, rbenv: 3.3.6) [gem]" level="application" />
82
- <orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v3.13.5, rbenv: 3.3.6) [gem]" level="application" />
83
- <orderEntry type="library" scope="PROVIDED" name="rspec-support (v3.13.5, rbenv: 3.3.6) [gem]" level="application" />
84
- <orderEntry type="library" scope="PROVIDED" name="rubocop (v1.79.2, rbenv: 3.3.6) [gem]" level="application" />
85
- <orderEntry type="library" scope="PROVIDED" name="rubocop-ast (v1.46.0, rbenv: 3.3.6) [gem]" level="application" />
86
- <orderEntry type="library" scope="PROVIDED" name="rubocop-packaging (v0.6.0, rbenv: 3.3.6) [gem]" level="application" />
87
- <orderEntry type="library" scope="PROVIDED" name="rubocop-performance (v1.25.0, rbenv: 3.3.6) [gem]" level="application" />
88
- <orderEntry type="library" scope="PROVIDED" name="ruby-progressbar (v1.13.0, rbenv: 3.3.6) [gem]" level="application" />
89
- <orderEntry type="library" scope="PROVIDED" name="securerandom (v0.4.1, rbenv: 3.3.6) [gem]" level="application" />
90
- <orderEntry type="library" scope="PROVIDED" name="stringio (v3.1.6, rbenv: 3.3.6) [gem]" level="application" />
91
- <orderEntry type="library" scope="PROVIDED" name="thor (v1.3.2, rbenv: 3.3.6) [gem]" level="application" />
92
- <orderEntry type="library" scope="PROVIDED" name="timeout (v0.4.3, rbenv: 3.3.6) [gem]" level="application" />
93
- <orderEntry type="library" scope="PROVIDED" name="tzinfo (v2.0.6, rbenv: 3.3.6) [gem]" level="application" />
94
- <orderEntry type="library" scope="PROVIDED" name="unicode-display_width (v3.1.4, rbenv: 3.3.6) [gem]" level="application" />
95
- <orderEntry type="library" scope="PROVIDED" name="unicode-emoji (v4.0.4, rbenv: 3.3.6) [gem]" level="application" />
96
- <orderEntry type="library" scope="PROVIDED" name="uri (v1.0.3, rbenv: 3.3.6) [gem]" level="application" />
97
- <orderEntry type="library" scope="PROVIDED" name="useragent (v0.16.11, rbenv: 3.3.6) [gem]" level="application" />
98
- <orderEntry type="library" scope="PROVIDED" name="websocket-driver (v0.7.7, rbenv: 3.3.6) [gem]" level="application" />
99
- <orderEntry type="library" scope="PROVIDED" name="websocket-extensions (v0.1.5, rbenv: 3.3.6) [gem]" level="application" />
100
- <orderEntry type="library" scope="PROVIDED" name="zeitwerk (v2.7.2, rbenv: 3.3.6) [gem]" level="application" />
101
- </component>
102
- </module>
data/.idea/misc.xml DELETED
@@ -1,4 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ProjectRootManager" version="2" project-jdk-name="rbenv: 3.3.6" project-jdk-type="RUBY_SDK" />
4
- </project>
data/.idea/modules.xml DELETED
@@ -1,8 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ProjectModuleManager">
4
- <modules>
5
- <module fileurl="file://$PROJECT_DIR$/.idea/jetstream_bridge.iml" filepath="$PROJECT_DIR$/.idea/jetstream_bridge.iml" />
6
- </modules>
7
- </component>
8
- </project>
data/.idea/vcs.xml DELETED
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="VcsDirectoryMappings">
4
- <mapping directory="" vcs="Git" />
5
- </component>
6
- </project>