redhead 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  (MIT License)
2
2
 
3
- Copyright (c) 2010 Adam Prescott
3
+ Copyright (c) 2010-2012 Adam Prescott
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -165,8 +165,6 @@ There are conventions followed in creating a Redhead string and modifying certai
165
165
 
166
166
  By default, newly added header field names (i.e., the keys) will become capitalised and hyphen-separated to create their raw header name, so that the symbolic header name `:if_modified_since` becomes the raw header name `If-Modified-Since`. A similar process also happens when turning a string into a Redhead string (in reverse), and when using the default behaviour of `to_s`. To keep symbol names pleasant, by default, anything which isn't `A-Z`, `a-z` or `_` is converted into a `_` character. So `"Some! Long! Header! Name!"` becomes `:some_long_header_name` for accessing within Ruby.
167
167
 
168
- For information on changing the formatting rules, see the section on <a href="#special_circumstances">special circumstances</a>.
169
-
170
168
  ## Header name memory
171
169
 
172
170
  Original header names are remembered from the input string, and not simply created on-the-fly when using `to_s`. This is to make sure you get the same raw heading name, as a string, that you originally read in, instead of assuming you want it to be changed. Access as a Ruby object, however, is with a symbol by default.
@@ -336,126 +334,12 @@ The custom raw header name can also be given explicitly at creation time.
336
334
  >> str.headers
337
335
  => { { :awesome => "quite" } }
338
336
 
339
- >> str.heders.add(:temporary, "temp", "A-Rather-Temporary-Value")
337
+ >> str.headers.add(:temporary, "temp", "A-Rather-Temporary-Value")
340
338
  => { :temp => "temp" }
341
339
 
342
340
  >> str.headers.to_s
343
341
  => "Awesome-Rating: quite\nA-Rather-Temporary-Value: temp"
344
342
 
345
- # Enterprise Header Solutions
346
-
347
- As mentioned, Redhead performs two conversions. One to produce a symbolic header name from the raw header name, and one to produce the raw header name from the symbolic header name. The symbolic -> raw process is used in `to_s!`, to force header names to be produced instead of using the header name remembered from when the header was created.
348
-
349
- If you need to control the format of header names beyond the simple separator option given above, you can provide a block, the result of which is the name used for the raw or symbolic header name.
350
-
351
- If that doesn't make a lot of sense on the first read, don't worry, here's some code.
352
-
353
- >> string = "A-Header-Name: a header value\n\nContent."
354
- => "A-Header-Name: a header value\n\nContent."
355
-
356
- >> str = Redhead::String.new(string) do |name|
357
- ?> name.split(/-/).join("").upcase.to_sym
358
- ?> end
359
- => +"Content."
360
-
361
- >> str.headers
362
- => { { :AHEADERNAME => "a header value" } }
363
-
364
- Note that this uses `Redhead::String.new` instead of `Redhead::String.[]` because of the block argument.
365
-
366
- The above defines how symbolic headers are created in when creating the header objects. Using this approach, you can work with non-standard headers quite easily.
367
-
368
- Note that `to_sym` is _not_ implicit, to suggest you use a pleasant symbol as the key.
369
-
370
- It's also possible to specify the code to be used when calling `to_s`:
371
-
372
- >> str.headers
373
- => { { :AHEADERNAME => "a header value" } }
374
-
375
- >> str.headers.to_s do |name|
376
- ?> name.to_s.downcase.scan(/..?.?/).join("-").capitalize
377
- ?> end
378
- => "ahe-ade-rna-me: a header value"
379
-
380
- The block to `to_s` will not modify the headers in-place, in keeping with the behaviour of the block-less `to_s`. To change how the symbolic-to-raw header name conversion works, you can do so on the object holding the headers.
381
-
382
- >> str.headers.to_raw = lambda do |name|
383
- ?> name.to_s.downcase.scan(/..?.?/).join("-").capitalize
384
- ?> end
385
- => #<Proc:...>
386
-
387
- Similarly, you can modify `to_key`. You can also change `to_raw` and `to_key` for each individual header. If no block is given for a specific header, it defaults to the block for the containing `headers` object. If nothing is given _there_, then it goes to the default.
388
-
389
- If `to_raw(produced_key) != original_key` for all the headers in the object, then the headers are in a mismatched state. Equally, a single header is in a mismatched state if the condition fails for that header.
390
-
391
- This can be checked with `reversible?`.
392
-
393
- >> string = "A-Header-Name: a header value\n\nContent."
394
- => "A-Header-Name: a header value\n\nContent."
395
-
396
- >> str = Redhead::String.new(string) do |name|
397
- ?> name.gsub(/-/, "").upcase.to_sym
398
- ?> end
399
- => +"Content."
400
-
401
- # At this point, `to_key` is not reversible via `to_raw`
402
-
403
- >> str.headers.reversible?
404
- => false
405
-
406
- >> str = Redhead::String.new(string) do |name|
407
- ?> name.split(/-/).map { |e| e.upcase }.join("zzz").to_sym
408
- ?> end
409
- => +"Content."
410
-
411
- >> str.headers
412
- => { { :AzzzHEADERzzzNAME => "a header value" } }
413
-
414
- >> str.headers.reversible?
415
- => false
416
-
417
- >> str.headers.to_raw = lambda do |name|
418
- ?> name.to_s.split(/zzz/).map { |e| e.capitalize }.join("-")
419
- ?> end
420
- => #<Proc:...>
421
-
422
- # We can go back and forth without issue on this string
423
-
424
- >> str.headers.reversible?
425
- => true
426
-
427
- >> str.headers
428
- => { { :AzzzHEADERzzzzNAME => "a header value" } }
429
-
430
- >> str.headers.to_s
431
- => "A-Header-Name: a header value"
432
-
433
- Reversibility is checked by calling `reversible?` on all the headers in `str.headers`, since each header can have its own `to_key` and `to_raw` blocks. `reversible?` returning false will not raise an error or stop execution.
434
-
435
- When creating new headers, `to_raw`, is used, meaning your custom block will be picked up and used to create the raw header as though it had been created from a string.
436
-
437
- >> str.headers.to_raw = proc { "Genuinely" }
438
-
439
- >> str.headers[:foo_bar] = "temp"
440
- => "temp"
441
-
442
- >> temp_header = str.headers[:foo_bar]
443
- => { :foo_bar => "temp" }
444
-
445
- >> temp_header.to_s
446
- => "Genuinely: temp"
447
-
448
- Changing `to_raw` after-the-fact will not change the raw header name stored for the object. To force `to_raw` to be used instead of the stored value, use `to_s!`, which _always_ uses `to_raw`.
449
-
450
- >> temp_header.to_raw = lambda { "nothing meaningful" }
451
- => #<Proc:...>
452
-
453
- >> temp_header.to_s
454
- => "Temp-Orary-Header: temp"
455
-
456
- >> temp_header.to_s!
457
- => "nothing meaningful: temp"
458
-
459
343
  # TODO
460
344
 
461
345
  Headers on different lines with the same raw name. Important for HTTP.
@@ -1,6 +1,3 @@
1
- # Copyright (c) 2010 Adam Prescott
2
- # Licensed under the MIT license. See LICENSE.
3
-
4
1
  module Redhead
5
2
 
6
3
  # The character used to separate raw header names from their values.
@@ -20,16 +17,6 @@ module Redhead
20
17
 
21
18
  # The default code to convert a given raw header name to a key.
22
19
  TO_KEY = lambda { |raw| raw.split(/[^a-z_]+/i).join("_").downcase.to_sym }
23
-
24
- # Method wrapping TO_RAW, to allow overriding for customisation.
25
- def self.to_raw
26
- TO_RAW
27
- end
28
-
29
- # Method wrapping TO_KEY, to allow overriding for customisation.
30
- def self.to_key
31
- TO_KEY
32
- end
33
20
  end
34
21
 
35
22
  require "redhead/header"
@@ -1,7 +1,6 @@
1
1
  module Redhead
2
2
  class Header
3
3
  attr_accessor :key, :raw, :value
4
- attr_writer :to_key, :to_raw
5
4
 
6
5
  def initialize(key, raw, value)
7
6
  @key = key
@@ -11,17 +10,11 @@ module Redhead
11
10
 
12
11
  # Parses a string representing a header. Uses HEADER_NAME_VALUE_SEPARATOR_PATTERN
13
12
  # to determine the name and value parts of the string.
14
- #
15
- # With a given block, the parsed raw header name is passed to the block and the result is
16
- # used as the key name. If no block is given, then the default is used to create the key
17
- # name.
18
- def self.parse(header_string, &block)
13
+ def self.parse(header_string)
19
14
  header_string =~ HEADER_NAME_VALUE_SEPARATOR_PATTERN
20
15
  raw = $`
21
16
  value = $'
22
-
23
- to_key_block = block || Redhead.to_key
24
- key = to_key_block[raw]
17
+ key = TO_KEY[raw]
25
18
 
26
19
  header = new(key, raw, value)
27
20
 
@@ -38,23 +31,13 @@ module Redhead
38
31
  "#{r}#{Redhead::HEADER_NAME_VALUE_SEPARATOR_CHARACTER} #{value}"
39
32
  end
40
33
 
41
- # Does the same thing as #to_s, but instead of calling #raw in the last case, it calls #raw!.
34
+ # Does the same thing as #to_s, but instead of calling #raw in the last case, it computes the
35
+ # raw header name dynamically from the key.
42
36
  def to_s!(raw_name = nil)
43
- r = raw_name || (block_given? ? yield(key) : raw!)
37
+ r = raw_name || (block_given? ? yield(key) : TO_RAW[key])
44
38
  "#{r}#{Redhead::HEADER_NAME_VALUE_SEPARATOR_CHARACTER} #{value}"
45
39
  end
46
-
47
- # Calls #to_key with #raw as the argument.
48
- def key!
49
- to_key[raw]
50
- end
51
-
52
- # Calls #to_raw with #key as the argument. By-passes the stored raw header name and reproduces
53
- # it with #to_raw dynamically.
54
- def raw!
55
- to_raw[key]
56
- end
57
-
40
+
58
41
  def inspect
59
42
  "{ #{key.inspect} => #{value.inspect} }"
60
43
  end
@@ -64,20 +47,5 @@ module Redhead
64
47
  raw == other_header.raw &&
65
48
  value == other_header.value
66
49
  end
67
-
68
- # Returns the Proc object used to convert keys to raw header names. Defaults to Redhead.to_raw.
69
- def to_raw
70
- @to_raw || Redhead.to_raw
71
- end
72
-
73
- # Returns the Proc object used to convert keys to raw header names. Defaults to Redhead.to_raw.
74
- def to_key
75
- @to_key || Redhead.to_key
76
- end
77
-
78
- # Returns true if to_raw[to_key[raw]] == raw, otherwise, false.
79
- def reversible?
80
- to_raw[to_key[raw]] == raw
81
- end
82
50
  end
83
51
  end
@@ -9,10 +9,10 @@ module Redhead
9
9
 
10
10
  # Parses lines of header strings with Header.parse. Returns a new HeaderSet object
11
11
  # for the parsed headers.
12
- def self.parse(header_string, &block)
12
+ def self.parse(header_string)
13
13
  headers = []
14
14
  header_string.split("\n").each do |str|
15
- headers << Redhead::Header.parse(str, &block)
15
+ headers << Redhead::Header.parse(str)
16
16
  end
17
17
 
18
18
  new(headers)
@@ -34,15 +34,13 @@ module Redhead
34
34
  end
35
35
 
36
36
  # If there is a header in the set with a key matching _key_, then set its value to _value_.
37
- # If there is no header matching _key_, create a new header with the given key and value,
38
- # with a raw header equal to to_raw[key]. Sets the new header's to_raw to self#to_raw.
37
+ # If there is no header matching _key_, create a new header with the given key and value.
39
38
  def []=(key, value)
40
39
  h = self[key]
41
40
  if h
42
41
  h.value = value
43
42
  else
44
- new_header = Redhead::Header.new(key, to_raw[key], value)
45
- new_header.to_raw = to_raw
43
+ new_header = Redhead::Header.new(key, TO_RAW[key], value)
46
44
  self << new_header
47
45
  end
48
46
  end
@@ -54,8 +52,7 @@ module Redhead
54
52
 
55
53
  # Similar to #[]= but allows manually setting the value of Header#raw to _raw_.
56
54
  def add(key, value, raw = nil)
57
- new_header = Redhead::Header.new(key, raw || to_raw[key], value)
58
- new_header.to_raw = to_raw
55
+ new_header = Redhead::Header.new(key, raw || TO_RAW[key], value)
59
56
  self << new_header
60
57
  new_header
61
58
  end
@@ -83,40 +80,13 @@ module Redhead
83
80
  end.join("\n")
84
81
  end
85
82
 
86
- # If a block is given, passes the block to Header#to_s! otherwise passes #to_raw instead. Joins
83
+ # If a block is given, passes the block to Header#to_s! Joins
87
84
  # the result with newlines.
88
85
  def to_s!(&block)
89
- blk = block || to_raw
86
+ blk = block || TO_RAW
90
87
  @headers.map { |header| header.to_s!(&blk) }.join("\n")
91
88
  end
92
-
93
- # Returns true if Header#reversible? is true for each header in the set, otherwise false.
94
- def reversible?
95
- all? { |header| header.reversible? }
96
- end
97
-
98
- # Returns the Proc to be used to convert key names to raw header names. Defaults to Redhead.to_raw.
99
- def to_raw
100
- @to_raw || Redhead.to_raw
101
- end
102
-
103
- # Sets HeaderSet#to_raw to _new_to_raw_. Sets Header#to_raw for each header in the set to _new_to_raw_.
104
- def to_raw=(new_to_raw)
105
- @to_raw = new_to_raw
106
- each { |header| header.to_raw = new_to_raw }
107
- end
108
-
109
- # Returns the Proc to be used to convert raw header names to key names. Defaults to Redhead.to_key.
110
- def to_key
111
- @to_key || Redhead.to_key
112
- end
113
-
114
- # Sets HeaderSet#to_raw to _new_to_raw_. Sets Header#to_raw for each header in the set to _new_to_raw_.
115
- def to_key=(new_to_key)
116
- @to_key = new_to_key
117
- each { |header| header.to_key = new_to_key }
118
- end
119
-
89
+
120
90
  def inspect
121
91
  "{ #{@headers.map { |header| header.inspect }.join(", ")} }"
122
92
  end
@@ -9,15 +9,13 @@ module Redhead
9
9
  end
10
10
 
11
11
  # Takes _string_, splits the headers from the content using HEADERS_SEPARATOR_PATTERN, then
12
- # creates the headers by calling HeaderSet.parse, passing in _block_. Sets #to_key to _block_,
13
- # and calls super with the main body content as an argument.
14
- def initialize(string, &block)
12
+ # creates the headers by calling HeaderSet.parse.
13
+ def initialize(string)
15
14
  string =~ HEADERS_SEPARATOR_PATTERN
16
15
  @string = $'
17
16
  super(@string)
18
17
 
19
- @headers = Redhead::HeaderSet.parse($`, &block)
20
- @headers.to_key = block
18
+ @headers = Redhead::HeaderSet.parse($`)
21
19
  end
22
20
 
23
21
  # Returns the main body content wrapped in the Redhead String object.
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "redhead"
3
- s.version = "0.0.4"
3
+ s.version = "0.0.5"
4
4
  s.authors = ["Adam Prescott"]
5
5
  s.email = ["adam@aprescott.com"]
6
6
  s.homepage = "https://github.com/aprescott/redhead"
@@ -8,11 +8,8 @@ describe Redhead::HeaderSet do
8
8
  @header = @headers.first
9
9
  @first_header_key = :a
10
10
  @header_set = Redhead::HeaderSet.new(@headers)
11
- @default_to_raw = Redhead.to_raw
12
- @default_to_key = Redhead.to_key
13
11
 
14
- @reversible_headers = Redhead::HeaderSet.parse("A-Header: one\nA-Header-Two: two")
15
- @irreversible_headers = Redhead::HeaderSet.parse("a_header: one\na_header_two: two")
12
+ @simple_headers = Redhead::HeaderSet.parse("A-Header: one\nA-Header-Two: two")
16
13
  end
17
14
 
18
15
  context "as a class" do
@@ -24,18 +21,6 @@ describe Redhead::HeaderSet do
24
21
  Redhead::HeaderSet.parse(@full_header_set_string).should == parsed_header_set
25
22
  end
26
23
  end
27
-
28
- context "with a block" do
29
- it "uses the given block as to_key" do
30
- Redhead::HeaderSet.parse(@full_header_set_string) { :foo }.each { |h| h.key.should == :foo }
31
- end
32
-
33
- it "does not set to_key on each parsed header object in the set" do
34
- # note: Proc#== bug!
35
- to_key = proc { :foo }
36
- Redhead::HeaderSet.parse(@full_header_set_string, &to_key).each { |header| header.to_key.should_not == to_key }
37
- end
38
- end
39
24
  end
40
25
 
41
26
  it "is Enumerable and responds to #each" do
@@ -74,18 +59,6 @@ describe Redhead::HeaderSet do
74
59
  @header_set[:brand_new_key].should_not be_nil
75
60
  @header_set[:brand_new_key].value.should == new_value
76
61
  end
77
-
78
- it "calls #to_raw to create the value of #raw" do
79
- @header_set.to_raw = proc { "WHOA!" }
80
- @header_set[:brand_new_key] = "some value"
81
- @header_set[:brand_new_key].raw.should == "WHOA!"
82
- end
83
-
84
- it "sets new_header#to_raw to header_set#to_raw" do
85
- @header_set.to_raw = proc { "Whoa!" }
86
- @header_set[:brand_new_key] = "some value"
87
- @header_set[:brand_new_key].to_raw.should == @header_set.to_raw
88
- end
89
62
  end
90
63
  end
91
64
 
@@ -109,21 +82,6 @@ describe Redhead::HeaderSet do
109
82
  it "returns a Redhead::Header object" do
110
83
  @header_set.add(:brand_new_key, "some value").class.should == Redhead::Header
111
84
  end
112
-
113
- it "calls #to_raw to create the value of #raw" do
114
- @header_set.add(:brand_new_key, "some value")
115
- @header_set[:brand_new_key].raw.should == "Brand-New-Key"
116
-
117
- @header_set.to_raw = proc { "Nothing really" }
118
- @header_set.add(:something_or_other, "something or other")
119
- @header_set[:something_or_other].raw.should == "Nothing really"
120
- end
121
-
122
- it "sets new_header#to_raw to header_set#to_raw" do
123
- @header_set.to_raw = proc { "Whoa!" }
124
- @header_set.add(:brand_new_key, "some value")
125
- @header_set[:brand_new_key].to_raw.should == @header_set.to_raw
126
- end
127
85
  end
128
86
 
129
87
  it "takes an optional third argument which sets the value of the raw header" do
@@ -131,7 +89,6 @@ describe Redhead::HeaderSet do
131
89
  @header_set[:foo].value.should == "bar"
132
90
  @header_set[:foo].key.should == :foo
133
91
  @header_set[:foo].raw.should == "BAZ!"
134
- @header_set[:foo].raw!.should == "Foo"
135
92
  end
136
93
  end
137
94
 
@@ -199,11 +156,6 @@ describe Redhead::HeaderSet do
199
156
  @header_set.to_s(&new_to_raw).should == modified_full_header_set_string(&new_to_raw)
200
157
  end
201
158
 
202
- it "does not leave the given block as #to_raw" do
203
- @header_set.to_s { "test" + "test" }
204
- @header_set.to_raw.should_not == proc { "test" + "test" }
205
- end
206
-
207
159
  it "follows the hash argument first, falling back to the given block" do
208
160
  @header_set.to_s(:a => "something raw") { "NOT RAW AT ALL" }.split("\n").first.should == "something raw: value_a"
209
161
  end
@@ -212,9 +164,8 @@ describe Redhead::HeaderSet do
212
164
 
213
165
  describe "#to_s!" do
214
166
  context "without a block" do
215
- it "calls to_s! on each header in the set, passing #to_raw as a block joining the results with newlines" do
216
- @header_set.to_raw = proc { "Total foo bar" }
217
- @header_set.to_s!.should == @headers.map { |header| "Total foo bar: #{header.value}" }.join("\n")
167
+ it "calls to_s! on each header in the set, joining the results with newlines" do
168
+ @simple_headers.to_s!.should == @simple_headers.map { |header| header.to_s! }.join("\n")
218
169
  end
219
170
  end
220
171
 
@@ -222,20 +173,6 @@ describe Redhead::HeaderSet do
222
173
  it "calls to_s! on each header in the set, passing the given block, joining the results with newlines" do
223
174
  @header_set.to_s! { "Total foo bar" }.should == @headers.map { |header| "Total foo bar: #{header.value}" }.join("\n")
224
175
  end
225
-
226
- it "does not leave the given block as #to_raw on existing headers" do
227
- temp_to_raw = proc { "Total foo bar" }
228
- @header_set.to_s!(&temp_to_raw)
229
- @header_set.all? { |header| header.raw!.should_not == "Total foo bar" }
230
- end
231
-
232
- it "does not leave the given block as #to_raw on the header set" do
233
- temp_to_raw = proc { "Total foo bar" }
234
- @header_set.to_s!(&temp_to_raw)
235
- @header_set.to_raw.should_not == temp_to_raw
236
- @header_set[:temp_foo_foo] = "what"
237
- @header_set[:temp_foo_foo].raw!.should_not == "Total foo bar"
238
- end
239
176
  end
240
177
  end
241
178
 
@@ -260,85 +197,4 @@ describe Redhead::HeaderSet do
260
197
  one.any? { |a| two.find { |b| a == b } }.should be_true
261
198
  end
262
199
  end
263
-
264
- describe "#reversible?" do
265
- it "returns true if each header in the set is reversible, otherwise false" do
266
- @reversible_headers.reversible?.should == @reversible_headers.all? { |header| header.reversible? }
267
- @irreversible_headers.reversible?.should == @irreversible_headers.all? { |header| header.reversible? }
268
-
269
- @reversible_headers.reversible?.should be_true
270
- @irreversible_headers.reversible?.should be_false
271
-
272
- @reversible_headers.to_raw = proc { "" }
273
- @reversible_headers.reversible?.should_not be_true # contained headers get caught up in the change
274
-
275
- # example from the readme:
276
-
277
- string = "A-Header-Name: a header value\n\nContent."
278
-
279
- str = Redhead::String.new(string) do |name|
280
- name.gsub(/-/, "").upcase.to_sym
281
- end
282
-
283
- str.headers.reversible?.should be_false
284
-
285
- str = Redhead::String.new(string) do |name|
286
- name.split(/-/).map { |e| e.upcase }.join("zzz").to_sym
287
- end
288
-
289
- str.headers.reversible?.should be_false
290
-
291
- str.headers.to_raw = lambda do |name|
292
- name.to_s.split(/zzz/).map { |e| e.capitalize }.join("-")
293
- end
294
-
295
- str.headers.reversible?.should be_true
296
- end
297
- end
298
-
299
- describe "#to_raw" do
300
- it "defaults to Redhead.to_raw" do
301
- # note: Proc#== bug!
302
- @header_set.to_raw.should == @default_to_raw
303
- end
304
- end
305
-
306
- describe "#to_raw=" do
307
- it "sets a new block to be used as to_raw" do
308
- # note: Proc#== bug!
309
- new_to_raw = proc { "" + "" }
310
- @header_set.to_raw = new_to_raw
311
- @header_set.to_raw.should_not == @default_to_raw
312
- @header_set.to_raw.should == new_to_raw
313
- end
314
-
315
- it "sets to_raw, for each header in the set" do
316
- new_to_raw = proc { "" + "" }
317
- @header_set.to_raw = new_to_raw
318
- @header_set.each { |header| header.to_raw.should == new_to_raw }
319
- end
320
- end
321
-
322
- describe "#to_key" do
323
- it "defaults to Redhead.to_key" do
324
- # note: Proc#== bug!
325
- @header_set.to_key.should == @default_to_key
326
- end
327
- end
328
-
329
- describe "#to_key=" do
330
- it "sets a new block to be used as to_key" do
331
- # note: Proc#== bug!
332
- new_to_key = proc { "" + "" }
333
- @header_set.to_key = new_to_key
334
- @header_set.to_key.should_not == @default_to_key
335
- @header_set.to_key.should == new_to_key
336
- end
337
-
338
- it "sets to_key, for each header in the set" do
339
- new_to_key = proc { "" + "" }
340
- @header_set.to_key = new_to_key
341
- @header_set.each { |header| header.to_key.should == new_to_key }
342
- end
343
- end
344
200
  end
@@ -14,9 +14,6 @@ describe Redhead::Header do
14
14
 
15
15
  @different_header_raw_name = "An original HEADER name"
16
16
  @header_different_name = Redhead::Header.new(:a_header_name, "An original HEADER name", "something here")
17
-
18
- @default_to_raw = Redhead.to_raw
19
- @default_to_key = Redhead.to_key
20
17
  end
21
18
 
22
19
  context "as a class" do
@@ -50,25 +47,6 @@ describe Redhead::Header do
50
47
  Redhead::Header.parse("#{@header_raw_name}#{before}:#{after}#{@header_value}").key.should == @header_name
51
48
  end
52
49
  end
53
-
54
- context "with a given block" do
55
- it "uses the given block as to_key" do
56
- Redhead::Header.parse(@full_header_string) { :foo }.key.should == :foo
57
- end
58
-
59
- # do not set to_key to the given block so that using parse with a block does not prevent any dynamic
60
- # calls up the chain to work out what to_raw should be for each object. i.e., Header#to_key should default
61
- # to Redhead.to_key, but since each header doesn't know which headerset it's in, HeaderSet needs to pass down
62
- # a block to each Header object. if the Header object set the block as to_key, there'd be problems.
63
- #
64
- # Similarly, Redhead::String.parse(..., &blk) should not set Header#to_key because then there'd never be any
65
- # calls up the hierarchy, since an individual Header's @to_key would exist already.
66
- it "sets to_key to the given block" do
67
- # note: Proc#== bug!
68
- to_key = proc { :foo }
69
- Redhead::Header.parse(@full_header_string, &to_key).to_key.should_not == to_key
70
- end
71
- end
72
50
  end
73
51
  end
74
52
 
@@ -78,51 +56,12 @@ describe Redhead::Header do
78
56
  end
79
57
  end
80
58
 
81
- describe "#key!" do
82
- it "uses #to_key to convert #raw to a header key" do
83
- @header.to_key = proc { "test" }
84
- @header.key!.should == "test"
85
-
86
- @header.to_key = proc { |x| x.upcase.reverse.gsub("-", "_").to_sym }
87
- @header.key!.should == @header_raw_name.upcase.reverse.gsub("-", "_").to_sym
88
- end
89
-
90
- it "does not change #key after being called" do
91
- @header.to_key = proc { "test" }
92
- @header.key.should == @header_name
93
- @header.key!.should == "test"
94
- @header.key.should_not == "test"
95
- @header.key.should == @header_name
96
- end
97
- end
98
-
99
59
  describe "#raw" do
100
60
  it "returns the raw header name stored at creation time" do
101
61
  @header.raw.should == @header_raw_name
102
- @header.to_raw = proc { "" }
103
- @header.raw!.should == ""
104
- @header.raw.should == @header_raw_name
105
62
  end
106
63
  end
107
-
108
- describe "#raw!" do
109
- it "uses #to_raw to convert #key to a raw header, ignoring the value of #raw" do
110
- @header.to_raw = proc { "test" }
111
- @header.raw!.should == "test"
112
-
113
- @header.to_raw = proc { |x| x.to_s.upcase.reverse }
114
- @header.raw!.should == @header_name.to_s.upcase.reverse
115
- end
116
64
 
117
- it "does not change #raw after being called" do
118
- @header.to_raw = proc { "test" }
119
- @header.raw.should == @header_raw_name
120
- @header.raw!.should == "test"
121
- @header.raw.should_not == "test"
122
- @header.raw.should == @header_raw_name
123
- end
124
- end
125
-
126
65
  describe "#value" do
127
66
  it "returns the header value" do
128
67
  @header.value.should == @header_value
@@ -145,12 +84,6 @@ describe Redhead::Header do
145
84
  it "uses the given block to convert #key to a raw header, and returns the raw string" do
146
85
  @header.to_s { "test" }.should == "test#{@separator} #{@header_value}"
147
86
  end
148
-
149
- it "does not set a new value for #to_raw" do
150
- @header.to_s { "test" }
151
- @header.to_s.should_not == "test#{@separator} #{@header_value}"
152
- @header.to_s.should == @full_header_string
153
- end
154
87
  end
155
88
 
156
89
  it "takes an optional argument which specifies the raw header to use, without side-effects" do
@@ -182,77 +115,17 @@ describe Redhead::Header do
182
115
  end
183
116
  end
184
117
 
185
- describe "#reversible?" do
186
- it "returns true for the defaults" do
187
- @header.reversible?.should be_true
188
- end
189
-
190
- it "returns true if self.to_raw[self.key!] == self.raw, i.e., if we can't recover the current raw header name via to_key(to_raw(current_raw_header_name))" do
191
- @header.to_raw[@header.key!].should == @header_raw_name
192
- @header.reversible?.should be_true # by default
193
-
194
- @header.to_raw = proc { |x| "1#{x}" }
195
- @header.to_key = proc { |x| "2#{x}" }
196
- @header.to_raw[@header.key!].should_not == @header_raw_name
197
- @header.reversible?.should be_false # :key does not equal 2Key1Key
198
-
199
- @header.to_raw = proc { |x| x.to_s.reverse }
200
- @header.to_key = proc { |x| x.reverse.to_sym }
201
- @header.to_raw[@header.key!].should == @header_raw_name
202
- @header.reversible?.should be_true
203
- end
204
- end
205
-
206
- describe "#to_raw" do
207
- it "returns Redhead.to_raw by default" do
208
- # note: Proc#== bug!
209
- @header.to_raw.should == @default_to_raw
210
- end
211
- end
212
-
213
- describe "#to_key" do
214
- it "returns Redhead.to_key by default" do
215
- # note: Proc#== bug!
216
- @header.to_key.should == @default_to_key
217
- end
218
- end
219
-
220
- describe "#to_raw=(blk)" do
221
- it "sets to_raw to blk" do
222
- new_block = proc { }
223
- @header.to_raw.should_not == new_block
224
- @header.to_raw = new_block
225
- @header.to_raw.should == new_block
226
- end
227
- end
228
-
229
- describe "#to_key=(blk)" do
230
- it "sets to_key to blk" do
231
- new_block = proc { "" + "" }
232
- @header.to_key.should_not == new_block
233
- @header.to_key = new_block
234
- @header.to_key.should == new_block
235
- end
236
- end
237
-
238
118
  describe "#to_s!" do
239
- # TODO: this test doesn't do what it should. know what @header.raw! is going to be and use it in this test
240
- # instead of relying on @header.raw! in this test itself. better go through all tests and double-check this.
241
- it "returns <raw!><separator> <value>" do
242
- @header.to_s!.should == "#{@header.raw!}#{@separator} #{@header_value}"
119
+ it "returns <computed_raw_header><separator> <value>" do
120
+ @header.to_s!.should == "#{@header_raw_name}#{@separator} #{@header_value}"
121
+ @header_different_name.to_s!.should == "#{@header_raw_name}#{@separator} something here"
243
122
  end
244
123
 
245
124
  context "with a block argument" do
246
- it "uses the given block as though it were #to_raw" do
125
+ it "uses the given block to compute the raw header name" do
247
126
  @header.to_s! { "testing" }.should == "testing: #{@header_value}"
248
127
  @header.to_s! { |x| x.to_s.upcase.reverse.gsub("_", "-") }.should == "#{@header_raw_name.to_s.upcase.reverse}: #{@header_value}"
249
128
  end
250
-
251
- it "does not leave to_raw as the given block" do
252
- @header.to_s! { "testing" }
253
- @header.to_raw.should_not == proc { "testing" }
254
- @header.to_raw[:random].should_not == "testing"
255
- end
256
129
  end
257
130
 
258
131
  it "takes an optional argument specifying the raw header name to use, without side-effects" do
@@ -14,26 +14,6 @@ describe Redhead::String do
14
14
  Redhead::String[@string].should == Redhead::String.new(@string)
15
15
  end
16
16
  end
17
-
18
- describe "self.new" do
19
- context "with a given block:" do
20
- it "uses the given block as to_key" do
21
- Redhead::String.new(@string) { :foo }.headers.first.key.should == :foo
22
- end
23
-
24
- it "sets the given block as the HeaderSet's to_key" do
25
- # note: Proc#== bug!
26
- blk = proc { :foo }
27
- Redhead::String.new(@string, &blk).headers.to_key.should == blk
28
- end
29
-
30
- it "sets each individual header's to_key to the given block" do
31
- # note: Proc#== bug!
32
- blk = proc { :foo }
33
- Redhead::String.new(@string, &blk).headers.each { |header| header.to_key.should == blk }
34
- end
35
- end
36
- end
37
17
  end
38
18
 
39
19
  context "before any modifications:" do
metadata CHANGED
@@ -1,57 +1,63 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: redhead
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
4
5
  prerelease:
5
- version: 0.0.4
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Adam Prescott
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-05-19 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2012-10-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: rake
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
24
22
  type: :development
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: rspec
28
23
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
30
25
  none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: "0"
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
35
38
  type: :development
36
- version_requirements: *id002
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
37
46
  description: String header metadata.
38
- email:
47
+ email:
39
48
  - adam@aprescott.com
40
49
  executables: []
41
-
42
50
  extensions: []
43
-
44
51
  extra_rdoc_files: []
45
-
46
- files:
47
- - lib/redhead/header_set.rb
52
+ files:
53
+ - lib/redhead.rb
48
54
  - lib/redhead/redhead_string.rb
49
55
  - lib/redhead/header.rb
50
- - lib/redhead.rb
51
- - test/header_set_spec.rb
52
- - test/redhead_spec.rb
56
+ - lib/redhead/header_set.rb
53
57
  - test/test_helper.rb
58
+ - test/redhead_spec.rb
54
59
  - test/redhead_string_spec.rb
60
+ - test/header_set_spec.rb
55
61
  - test/header_spec.rb
56
62
  - redhead.gemspec
57
63
  - .gemtest
@@ -61,34 +67,31 @@ files:
61
67
  - README.md
62
68
  homepage: https://github.com/aprescott/redhead
63
69
  licenses: []
64
-
65
70
  post_install_message:
66
71
  rdoc_options: []
67
-
68
- require_paths:
72
+ require_paths:
69
73
  - lib
70
- required_ruby_version: !ruby/object:Gem::Requirement
74
+ required_ruby_version: !ruby/object:Gem::Requirement
71
75
  none: false
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: "0"
76
- required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
81
  none: false
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: "0"
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
82
86
  requirements: []
83
-
84
87
  rubyforge_project:
85
- rubygems_version: 1.8.2
88
+ rubygems_version: 1.8.24
86
89
  signing_key:
87
90
  specification_version: 3
88
91
  summary: String header metadata.
89
- test_files:
90
- - test/header_set_spec.rb
91
- - test/redhead_spec.rb
92
+ test_files:
92
93
  - test/test_helper.rb
94
+ - test/redhead_spec.rb
93
95
  - test/redhead_string_spec.rb
96
+ - test/header_set_spec.rb
94
97
  - test/header_spec.rb