parsed-attributes 0.1.0 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1aae2201346318b078febd33f14aa52f11935c7f
4
- data.tar.gz: 0de771e1ba13bd77f0384210dd42ec67ac808c44
3
+ metadata.gz: f81ae9f69a48cc5c297e88bd575697e490e9c952
4
+ data.tar.gz: 217584c4424daabf5aafcbaa070ef09be3e11f4f
5
5
  SHA512:
6
- metadata.gz: 4e486091e68ed956d73c7b9f3870c3cffffc526eb7e3b1a545341a8e6de8089b3271e530142124c1e0c93cde18d56ce9b9af3f38a39e990b8e499a94c83f9c4d
7
- data.tar.gz: 79a766d510c8f3dbca9c78fc219fc9301413254f0ad2344d4d1c2e92e5b603aeea0021bccd10c865c297dab2cb9e657a1a3d55dbd050a2e2fdbe163729412f18
6
+ metadata.gz: 411b1e5a04b11779e8cef16d3a443bbcccba89506b34449dc78d5fa48cd2920d72d02dc177aa577a9c646c1f0e352337d0fb703bcb46d9e9fab86c2453b2f413
7
+ data.tar.gz: b08606048a4e79f250a1e619ac9493b719e0f3989dc5c62095c7a9e03715557299785af27079d270e6e03880000cae92ed776cc4d64bffe7ce90ee84fde53846
data/lib/parsed/base.rb CHANGED
@@ -15,9 +15,10 @@ module Parsed
15
15
  # - @parsed_yaml
16
16
  def __define_parsed_attributes_raw_methods(name)
17
17
  attr_reader "raw_#{name}"
18
-
18
+
19
19
  define_method "raw_#{name}=" do |raw|
20
20
  self.instance_variable_set("@raw_#{name}", raw)
21
+
21
22
  if self.instance_variable_defined?("@parsed_#{name}")
22
23
  self.remove_instance_variable("@parsed_#{name}")
23
24
  end
@@ -38,10 +39,11 @@ module Parsed
38
39
  # And assumes the instance variables:
39
40
  # - @raw_yaml
40
41
  # - @parsed_yaml
42
+ #
41
43
  # options (acts like Hash):: Modifies the exception handling behavior
42
44
  # raises_once (boolean):: Setting to true will raise on the first error.
43
45
  #
44
- # This is mostly so that if you are catching and
46
+ # This is mostly so that if you are catching and
45
47
  # printing error messages they won't flood the
46
48
  # terminal.
47
49
  #
@@ -53,6 +55,8 @@ module Parsed
53
55
  # the parsed data.
54
56
  def __define_parsed_attributes_parsed_methods(name, options={}, &parse_block)
55
57
  parsed_varname = "@parsed_#{name}"
58
+ raise_once = options.delete :raise_once
59
+ raise_always = options.delete :raise
56
60
 
57
61
  define_method "parsed_#{name}" do
58
62
  if self.instance_variable_defined? parsed_varname
@@ -62,15 +66,13 @@ module Parsed
62
66
  unless parse_block.nil?
63
67
  begin
64
68
  parsed = parse_block.call self.instance_variable_get("@raw_#{name}")
65
- self.instance_variable_set(parsed_varname, parsed)
69
+ self.instance_variable_set(parsed_varname, parsed)
66
70
  rescue StandardError => e
67
- if options[:raise_once] == true
68
- self.instance_variable_set(parsed_varname, nil)
69
- end
70
- raise e if options[:raise] == true || options[:raise_once] == true
71
+ self.instance_variable_set(parsed_varname, nil) if raise_once == true
72
+ raise e if raise_always == true || raise_once == true
71
73
  end
72
74
  end
73
-
75
+
74
76
  return self.instance_variable_get(parsed_varname)
75
77
  end
76
78
  end
@@ -0,0 +1,19 @@
1
+ require_relative '../base'
2
+ require_relative '../../parsers/http/cookie'
3
+ module Parsed
4
+ module HTTP
5
+ module Cookie
6
+ include Parsed::Base
7
+
8
+ ##
9
+ # Defines an attribute pair to handle HTTP cookie data
10
+ # ---
11
+ # Accepts default options, see Parsed::Base
12
+ def http_cookie_attribute(name, options = {})
13
+ __define_parsed_attributes_all_methods name, options do |raw_value|
14
+ ::Cookie.parse raw_value
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
data/lib/parsed/json.rb CHANGED
@@ -2,16 +2,16 @@ require_relative 'base'
2
2
  require 'json'
3
3
 
4
4
  module Parsed
5
- module Json
5
+ module JSON
6
6
  include Parsed::Base
7
7
 
8
8
  ##
9
9
  # Defines an attribute pair to handle JSON encoded date
10
10
  # ---
11
- # Accepts default options, see Parsed::Base
12
- def json_attribute(name, options = {})
11
+ # Accepts default options, see Parsed::Base
12
+ def json_attribute(name, options = {})
13
13
  __define_parsed_attributes_all_methods name, options do |raw_value|
14
- JSON.parse raw_value
14
+ ::JSON.parse raw_value
15
15
  end
16
16
  end
17
17
  end
