bowlero 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 737ad2515bd56b4e9b37717994cf16713b7300d514e5a686e9001e91264c652b
4
+ data.tar.gz: ee3ee76e6bb29599408847d9850a07a3ca145fa4c7cbe3e10067473664544c62
5
+ SHA512:
6
+ metadata.gz: 76d854173c4c0420121ad8c5fa04ae6286aa68f12c5bb4021f8c074537156bdffbf8994e60b082a50f2dfa54b8400f5c41481a93b768c5fca613bfb812c703cc
7
+ data.tar.gz: eb8c6e242244f9e79d21cb3ea341c37c009250f0cae15c7465cb42793e14f2dc53ad646dac39bb36764a0a5001fad5a3e0a9b192ac42e0c70965b2613a9f9184
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,8 @@
1
+ AllCops:
2
+ TargetRubyVersion: 3.1
3
+
4
+ Style/StringLiterals:
5
+ EnforcedStyle: double_quotes
6
+
7
+ Style/StringLiteralsInInterpolation:
8
+ EnforcedStyle: double_quotes
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.0] - 2025-05-13
4
+
5
+ - Initial release
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Mike Benner
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2025 Mike Benner
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # Bowlero
2
+
3
+ TODO: Delete this and the text below, and describe your gem
4
+
5
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/bowlero`. To experiment with that code, run `bin/console` for an interactive prompt.
6
+
7
+ ## Installation
8
+
9
+ TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
10
+
11
+ Install the gem and add to the application's Gemfile by executing:
12
+
13
+ ```bash
14
+ bundle add UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
15
+ ```
16
+
17
+ If bundler is not being used to manage dependencies, install the gem by executing:
18
+
19
+ ```bash
20
+ gem install UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/bowlero.
36
+
37
+ ## License
38
+
39
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require "rubocop/rake_task"
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec rubocop]
@@ -0,0 +1,27 @@
1
+ module Bowlero
2
+ module Dice
3
+ # Rolls the Strike Die: returns 1-5 (pins) or :strike
4
+ def self.roll_strike_die
5
+ roll = rand(1..6)
6
+ roll == 6 ? :strike : roll
7
+ end
8
+
9
+ # Rolls the Split Die: returns 1-5 (pins) or :split
10
+ def self.roll_split_die
11
+ roll = rand(1..6)
12
+ roll == 6 ? :split : roll
13
+ end
14
+
15
+ # Rolls the Split Resolution Die: returns :open (1-4) or :spare (5-6)
16
+ def self.roll_split_resolution_die
17
+ roll = rand(1..6)
18
+ roll <= 4 ? :open : :spare
19
+ end
20
+
21
+ # Rolls the Spare Resolution Die: returns :spare (1-4) or :open (5-6)
22
+ def self.roll_spare_resolution_die
23
+ roll = rand(1..6)
24
+ roll <= 4 ? :spare : :open
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,25 @@
1
+ module Bowlero
2
+ class Frame
3
+ attr_accessor :frame_number, :first_roll, :second_roll, :third_roll, :split, :split_converted, :result, :pins, :score
4
+
5
+ def initialize(frame_number:,
6
+ first_roll: nil,
7
+ second_roll: nil,
8
+ third_roll: nil,
9
+ split: false,
10
+ split_converted: nil,
11
+ result: nil,
12
+ pins: 0,
13
+ score: nil)
14
+ @frame_number = frame_number
15
+ @first_roll = first_roll
16
+ @second_roll = second_roll
17
+ @third_roll = third_roll
18
+ @split = split
19
+ @split_converted = split_converted
20
+ @result = result
21
+ @pins = pins
22
+ @score = score
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bowlero
4
+ VERSION = "0.1.0"
5
+ end
data/lib/bowlero.rb ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "bowlero/version"
4
+ require_relative 'bowlero/frame'
5
+ require_relative 'bowlero/dice'
6
+
7
+ module Bowlero
8
+ class Error < StandardError; end
9
+ # Your code goes here...
10
+ end
data/sig/bowlero.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Bowlero
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
@@ -0,0 +1,243 @@
1
+ # Bowlero Ruby Gem (KOANI-300)
2
+
3
+ > **Progress:**
4
+ > _Awaiting initial implementation. Requirements and plan approved. Next step: begin development of v1 CLI gem._
5
+
6
+ ## Overview
7
+
8
+ A single-player command-line bowling game Ruby gem that uses a custom dice mechanic to simulate bowling. The game features interactive play, emoji-rich output, and an ASCII table styled like a real bowling scorecard. The goal is to provide a fun, replayable bowling experience with future extensibility for multiplayer, leaderboards, and more.
9
+
10
+ ## Requirements
11
+
12
+ - **Access:**
13
+ Any user who can install Ruby gems and run commands in the terminal. No special permissions required.
14
+
15
+ - **UI:**
16
+ - Command-line interface (CLI) with interactive prompts.
17
+ - ASCII table styled like a real bowling scorecard.
18
+ - Emoji usage for pins, balls, strikes, spares, splits (e.g., 🎳, 🦃, 🍌, etc.).
19
+ - Menu with "Start Game" and "Exit" options.
20
+ - Prompt for player name, with a random fun bowling pun name as default (user can override).
21
+
22
+ - **Data Model:**
23
+ - Game session: player name, frames, rolls, scores.
24
+ - Dice logic: see "Dice Logic Specification" below.
25
+ - Logging: error logs (plain text or JSON, best practice).
26
+
27
+ - **Navigation:**
28
+ - User starts by running the gem (e.g., `bowlero`).
29
+ - Menu: Start Game, Exit.
30
+ - Prompts for name, then game begins.
31
+ - After game: show final score, prompt to play again or exit.
32
+ - Option to play a single game or a "series" of three games.
33
+
34
+ - **Testing:**
35
+ - Unit tests for dice logic, scoring, and CLI interactions.
36
+ - Manual testing for CLI flow and user experience.
37
+
38
+ - **Other:**
39
+ - Error handling: user-friendly messages, log errors to file.
40
+ - Confirmation prompt on mid-game exit.
41
+ - No platform-specific dependencies; should work on Mac, Linux, Windows.
42
+ - Future: multiplayer, save/load, leaderboards, autoplay, command-line flags, debug mode.
43
+
44
+ ## Dice Logic Specification
45
+
46
+ The bowling game uses a set of custom dice to simulate the outcome of each frame. The dice and their logic are as follows:
47
+
48
+ ### Dice Used
49
+
50
+ 1. **Strike Die**
51
+ - Sides 1–5: Number of pins knocked down (1–5)
52
+ - Side 6: "Strike" (all 10 pins knocked down, frame ends)
53
+
54
+ 2. **Split Die**
55
+ - Sides 1–5: Number of pins knocked down (1–5)
56
+ - Side 6: "Split" (special split scenario, see below)
57
+
58
+ 3. **Split Resolution Die** (used only if "Split" is rolled on the Split Die)
59
+ - Sides 1–4: "Open" (split not converted, no spare)
60
+ - Sides 5–6: "Spare" (split converted, all pins knocked down)
61
+
62
+ 4. **Spare Resolution Die** (used if no Strike or Split is rolled)
63
+ - Sides 1–4: "Spare" (all remaining pins knocked down)
64
+ - Sides 5–6: "Open" (some pins left standing, no spare)
65
+
66
+ ### Roll Sequence (Per Frame)
67
+
68
+ 1. **First Roll:**
69
+ - Roll both the Strike Die and the Split Die together.
70
+ - If the Strike Die lands on "Strike," it's a strike (10 pins, frame ends).
71
+ - Otherwise, sum the pins from both dice:
72
+ - If the Split Die lands on 1–5, add that number to the Strike Die's result (total 2–10 pins).
73
+ - If the Split Die lands on "Split," add 6 pins to the Strike Die's result (total 7–11 pins).
74
+ - If the total pins knocked down is 10 or more, it's a strike (frame ends).
75
+ - If not a strike, proceed to the second roll.
76
+
77
+ 2. **Second Roll:**
78
+ - If the first roll resulted in a "Split," roll the Split Resolution Die:
79
+ - "Spare": All remaining pins knocked down (spare).
80
+ - "Open": Some pins left standing (open frame).
81
+ - If the first roll did NOT result in a "Split," roll the Spare Resolution Die:
82
+ - "Spare": All remaining pins knocked down (spare).
83
+ - "Open": Some pins left standing (open frame).
84
+
85
+ ### Special Notes
86
+
87
+ - If the Strike Die is "Strike," ignore the Split Die result.
88
+ - If the total pins from both dice (excluding "Strike" on Strike Die) is 10 or more, treat as a strike.
89
+ - If the Split Die is "Split," always add 6 pins for that die, regardless of the Strike Die's value.
90
+ - The second roll is always either the Split Resolution Die (if "Split" was rolled) or the Spare Resolution Die (otherwise).
91
+ - All outcomes are described to the player in plain language (e.g., "You knocked down 5 pins and left a split."). Dice roll values are not shown unless a future debug mode is enabled.
92
+
93
+ ## User Journey
94
+
95
+ - **How does a user get there?**
96
+ Installs the gem, runs `bowlero` in the terminal. Sees a menu with options.
97
+
98
+ - **What do they do when they are there?**
99
+ Selects "Start Game," enters (or accepts) a player name, chooses single game or series, plays through 10 frames, rolling dice per frame, sees results and score updates after each roll.
100
+
101
+ - **What happens if it goes right?**
102
+ User completes the game, sees a final scorecard with emojis and summary, and is prompted to play again or exit.
103
+
104
+ - **What happens if it goes wrong?**
105
+ Any errors (e.g., invalid input, unexpected exceptions) are caught, a friendly message is shown, and the error is logged for debugging. If user tries to exit mid-game, a confirmation prompt appears.
106
+
107
+ - **Where does it take them when they are done?**
108
+ After the game, user can choose to play again (with same or new name) or exit to the terminal.
109
+
110
+ ## Implementation Phases
111
+
112
+ ### Phase 1: CLI Gem MVP [ ]
113
+ - [x] Set up gem structure and CLI entry point
114
+ - [x] Implement menu system (Start Game, Exit)
115
+ - [x] Implement player name prompt with random pun defaults
116
+ - [x] Implement dice logic and frame/roll mechanics (see Dice Logic Specification)
117
+ - [x] Add Frame class to represent each frame's data
118
+ - [x] Refactor CLI game loop to use Frame objects for each frame
119
+ - [x] Implement bowling scoring logic (standard rules)
120
+ - [x] Render ASCII bowling scorecard with emoji support (final: ASCII only for alignment; emojis in play-by-play)
121
+ - [ ] Add confirmation prompt for mid-game exit
122
+ - [ ] Implement error handling and logging (best practice)
123
+ - [ ] Unit tests for core logic (dice, scoring, CLI)
124
+ - [ ] Manual test for CLI flow
125
+
126
+ ### Phase 2: Polish & UX Enhancements [ ]
127
+ - [ ] Refine emoji usage (pins, balls, strikes, spares, splits, turkey, etc.)
128
+ - [ ] Improve scorecard styling to match real bowling cards
129
+ - [ ] Add option for single game or series of three games
130
+ - [ ] Add help/instructions (in-menu and `-h` flag)
131
+ - [ ] Review and update documentation
132
+
133
+ ### Phase 3: Future Features (Not in v1) [ ]
134
+ - [ ] Multiplayer support
135
+ - [ ] Save/load game sessions
136
+ - [ ] Local/global leaderboards
137
+ - [ ] Autoplay/debug modes
138
+ - [ ] Command-line flags for advanced options
139
+ - [ ] Custom rules/equipment
140
+
141
+ ## Key Files Modified
142
+
143
+ - bin/bowlero
144
+ - lib/bowlero.rb
145
+ - lib/bowlero/frame.rb
146
+ - lib/bowlero/dice.rb
147
+
148
+ ## Current Status
149
+
150
+ Requirements and plan approved. Ready for initial gem scaffolding and CLI implementation. No blockers.
151
+
152
+ ## Recent Progress
153
+
154
+ - Requirements clarified and confirmed with stakeholder
155
+ - User journey and dice mechanics defined
156
+ - Plan and phases outlined
157
+ - 2025-05-13: CLI entry point and interactive menu implemented. Player name prompt with pun names added.
158
+ - 2025-05-13: Full 10-frame game flow with dice logic implemented in CLI.
159
+ - 2025-05-13: Frame class (Bowlero::Frame) added for structured frame data.
160
+ - 2025-05-13: Refactored CLI to use Bowlero::Frame objects for each frame. Added lib/bowlero.rb to require all submodules. CLI now tracks all frame data in Frame objects.
161
+ - 2025-06-07: Implemented standard bowling scoring logic (including strike and spare bonuses) and running/final score display.
162
+ - 2025-06-07: Implemented ASCII bowling scorecard for perfect alignment; emojis now reserved for play-by-play and summary.
163
+
164
+ ## Next Steps for Next Agent
165
+
166
+ > ### Handoff Note for Next Agent
167
+ > The game now fully implements correct bowling rules for all frames, including the 10th frame (extra rolls for strikes/spares, correct pin counting, and dice logic for all rolls). The dice logic is now accurate: both the Strike Die and Split Die are rolled together for the first roll in every frame, and the result is handled as per the Dice Logic Specification. The scorecard and running/final scores are displayed correctly. Remaining tasks include: adding a confirmation prompt for mid-game exit, implementing error handling and logging, adding series mode (option for 3 games), and further polish (emojis, UX, tests, documentation). The code is ready for these next steps.
168
+
169
+ - [x] Refactor the CLI game loop to use Frame objects for each frame
170
+ - [x] Implement standard bowling scoring logic using Frame data (including strike and spare bonuses)
171
+ - [x] Update the game summary to show running and final scores for the player
172
+ - [x] Render ASCII bowling scorecard (ASCII only for alignment; emojis in play-by-play)
173
+ - [x] Implement correct 10th frame logic (extra rolls for strikes/spares, correct pin counting, dice logic applies to all rolls)
174
+ - [x] Refactor dice rolling logic to roll both Strike Die and Split Die together for the first roll in all frames, as per Dice Logic Specification
175
+ - [ ] Add confirmation prompt for mid-game exit
176
+ - [ ] Implement error handling and logging
177
+ - [ ] Add series mode (option for 3 games)
178
+
179
+ ## Technical Details & Decisions
180
+
181
+ - Dice logic: See Dice Logic Specification above for full details.
182
+ - Scorecard: ASCII table, styled after real bowling cards, with emoji overlays.
183
+ - Logging: Use Ruby's Logger or similar, log to file in current directory, plain text for simplicity.
184
+ - CLI: Use Thor or OptionParser for CLI entry, but keep initial version minimal and interactive.
185
+ - Player names: Array of 10 bowling pun names, randomly assigned if user skips input.
186
+
187
+ ## Migration/Data Mapping (if applicable)
188
+
189
+ | Old Field/Model | New Field/Model | Notes |
190
+ |-----------------|-----------------|-------|
191
+ | N/A | N/A | First version, no migration needed |
192
+
193
+ ## Success Criteria
194
+
195
+ 1. User can install gem, run `bowlero`, and play a full single-player game with correct scoring and dice logic.
196
+ 2. Output includes ASCII scorecard and emojis for key events.
197
+ 3. Errors are handled gracefully and logged.
198
+ 4. User can exit or replay at end of game, with confirmation on mid-game exit.
199
+
200
+ ## Task Checklist
201
+
202
+ - [ ] Gem scaffolding and CLI entry
203
+ - [ ] Menu and player name prompt
204
+ - [ ] Dice and scoring logic
205
+ - [ ] Scorecard rendering with emojis
206
+ - [ ] Error handling and logging
207
+ - [ ] Unit and manual tests
208
+
209
+ ## Known Issues / Next Steps
210
+
211
+ - No multiplayer, save/load, or leaderboards in v1.
212
+ - Emoji rendering may vary by terminal.
213
+ - Future: add debug mode, custom rules, and more polish.
214
+
215
+ ## Future Considerations
216
+
217
+ - Multiplayer support (local and online)
218
+ - Save/load and resume games
219
+ - Leaderboards (local and global)
220
+ - Autoplay/debug modes
221
+ - Command-line flags for advanced options
222
+ - Custom rules/equipment
223
+ - Accessibility improvements
224
+
225
+ ## Testing
226
+
227
+ ### Model Specs
228
+ - [ ] Dice logic: correct mapping of rolls to bowling events
229
+ - [ ] Scoring: standard bowling rules, including strikes/spares
230
+
231
+ ### Controller/Request Specs
232
+ - [ ] CLI menu navigation
233
+ - [ ] Player name prompt and defaults
234
+
235
+ ### Integration/Feature Specs
236
+ - [ ] Full game flow: start, play, score, end, replay/exit
237
+ - [ ] Error handling and logging
238
+
239
+ ---
240
+
241
+ ## Progress Log
242
+ - 2024-06-07: Plan drafted and approved (by PM/Stakeholder)
243
+ - 2024-06-07: Ready for initial implementation
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bowlero
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mike Benner
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies: []
12
+ description: Bowlero is a single-player CLI bowling game with custom dice mechanics,
13
+ emoji-rich output, and an ASCII scorecard. Play a full game of bowling in your terminal!
14
+ email:
15
+ - mike.benner@strongmind.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - ".rspec"
21
+ - ".rubocop.yml"
22
+ - CHANGELOG.md
23
+ - LICENSE
24
+ - LICENSE.txt
25
+ - README.md
26
+ - Rakefile
27
+ - lib/bowlero.rb
28
+ - lib/bowlero/dice.rb
29
+ - lib/bowlero/frame.rb
30
+ - lib/bowlero/version.rb
31
+ - sig/bowlero.rbs
32
+ - stories/KOANI-300.md
33
+ homepage: https://github.com/refriedchicken/bowlero
34
+ licenses:
35
+ - MIT
36
+ metadata:
37
+ homepage_uri: https://github.com/refriedchicken/bowlero
38
+ source_code_uri: https://github.com/refriedchicken/bowlero
39
+ changelog_uri: https://github.com/refriedchicken/bowlero/blob/main/CHANGELOG.md
40
+ rdoc_options: []
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 3.1.0
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubygems_version: 3.6.8
55
+ specification_version: 4
56
+ summary: A fun, replayable command-line bowling game Ruby gem.
57
+ test_files: []