rage_flip 1.0.0 → 1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f4b780908672f74c2712af5e8181f0d9cb4dbd16762c7f6cfeed78d1919de117
4
- data.tar.gz: 9195ac9f1f12a2158851f4ff8e14888a55bb967800a04496ade227ab16887e60
3
+ metadata.gz: 1511661bf220838be2dabc493a7ba1769a2780909ad33f285d21b0482c79038b
4
+ data.tar.gz: 61a701d70ad291b667144056763746f4c09ab7c70955b07d66e45c9df3390e87
5
5
  SHA512:
6
- metadata.gz: 01ab12c8e8b0d5a211d00a0debaf91084b4581812810f9681c874fc8bdeeaed913d3351779b0d17df5c2ce2ebae45fae2f647df525c478b1114e47d1523194e7
7
- data.tar.gz: fb9930f012419ba490887f7b292c85e2b6cbce3cf6837fd417f4c25f80d3af010fd09a945ffa4c043d062b760f3b0625ddbac8ad94aa7e9e44111b3c69369a68
6
+ metadata.gz: 65378ff0cd33a514d229c313366227dcb38051355bfc403ad47bac9b82811682adee897bba7ec84bfbaba7fba5e14f5551b3ba87b59fbf67b5b1175d8e612e08
7
+ data.tar.gz: 2dce9f11ceafea826aae4604fae2a71dd132d85e01648075bb061f157e48eb39d1e4b097fae9275af2559f224ec182407315b1ef3c6743bb8b2976d58c8a8611
data/CHANGELOG.md CHANGED
@@ -7,6 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Added
11
+ - `flip_text` command for flipping text without any emoticons
12
+ - `emote` command system with disapproval and animal+poop combinations
13
+ - `emote disapproval` outputs `(ಠ_ಠ)`
14
+ - `emote bullshit`, `catshit`, `dogshit`, `pandashit`, `horseshit`, `batshit` commands
15
+ - `emote list` to display all available emotes
16
+ - `table_flip` command with classic `(╯°□°)╯︵` and `┻━┻` emoticons
17
+
18
+ ## [1.0.1] - 2025-10-04
19
+
20
+ ### Added
21
+ - Persistent chaos level storage in `~/.chaos_level.txt`
22
+ - `chaos_level show` command to display current chaos level
23
+ - Chaos level minimum enforcement (cannot go below 1)
24
+
25
+ ### Changed
26
+ - Chaos level now persists across terminal sessions and reboots
27
+ - Removed dependency on `CHAOS_LEVEL` environment variable
28
+
29
+ ## [1.0.0] - 2025-10-03
30
+
10
31
  ### Added
11
32
  - Version management and release automation
12
33
 
data/README.md CHANGED
@@ -41,6 +41,48 @@ The flip transformation:
41
41
  - Maps characters to their upside-down equivalents
42
42
  - Wraps the result with `(ノಠ益ಠ)ノ彡┻` and `┻`
43
43
 
44
+ ### table_flip
45
+
46
+ The classic table flip command flips text upside down with the iconic table flip emoticons:
47
+
48
+ ```bash
49
+ table_flip "Hello World"
50
+ # Output: (╯°□°)╯︵ plɹoM ollǝH ┻━┻
51
+ # Result is automatically copied to clipboard
52
+ ```
53
+
54
+ Uses the classic `(╯°□°)╯︵` and `┻━┻` emoticons for a more traditional table flip style.
55
+
56
+ ### flip_text
57
+
58
+ Flips text upside down without any emoticons:
59
+
60
+ ```bash
61
+ flip_text "Hello World"
62
+ # Output: plɹoM ollǝH
63
+ # Result is automatically copied to clipboard
64
+ ```
65
+
66
+ Just the pure flipped text without any rage or table flip decorations.
67
+
68
+ ### emote
69
+
70
+ The emote system provides various emoticons and emoji sequences:
71
+
72
+ ```bash
73
+ emote # List all available emotes
74
+ emote list # List all available emotes
75
+ emote disapproval # Output: (ಠ_ಠ)
76
+ emote bullshit # Output: 🐄💩
77
+ emote catshit # Output: �💩
78
+ emote dogshit # Output: �💩
79
+ emote pandashit # Output: 🐼💩
80
+ emote horseshit # Output: 🐴💩
81
+ emote batshit # Output: 🦇💩
82
+ ```
83
+
84
+ All emotes are accessed through the `emote` command followed by the emote name.
85
+
44
86
  ### sarcasm
45
87
 
46
88
  Alternates between uppercase and lowercase characters:
@@ -86,13 +128,15 @@ chaos "chaotic text"
86
128
  # Output: c̸̰̈h̴̲̆a̷̰̋ò̶̰ẗ̸̲ḭ̷̋c̶̰̈ ̸̰̈t̷̰̋ĕ̴̲ẍ̸̰t̷̰̋
87
129
  ```
88
130
 
89
- The chaos level can be controlled with the `CHAOS_LEVEL` environment variable or the `chaos_level` command.
131
+ The chaos level is persistently stored in `~/.chaos_level.txt` and can be controlled with the `chaos_level` command.
90
132
 
91
133
  ### chaos_level
92
134
 
93
135
  Controls the chaos level for the chaos command:
94
136
 
95
137
  ```bash
138
+ chaos_level # Show current chaos level
139
+ chaos_level show # Show current chaos level
96
140
  chaos_level more # Increase chaos level by 1
97
141
  chaos_level less # Decrease chaos level by 1
98
142
  chaos_level 15 # Set chaos level to 15
@@ -119,9 +163,9 @@ The flip functionality uses comprehensive character mappings including:
119
163
  - Common punctuation and symbols
120
164
  - Special Unicode characters for upside-down equivalents
121
165
 
122
- ## Environment Variables
166
+ ## Persistent Settings
123
167
 
124
- - `CHAOS_LEVEL`: Controls the intensity of the chaos effect (default: 10)
168
+ - **Chaos Level**: Stored in `~/.chaos_level.txt` and controls the intensity of the chaos effect (default: 10). This setting persists across terminal sessions and system reboots.
125
169
 
126
170
  ## Library Usage
127
171
 
@@ -134,10 +178,18 @@ require 'rage_flip'
134
178
  RageFlip::Flipper.rage_flip("Hello World")
135
179
  # => "(ノಠ益ಠ)ノ彡┻plɹoM ollǝH┻"
136
180
 
181
+ # Flip text with classic table flip emoticons
182
+ RageFlip::Flipper.table_flip("Hello World")
183
+ # => "(╯°□°)╯︵ plɹoM ollǝH ┻━┻"
184
+
137
185
  # Just flip without emoticons
138
186
  RageFlip::Flipper.flip("Hello")
139
187
  # => "ollǝH"
140
188
 
189
+ # Flip text (same as flip)
190
+ RageFlip::Flipper.flip_text("Hello")
191
+ # => "ollǝH"
192
+
141
193
  # Sarcastic text
142
194
  RageFlip::Sarcasm.process("hello world")
143
195
  # => "HeLlO WoRlD"
@@ -157,6 +209,16 @@ RageFlip::Underline.double_underline("text")
157
209
  RageFlip::Chaos.process("text", 5)
158
210
  # => "t̸e̷x̸t̷"
159
211
 
212
+ # Emotes
213
+ RageFlip::Emote.process("disapproval")
214
+ # => "(ಠ_ಠ)"
215
+
216
+ RageFlip::Emote.process("bullshit")
217
+ # => "🐄💩"
218
+
219
+ RageFlip::Emote.list_emotes
220
+ # => "Available emotes:\n disapproval - (ಠ_ಠ)\n bullshit - 🐄💩\n..."
221
+
160
222
  # Copy to clipboard
161
223
  RageFlip::Clipboard.copy("text to copy")
162
224
  ```
data/exe/chaos CHANGED
@@ -9,8 +9,7 @@ if text.empty?
9
9
  exit 1
10
10
  end
11
11
 
12
- chaos_level = ENV['CHAOS_LEVEL']&.to_i || 10
13
- result = RageFlip::Chaos.process(text, chaos_level)
12
+ result = RageFlip::Chaos.process(text)
14
13
 
15
14
  if RageFlip::Clipboard.copy(result)
16
15
  puts result
data/exe/chaos_level CHANGED
@@ -2,14 +2,24 @@
2
2
 
3
3
  require_relative '../lib/rage_flip'
4
4
 
5
- if ARGV.length != 1
6
- puts "Usage: chaos_level <more|less|number>"
7
- puts " more - Increase chaos level by 1"
8
- puts " less - Decrease chaos level by 1"
9
- puts " number - Set chaos level to specific number"
5
+ if ARGV.length == 0
6
+ puts "Current chaos level: #{RageFlip::Chaos.current_chaos_level}"
7
+ exit 0
8
+ elsif ARGV.length != 1
9
+ puts "Usage: chaos_level [more|less|number|show]"
10
+ puts " (no args) - Show current chaos level"
11
+ puts " more - Increase chaos level by 1"
12
+ puts " less - Decrease chaos level by 1"
13
+ puts " number - Set chaos level to specific number"
14
+ puts " show - Show current chaos level"
10
15
  exit 1
11
16
  end
12
17
 
13
18
  instruction = ARGV[0]
14
- result = RageFlip::Chaos.set_chaos_level(instruction)
15
- puts result
19
+
20
+ if instruction == 'show'
21
+ puts "Current chaos level: #{RageFlip::Chaos.current_chaos_level}"
22
+ else
23
+ result = RageFlip::Chaos.set_chaos_level(instruction)
24
+ puts result
25
+ end
data/exe/emote ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/rage_flip'
4
+
5
+ if ARGV.length == 0
6
+ puts RageFlip::Emote.list_emotes
7
+ exit 0
8
+ end
9
+
10
+ emote_name = ARGV[0].downcase
11
+
12
+ if emote_name == 'list'
13
+ puts RageFlip::Emote.list_emotes
14
+ exit 0
15
+ end
16
+
17
+ result = RageFlip::Emote.process(emote_name)
18
+
19
+ if result
20
+ # Copy to clipboard
21
+ if RageFlip::Clipboard.copy(result)
22
+ puts result
23
+ else
24
+ puts "Failed to copy to clipboard, but here's your emote:"
25
+ puts result
26
+ end
27
+ else
28
+ puts "Unknown emote: #{emote_name}"
29
+ puts ""
30
+ puts RageFlip::Emote.list_emotes
31
+ exit 1
32
+ end
data/exe/flip_text ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/rage_flip'
4
+
5
+ text = ARGV.join(' ')
6
+
7
+ if text.empty?
8
+ puts "Usage: flip_text <text_to_flip>"
9
+ exit 1
10
+ end
11
+
12
+ # Just flip the text without any emoticons
13
+ result = RageFlip::Flipper.flip_text(text)
14
+
15
+ # Copy to clipboard
16
+ if RageFlip::Clipboard.copy(result)
17
+ puts result
18
+ else
19
+ puts "Failed to copy to clipboard, but here's your flipped text:"
20
+ puts result
21
+ end
data/exe/table_flip ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/rage_flip'
4
+
5
+ text = ARGV.join(' ')
6
+
7
+ if text.empty?
8
+ puts "Usage: table_flip <text_to_flip>"
9
+ exit 1
10
+ end
11
+
12
+ # Create the table flip with classic table flip emoticons
13
+ result = RageFlip::Flipper.table_flip(text)
14
+
15
+ # Copy to clipboard
16
+ if RageFlip::Clipboard.copy(result)
17
+ puts result
18
+ else
19
+ puts "Failed to copy to clipboard, but here's your table flipped text:"
20
+ puts result
21
+ end
@@ -1,9 +1,10 @@
1
1
  module RageFlip
2
2
  class Chaos
3
3
  DEFAULT_CHAOS_LEVEL = 10
4
+ CHAOS_LEVEL_FILE = File.expand_path("~/.chaos_level.txt")
4
5
 
5
6
  def self.process(text, chaos_level = nil)
6
- chaos_level ||= ENV['CHAOS_LEVEL']&.to_i || DEFAULT_CHAOS_LEVEL
7
+ chaos_level ||= read_chaos_level
7
8
 
8
9
  text.each_char.map do |c|
9
10
  combining_chars = rand(1..chaos_level).times.map do
@@ -14,18 +15,39 @@ module RageFlip
14
15
  end
15
16
 
16
17
  def self.set_chaos_level(instruction)
17
- current_level = ENV['CHAOS_LEVEL']&.to_i || DEFAULT_CHAOS_LEVEL
18
+ current_level = read_chaos_level
18
19
 
19
20
  case instruction
20
21
  when 'more'
21
- ENV['CHAOS_LEVEL'] = (current_level + 1).to_s
22
+ new_level = current_level + 1
22
23
  when 'less'
23
- ENV['CHAOS_LEVEL'] = (current_level - 1).to_s
24
+ new_level = [current_level - 1, 1].max # Don't go below 1
24
25
  else
25
- ENV['CHAOS_LEVEL'] = instruction.to_s
26
+ new_level = instruction.to_i
27
+ if new_level <= 0
28
+ return "Error: Chaos level must be a positive number"
29
+ end
26
30
  end
27
31
 
28
- "chaos level is now #{ENV['CHAOS_LEVEL']}"
32
+ write_chaos_level(new_level)
33
+ "chaos level is now #{new_level}"
34
+ end
35
+
36
+ def self.read_chaos_level
37
+ if File.exist?(CHAOS_LEVEL_FILE)
38
+ level = File.read(CHAOS_LEVEL_FILE).strip.to_i
39
+ level > 0 ? level : DEFAULT_CHAOS_LEVEL
40
+ else
41
+ DEFAULT_CHAOS_LEVEL
42
+ end
43
+ end
44
+
45
+ def self.write_chaos_level(level)
46
+ File.write(CHAOS_LEVEL_FILE, level.to_s)
47
+ end
48
+
49
+ def self.current_chaos_level
50
+ read_chaos_level
29
51
  end
30
52
  end
31
53
  end
@@ -0,0 +1,39 @@
1
+ module RageFlip
2
+ class Emote
3
+ EMOTES = {
4
+ 'disapproval' => '(ಠ_ಠ)',
5
+ 'bullshit' => '🐄💩',
6
+ 'catshit' => '🐱💩',
7
+ 'dogshit' => '🐶💩',
8
+ 'pandashit' => '🐼💩',
9
+ 'horseshit' => '🐴💩',
10
+ 'batshit' => '🦇💩'
11
+ }.freeze
12
+
13
+ def self.process(emote_name)
14
+ emote_name = emote_name.downcase
15
+
16
+ if EMOTES.key?(emote_name)
17
+ EMOTES[emote_name]
18
+ else
19
+ nil
20
+ end
21
+ end
22
+
23
+ def self.list_emotes
24
+ output = ["Available emotes:"]
25
+ EMOTES.each do |name, emote|
26
+ output << " #{name.ljust(12)} - #{emote}"
27
+ end
28
+ output.join("\n")
29
+ end
30
+
31
+ def self.emote_exists?(name)
32
+ EMOTES.key?(name.downcase)
33
+ end
34
+
35
+ def self.emote_names
36
+ EMOTES.keys
37
+ end
38
+ end
39
+ end
@@ -29,5 +29,16 @@ module RageFlip
29
29
 
30
30
  "#{rageflip_front}#{flip(text)}#{rageflip_back}"
31
31
  end
32
+
33
+ def self.table_flip(text)
34
+ table_flip_front = "(╯°□°)╯︵ "
35
+ table_flip_back = " ┻━┻"
36
+
37
+ "#{table_flip_front}#{flip(text)}#{table_flip_back}"
38
+ end
39
+
40
+ def self.flip_text(text)
41
+ flip(text)
42
+ end
32
43
  end
33
44
  end
@@ -1,3 +1,3 @@
1
1
  module RageFlip
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
data/lib/rage_flip.rb CHANGED
@@ -5,6 +5,7 @@ require_relative "rage_flip/strikethrough"
5
5
  require_relative "rage_flip/underline"
6
6
  require_relative "rage_flip/chaos"
7
7
  require_relative "rage_flip/clipboard"
8
+ require_relative "rage_flip/emote"
8
9
  require 'shellwords'
9
10
 
10
11
  module RageFlip
@@ -16,6 +16,24 @@ RSpec.describe RageFlip do
16
16
  expect(result).to include('┻')
17
17
  end
18
18
  end
19
+
20
+ describe '.table_flip' do
21
+ it 'adds table flip emoticons to flipped text' do
22
+ result = RageFlip::Flipper.table_flip('test')
23
+ expect(result).to include('(╯°□°)╯︵')
24
+ expect(result).to include('┻━┻')
25
+ expect(result).to include('ʇsǝʇ') # flipped version of 'test'
26
+ end
27
+ end
28
+
29
+ describe '.flip_text' do
30
+ it 'flips text without any emoticons' do
31
+ result = RageFlip::Flipper.flip_text('test')
32
+ expect(result).to eq('ʇsǝʇ')
33
+ expect(result).not_to include('(')
34
+ expect(result).not_to include('┻')
35
+ end
36
+ end
19
37
  end
20
38
 
21
39
  describe RageFlip::Sarcasm do
@@ -53,19 +71,118 @@ RSpec.describe RageFlip do
53
71
  end
54
72
 
55
73
  describe RageFlip::Chaos do
74
+ let(:chaos_file) { File.expand_path("~/.chaos_level.txt") }
75
+
76
+ before do
77
+ # Clean up chaos file before each test
78
+ File.delete(chaos_file) if File.exist?(chaos_file)
79
+ end
80
+
81
+ after do
82
+ # Clean up chaos file after each test
83
+ File.delete(chaos_file) if File.exist?(chaos_file)
84
+ end
85
+
56
86
  describe '.process' do
57
87
  it 'adds combining characters for chaos effect' do
58
88
  result = RageFlip::Chaos.process('test', 5)
59
89
  expect(result.length).to be > 4 # Should be longer than original
60
90
  end
91
+
92
+ it 'uses default chaos level when no file exists' do
93
+ result = RageFlip::Chaos.process('test')
94
+ expect(result.length).to be > 4 # Should be longer than original
95
+ end
61
96
  end
62
97
 
63
98
  describe '.set_chaos_level' do
64
99
  it 'sets chaos level to specific number' do
65
100
  result = RageFlip::Chaos.set_chaos_level('15')
66
- expect(ENV['CHAOS_LEVEL']).to eq('15')
101
+ expect(File.read(chaos_file).strip).to eq('15')
67
102
  expect(result).to eq('chaos level is now 15')
68
103
  end
104
+
105
+ it 'increases chaos level with more' do
106
+ RageFlip::Chaos.set_chaos_level('10')
107
+ result = RageFlip::Chaos.set_chaos_level('more')
108
+ expect(File.read(chaos_file).strip).to eq('11')
109
+ expect(result).to eq('chaos level is now 11')
110
+ end
111
+
112
+ it 'decreases chaos level with less' do
113
+ RageFlip::Chaos.set_chaos_level('10')
114
+ result = RageFlip::Chaos.set_chaos_level('less')
115
+ expect(File.read(chaos_file).strip).to eq('9')
116
+ expect(result).to eq('chaos level is now 9')
117
+ end
118
+
119
+ it 'does not go below 1' do
120
+ RageFlip::Chaos.set_chaos_level('1')
121
+ result = RageFlip::Chaos.set_chaos_level('less')
122
+ expect(File.read(chaos_file).strip).to eq('1')
123
+ expect(result).to eq('chaos level is now 1')
124
+ end
125
+ end
126
+
127
+ describe '.read_chaos_level' do
128
+ it 'returns default when file does not exist' do
129
+ expect(RageFlip::Chaos.read_chaos_level).to eq(10)
130
+ end
131
+
132
+ it 'reads level from file when it exists' do
133
+ File.write(chaos_file, '25')
134
+ expect(RageFlip::Chaos.read_chaos_level).to eq(25)
135
+ end
136
+ end
137
+ end
138
+
139
+ describe RageFlip::Emote do
140
+ describe '.process' do
141
+ it 'returns correct emote for disapproval' do
142
+ result = RageFlip::Emote.process('disapproval')
143
+ expect(result).to eq('(ಠ_ಠ)')
144
+ end
145
+
146
+ it 'returns correct emote for bullshit' do
147
+ result = RageFlip::Emote.process('bullshit')
148
+ expect(result).to eq('🐄💩')
149
+ end
150
+
151
+ it 'returns correct emote for dogshit' do
152
+ result = RageFlip::Emote.process('dogshit')
153
+ expect(result).to eq('🐶💩')
154
+ end
155
+
156
+ it 'handles case insensitive input' do
157
+ result = RageFlip::Emote.process('DISAPPROVAL')
158
+ expect(result).to eq('(ಠ_ಠ)')
159
+ end
160
+
161
+ it 'returns nil for unknown emote' do
162
+ result = RageFlip::Emote.process('unknown')
163
+ expect(result).to be_nil
164
+ end
165
+ end
166
+
167
+ describe '.list_emotes' do
168
+ it 'returns formatted list of all emotes' do
169
+ result = RageFlip::Emote.list_emotes
170
+ expect(result).to include('Available emotes:')
171
+ expect(result).to include('disapproval')
172
+ expect(result).to include('(ಠ_ಠ)')
173
+ expect(result).to include('bullshit')
174
+ expect(result).to include('🐄💩')
175
+ end
176
+ end
177
+
178
+ describe '.emote_exists?' do
179
+ it 'returns true for existing emote' do
180
+ expect(RageFlip::Emote.emote_exists?('disapproval')).to be true
181
+ end
182
+
183
+ it 'returns false for non-existing emote' do
184
+ expect(RageFlip::Emote.emote_exists?('nonexistent')).to be false
185
+ end
69
186
  end
70
187
  end
71
188
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rage_flip
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Powell
@@ -46,9 +46,12 @@ executables:
46
46
  - chaos
47
47
  - chaos_level
48
48
  - doubleunderline
49
+ - emote
50
+ - flip_text
49
51
  - rage_flip
50
52
  - sarcasm
51
53
  - strikethrough
54
+ - table_flip
52
55
  - underline
53
56
  extensions: []
54
57
  extra_rdoc_files: []
@@ -63,13 +66,17 @@ files:
63
66
  - exe/chaos
64
67
  - exe/chaos_level
65
68
  - exe/doubleunderline
69
+ - exe/emote
70
+ - exe/flip_text
66
71
  - exe/rage_flip
67
72
  - exe/sarcasm
68
73
  - exe/strikethrough
74
+ - exe/table_flip
69
75
  - exe/underline
70
76
  - lib/rage_flip.rb
71
77
  - lib/rage_flip/chaos.rb
72
78
  - lib/rage_flip/clipboard.rb
79
+ - lib/rage_flip/emote.rb
73
80
  - lib/rage_flip/flipper.rb
74
81
  - lib/rage_flip/sarcasm.rb
75
82
  - lib/rage_flip/strikethrough.rb