@@ -0,0 +1,151 @@
1
+ class Cookie
2
+ class ParserError < StandardError
3
+ end
4
+
5
+ attr_accessor :name, :value, :expires, :max_age, :path, :domain, :secure, :http_only
6
+ def initialize(data = {})
7
+ @name = data[:name] if data.key? :name
8
+ @value = data[:value] if data.key? :value
9
+ @expires = data[:expires] if data.key? :expires
10
+ @max_age = data[:max_age] if data.key? :max_age
11
+ @path = data[:path] if data.key? :path
12
+ @domain = data[:domain] if data.key? :domain
13
+ @secure = data[:secure] if data.key? :secure
14
+ @http_only = data[:http_only] if data.key? :http_only
15
+ end
16
+
17
+ def age_left
18
+ return @max_age if @max_age.is_a? Fixnum
19
+ return (@max_age - Time.now).to_i
20
+ end
21
+
22
+ def to_s
23
+ cookie = ["#{@name}=#{@value}"]
24
+ cookie << "Expires=#{@expires}" if defined? @expires
25
+ cookie << "Max-Age=#{@max_age == Time.at(0) ? 0 : self.age_left }" if defined? @max_age
26
+ cookie << "Domain=#{@domain}" if defined? @domain
27
+ cookie << "Path=#{@path}" if defined? @path
28
+ cookie << "Secure" if defined? @secure
29
+ cookie << "HttpOnly" if defined? @http_only
30
+ return cookie.join('; ')
31
+ end
32
+
33
+ def to_h
34
+ h = { name: @name, value: @value }
35
+ h[:expires] = @expires if defined? @expires
36
+ h[:max_age] = @max_age if defined? @max_age
37
+ h[:domain] = @domain if defined? @domain
38
+ h[:path] = @path if defined? @path
39
+ h[:secure] = @secure if defined? @secure
40
+ h[:http_only] = @http_only if defined? @http_only
41
+ return h
42
+ end
43
+
44
+ def self.parse(raw_value, options = {})
45
+ self.new Parser.new(options).parse!(raw_value).to_h
46
+ end
47
+
48
+ class Parser
49
+ attr_reader :name, :value, :expires, :max_age, :domain, :path, :secure, :http_only
50
+
51
+ def self.empty?(val)
52
+ return true if val.nil?
53
+ return true if val.respond_to?(:size) && val.size == 0
54
+ return false
55
+ end
56
+
57
+ def initialize(options = {})
58
+ @time = options[:time]
59
+ @default_path = options[:default_path] || ''
60
+ end
61
+
62
+ def to_h
63
+ h = { name: @name, value: @value }
64
+ h[:expires] = @expires if defined? @expires
65
+ h[:max_age] = @max_age if defined? @max_age
66
+ h[:domain] = @domain if defined? @domain
67
+ h[:path] = @path if defined? @path
68
+ h[:secure] = @secure if defined? @secure
69
+ h[:http_only] = @http_only if defined? @http_only
70
+ return h
71
+ end
72
+
73
+ def clear!
74
+ %w(@name @value @expires @max_age @domain @path @secure @http_only).each do |var|
75
+ if self.instance_variable_defined? var
76
+ self.remove_instance_variable var
77
+ end
78
+ end
79
+ end
80
+
81
+ def parse!(raw_value = nil)
82
+ raise ParserError.new "nil is unparseable" if raw_value.nil?
83
+ self.clear!
84
+
85
+ chunks = raw_value.to_s.split ';'
86
+ chunks.map! do |c|
87
+ si = c.index '='
88
+ si.nil? ? [c.strip] : [ c[0...si].strip, c[si + 1..-1].strip ]
89
+ end
90
+ self.name_and_value! chunks.shift
91
+ chunks.each {|c| self.attribute! c }
92
+ return self
93
+ end
94
+
95
+ def name_and_value!(chunk)
96
+ raise ParserError.new "Name cannot be blank" if Parser.empty? chunk
97
+ raise ParserError.new "Name/value pair must include '='" if chunk.size == 1
98
+ @name = chunk[0]
99
+ @value = chunk[1]
100
+
101
+ raise ParserError.new "Name cannot be blank" if Parser.empty? @name
102
+ end
103
+
104
+ def attribute!(chunk)
105
+ key = chunk[0].downcase
106
+
107
+ case key
108
+ when 'expires' then self.expires! chunk[1]
109
+ when 'max-age' then self.max_age! chunk[1]
110
+ when 'domain' then self.domain! chunk[1]
111
+ when 'path' then self.path! chunk[1]
112
+ when 'secure' then @secure = true
113
+ when 'httponly' then @http_only = true
114
+ end
115
+ end
116
+
117
+ def expires!(val)
118
+ raise ParserError.new 'Expires cannot have a blank value' if Parser.empty?(val)
119
+ @expires = val
120
+ end
121
+
122
+ def max_age!(val)
123
+ raise ParserError.new 'Max-Age cannot have a blank value' if Parser.empty?(val)
124
+
125
+ unless val =~ /^-?\d+$/
126
+ raise ParserError.new "Expected integer for Max-Age instead of #{val}"
127
+ end
128
+
129
+ val = val.to_i
130
+ if val <= 0
131
+ @max_age = Time.at(0)
132
+ else
133
+ @max_age = (@time.nil? ? val : @time + val)
134
+ end
135
+ end
136
+
137
+ def domain!(val)
138
+ raise ParserError.new 'Domain cannot have a blank value' if Parser.empty?(val)
139
+ @domain = (val[0] == '.' ? val[1..-1] : val).downcase
140
+ end
141
+
142
+ def path!(val)
143
+ if Parser.empty?(val) || val[0] != '/'
144
+ @path = @default_path
145
+ else
146
+ @path = val
147
+ end
148
+ end
149
+
150
+ end
151
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parsed-attributes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Morgen Peschke
@@ -21,7 +21,9 @@ extensions: []
21
21
  extra_rdoc_files: []
22
22
  files:
23
23
  - lib/parsed/base.rb
24
+ - lib/parsed/http/cookie.rb
24
25
  - lib/parsed/json.rb
26
+ - lib/parsers/http/cookie.rb
25
27
  homepage: https://github.com/morgen-peschke/parsed-attributes
26
28
  licenses:
27
29
  - MIT