Skip to content

Commit

Permalink
Merge pull request #3 from ursm/header
Browse files Browse the repository at this point in the history
Header keys must be unique
  • Loading branch information
ursm authored Jul 6, 2024
2 parents f397a06 + 4a78f2c commit 1866048
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 20 deletions.
25 changes: 13 additions & 12 deletions lib/fetch/headers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,48 +3,49 @@ class Headers
include Enumerable

def initialize(init = [])
@entries = []
@data = {}

init.each do |k, v|
append k, v
end
end

attr_reader :entries

def append(key, value)
@entries << [key.to_s.downcase, value]
(@data[key.to_s.downcase] ||= []) << value
end

def delete(key)
@entries.delete_if {|k,| k == key.to_s.downcase }
@data.delete key.to_s.downcase
end

def entries
@data.map {|k, vs| [k, vs.join(', ')] }
end

def get(key)
@entries.select {|k,| k == key.to_s.downcase }.map(&:last).join(', ')
@data[key.to_s.downcase]&.join(', ')
end

def has(key)
@entries.any? {|k,| k == key.to_s.downcase }
@data.key?(key.to_s.downcase)
end

def keys
@entries.map(&:first)
@data.keys
end

def set(key, value)
delete key
append key, value
@data[key.to_s.downcase] = [value]
end

def values
@entries.map(&:last)
@data.values.map { _1.join(', ') }
end

def each(&block)
return enum_for(:each) unless block_given?

@entries.each(&block)
entries.each(&block)
end
end
end
15 changes: 7 additions & 8 deletions spec/fetch/headers_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@
example 'append' do
headers = Fetch::Headers.new

headers.append :foo, 'bar'
headers.append :foo, 'baz'
headers.append :foo, 'bar'
headers.append 'Foo', 'baz'

expect(headers.entries).to eq([
['foo', 'bar'],
['foo', 'baz']
['foo', 'bar, baz'],
])
end

Expand All @@ -36,6 +35,7 @@

expect(headers.get(:foo)).to eq('bar')
expect(headers.get(:baz)).to eq('qux, quux')
expect(headers.get(:foobar)).to eq(nil)
end

example 'has' do
Expand All @@ -52,7 +52,7 @@
[:baz, 'quux']
])

expect(headers.keys).to eq(%w[foo baz baz])
expect(headers.keys).to eq(%w[foo baz])
end

example 'set' do
Expand All @@ -77,7 +77,7 @@
[:baz, 'quux']
])

expect(headers.values).to eq(%w[bar qux quux])
expect(headers.values).to eq(['bar', 'qux, quux'])
end

example 'each' do
Expand All @@ -89,8 +89,7 @@

expect(headers.to_a).to eq([
['foo', 'bar'],
['baz', 'qux'],
['baz', 'quux']
['baz', 'qux, quux']
])
end
end

0 comments on commit 1866048

Please sign in to comment.