cookiemonster 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .rvmrc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in cookiemonster.gemspec
4
+ gemspec
@@ -0,0 +1,5 @@
1
+ # Cookie Monster
2
+
3
+ A library for working with Set-Cookie data in Ruby
4
+
5
+ # WARNING - Very alpha! (2012-01-16)
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << 'spec'
6
+ t.pattern = "spec/**/*_spec.rb"
7
+ end
8
+
9
+ task :default => :test
10
+
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "cookiemonster/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "cookiemonster"
7
+ s.version = CookieMonster::VERSION
8
+ s.authors = ["Matt Southerden"]
9
+ s.email = ["matt@localbubble.com"]
10
+ s.homepage = "http://github.com/mattsoutherden/cookiemonster"
11
+ s.summary = %q{Let CookieMonster munch your cookies}
12
+ s.description = %q{A library for working with Set-Cookie data in Ruby}
13
+
14
+ s.rubyforge_project = "cookiemonster"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_development_dependency "minitest"
23
+
24
+ # s.add_runtime_dependency "rest-client"
25
+ end
@@ -0,0 +1,70 @@
1
+ require "cookiemonster/version"
2
+ require 'time'
3
+
4
+ module CookieMonster
5
+
6
+ def self.parse(set_cookie_string)
7
+ Cookie.new self.parse_hash(set_cookie_string)
8
+ end
9
+
10
+ def self.parse_hash(set_cookie_string)
11
+ hash = set_cookie_string.split(/; ?/).inject({}) do |result, field|
12
+ field_name, field_value = field.split('=', 2)
13
+ result[field_name] = field_value
14
+ result
15
+ end
16
+
17
+ name, value = hash.shift
18
+
19
+ hash[:name] = name
20
+ hash[:value] = value
21
+
22
+ hash = hash.inject({}) do |options, (key, value)|
23
+ options[(key.downcase.to_sym rescue key) || key] = value
24
+ options
25
+ end
26
+
27
+ hash
28
+ end
29
+
30
+ class Cookie
31
+
32
+ attr_reader :name
33
+ attr_reader :value
34
+ attr_reader :path
35
+ attr_reader :domain
36
+ attr_reader :expires
37
+ attr_reader :http_only
38
+ attr_reader :secure
39
+ attr_reader :session
40
+
41
+ alias :http_only? :http_only
42
+ alias :secure? :secure
43
+ alias :session? :session
44
+
45
+ def initialize(args)
46
+ @name = args[:name]
47
+ @value = args[:value]
48
+ @path = args[:path]
49
+ @domain = args[:domain]
50
+ @expires = args[:expires] ? parse_expiry(args[:expires]) : nil
51
+ @http_only = args.has_key?(:httponly) ? true : false
52
+ @secure = args.has_key?(:secure) ? true : false
53
+ @session = expires.nil?
54
+ end
55
+
56
+ def expired?
57
+ return false unless expires
58
+ Time.now > expires
59
+ end
60
+
61
+ protected
62
+
63
+ def parse_expiry(str)
64
+ return Time.parse(str)
65
+ rescue
66
+ nil
67
+ end
68
+ end
69
+
70
+ end
@@ -0,0 +1,3 @@
1
+ module CookieMonster
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,88 @@
1
+ require "spec_helper"
2
+
3
+ describe 'Parsing Set-Cookie' do
4
+
5
+ describe 'basic parsing' do
6
+
7
+ def parse(set_cookie)
8
+ CookieMonster.parse(set_cookie)
9
+ end
10
+
11
+ it "extracts cookie name" do
12
+ cookie = parse('foo=bar')
13
+ cookie.name.must_equal 'foo'
14
+
15
+ cookie = parse('baz=quux')
16
+ cookie.name.must_equal 'baz'
17
+ end
18
+
19
+ it "extracts cookie value" do
20
+ cookie = parse('foo=bar')
21
+ cookie.value.must_equal 'bar'
22
+
23
+ cookie = parse('baz=quux')
24
+ cookie.value.must_equal 'quux'
25
+ end
26
+
27
+ it "extracts path" do
28
+ cookie = parse('foo=bar; path=/')
29
+ cookie.path.must_equal '/'
30
+
31
+ cookie = parse('foo=bar; Path=/foo')
32
+ cookie.path.must_equal '/foo'
33
+ end
34
+
35
+ it "extracts expiry time" do
36
+ cookie = parse('foo=bar; expires=Thu, 19-Dec-2013 17:24:17 GMT')
37
+ cookie.expires.must_equal Time.utc(2013, 12, 19, 17, 24, 17)
38
+ end
39
+
40
+ it "should be expired when expires in past" do
41
+ yesterday = (Date.today - 1).httpdate
42
+ cookie = parse("foo=bar; expires=#{yesterday}")
43
+ assert cookie.expired?
44
+ end
45
+
46
+ it "should not be expired when expires in future" do
47
+ tomorrow = (Date.today + 1).httpdate
48
+ cookie = parse("foo=bar; expires=#{tomorrow}")
49
+ assert ! cookie.expired?
50
+ end
51
+
52
+ it "should not be expired when expires not set" do
53
+ cookie = parse('foo=bar')
54
+ assert ! cookie.expired?
55
+ end
56
+
57
+ it "sets httponly" do
58
+ cookie = parse('foo=bar; httponly')
59
+ assert cookie.http_only?
60
+ end
61
+
62
+ it "sets secure" do
63
+ cookie = parse('foo=bar; secure')
64
+ assert cookie.secure?
65
+ end
66
+
67
+ it "sets domain" do
68
+ cookie = parse('foo=bar; domain=foo.com')
69
+ cookie.domain.must_equal 'foo.com'
70
+ end
71
+
72
+ it "creates a session cookie when no expires is set" do
73
+ cookie = parse('foo=bar')
74
+ assert cookie.session?
75
+ end
76
+
77
+ it "creates a session cookie when expires parsing fails" do
78
+ cookie = parse('foo=bar; expires=Not a date format GMT')
79
+ assert cookie.session?
80
+ end
81
+
82
+ end
83
+
84
+ describe 'multiple cookies' do
85
+
86
+ end
87
+
88
+ end
@@ -0,0 +1,4 @@
1
+ require "minitest/autorun"
2
+ # require "purdytest"
3
+
4
+ require 'cookiemonster'
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cookiemonster
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matt Southerden
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-16 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: minitest
16
+ requirement: &2152310760 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *2152310760
25
+ description: A library for working with Set-Cookie data in Ruby
26
+ email:
27
+ - matt@localbubble.com
28
+ executables: []
29
+ extensions: []
30
+ extra_rdoc_files: []
31
+ files:
32
+ - .gitignore
33
+ - Gemfile
34
+ - README.md
35
+ - Rakefile
36
+ - cookiemonster.gemspec
37
+ - lib/cookiemonster.rb
38
+ - lib/cookiemonster/version.rb
39
+ - spec/lib/raw_parse_spec.rb
40
+ - spec/spec_helper.rb
41
+ homepage: http://github.com/mattsoutherden/cookiemonster
42
+ licenses: []
43
+ post_install_message:
44
+ rdoc_options: []
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project: cookiemonster
61
+ rubygems_version: 1.8.10
62
+ signing_key:
63
+ specification_version: 3
64
+ summary: Let CookieMonster munch your cookies
65
+ test_files:
66
+ - spec/lib/raw_parse_spec.rb
67
+ - spec/spec_helper.rb