Skip to content

Commit

Permalink
refactor: move Postal::QueryString to app/util/query_string
Browse files Browse the repository at this point in the history
  • Loading branch information
adamcooke committed Feb 23, 2024
1 parent 05d2ec4 commit 870b26c
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 83 deletions.
2 changes: 1 addition & 1 deletion app/controllers/messages_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ def get_messages(scope)

if @query = (params[:query] || session["msg_query_#{@server.id}_#{scope}"]).presence
session["msg_query_#{@server.id}_#{scope}"] = @query
qs = Postal::QueryString.new(@query)
qs = QueryString.new(@query)
if qs.empty?
flash.now[:alert] = "It doesn't appear you entered anything to filter on. Please double check your query."
else
Expand Down
36 changes: 36 additions & 0 deletions app/util/query_string.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# frozen_string_literal: true

class QueryString

def initialize(string)
@string = string.strip + " "
end

def [](value)
hash[value.to_s]
end

delegate :empty?, to: :hash

def hash
@hash ||= @string.scan(/([a-z]+):\s*(?:(\d{2,4}-\d{2}-\d{2}\s\d{2}:\d{2})|"(.*?)"|(.*?))(\s|\z)/).each_with_object({}) do |(key, date, string_with_spaces, value), hash|
if date
actual_value = date
elsif string_with_spaces
actual_value = string_with_spaces
elsif value == "[blank]"
actual_value = nil
else
actual_value = value
end

if hash.keys.include?(key.to_s)
hash[key.to_s] = [hash[key.to_s]].flatten
hash[key.to_s] << actual_value
else
hash[key.to_s] = actual_value
end
end
end

end
38 changes: 0 additions & 38 deletions lib/postal/query_string.rb

This file was deleted.

44 changes: 0 additions & 44 deletions spec/lib/postal/query_string_spec.rb

This file was deleted.

44 changes: 44 additions & 0 deletions spec/util/query_string_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# frozen_string_literal: true

require "rails_helper"

describe QueryString do
it "works with a single item" do
qs = described_class.new("to: test@example.com")
expect(qs.hash["to"]).to eq "test@example.com"
end

it "works with a multiple items" do
qs = described_class.new("to: test@example.com from: another@example.com")
expect(qs.hash["to"]).to eq "test@example.com"
expect(qs.hash["from"]).to eq "another@example.com"
end

it "does not require a space after the field name" do
qs = described_class.new("to:test@example.com from:another@example.com")
expect(qs.hash["to"]).to eq "test@example.com"
expect(qs.hash["from"]).to eq "another@example.com"
end

it "returns nil when it receives blank" do
qs = described_class.new("to:[blank]")
expect(qs.hash["to"]).to eq nil
end

it "handles dates with spaces" do
qs = described_class.new("date: 2017-02-12 15:20")
expect(qs.hash["date"]).to eq("2017-02-12 15:20")
end

it "returns an array for multiple items" do
qs = described_class.new("to: test@example.com to: another@example.com")
expect(qs.hash["to"]).to be_a(Array)
expect(qs.hash["to"][0]).to eq "test@example.com"
expect(qs.hash["to"][1]).to eq "another@example.com"
end

it "works with a z in the string" do
qs = described_class.new("to: testaz@example.com")
expect(qs.hash["to"]).to eq "testaz@example.com"
end
end

0 comments on commit 870b26c

Please sign in to comment.