Last active
May 29, 2017 20:11
-
-
Save CoralineAda/94891852c62e70f9e5eab49a4e4dc77b to your computer and use it in GitHub Desktop.
Recursive solution to breaking up arbitrary text into tweet-sized chunks
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Proposed problem: https://twitter.com/CoralineAda/status/869204799027372032