Skip to content

Instantly share code, notes, and snippets.

@CoralineAda
Last active May 29, 2017 20:11
Show Gist options
  • Save CoralineAda/94891852c62e70f9e5eab49a4e4dc77b to your computer and use it in GitHub Desktop.
Save CoralineAda/94891852c62e70f9e5eab49a4e4dc77b to your computer and use it in GitHub Desktop.
Recursive solution to breaking up arbitrary text into tweet-sized chunks
class Chunker
def chunk_message(message, handle="", chunked=[])
return chunked unless message.present?
chunks = message.split
proposed_chunk = [handle, chunked.last, chunks[0]].compact.join(' ').squish
if proposed_chunk.length <= 140
chunked << [chunked.pop, chunks.shift].compact.join(' ')
else
chunked << chunks.shift
end
chunk_message(chunks.join(' '), handle, chunked)
chunked.map{ |chunk| handle.present? ? "#{handle} #{chunk}" : chunk }.flatten
end
end
RSpec.describe Chunker do
let(:client) { Chunker.new }
let(:handle) { "@CoralineAda" }
context "#chunk_message" do
it "preserves a message of 140 characters without a handle" do
message = "Justo Ligula Ipsum Nullam Tellus"
expect(client.chunk_message(message).join(' ')).to eq(message)
end
it "preserves a message of 140 characters with a handle" do
message = "Justo Ligula Ipsum Nullam Tellus"
expect(client.chunk_message(message, handle).join(' ')).to eq("#{handle} #{message}")
end
it "truncates a long message without a handle" do
message = "Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Morbi leo risus, porta ac consectetur ac, vestibulum at eros."
chunked = client.chunk_message(message)
expect(chunked[0]).to eq("Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Morbi leo risus, porta ac")
expect(chunked[1]).to eq("consectetur ac, vestibulum at eros.")
end
it "truncates a long message with a handle" do
message = "Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Morbi leo risus, porta ac consectetur ac, vestibulum at eros."
chunked = client.chunk_message(message, handle)
expect(chunked[0]).to eq("#{handle} Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Morbi leo")
expect(chunked[1]).to eq("#{handle} risus, porta ac consectetur ac, vestibulum at eros.")
end
end
end
@thiagoarrais
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment