dnc 0.0.2 → 0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b9e67a4e1a35c22ec3d34da5694a2f1f2329a452
4
- data.tar.gz: 5cfaf79abf1cff17fca5c305a2a11b9766a60a9f
3
+ metadata.gz: 66b1ef34df9cb502c35b85313bc576a3de31e043
4
+ data.tar.gz: 691ed00273f98ed06be51cf361b358965a25b00d
5
5
  SHA512:
6
- metadata.gz: 037f0e5d5b2560d471094935ed3afe78e8f4beb9195cde87667260a21ebdffd107df3e86daca8ca03db3dad897247581097f3c2bd972251b446922a667ce3d2b
7
- data.tar.gz: 6ed48e3892e2a9502f03efd3ef6911d7d562b24ef3f98946b528b088f44fb2579cad5e85b2bc2c7cc354f3f2a40472c6e9c376b4404852cbfe59bd863fe6523b
6
+ metadata.gz: ca789d0f4c60ea6c846debc8765f27f4388842551752eddccaddaef8a8fddbb5603a07899be98d4732bb2d7e442bcd7156fe2c9e8cb09b2c25abe3fc1fd43fcd
7
+ data.tar.gz: b338653735df756a52c15bf27c1cc32fce7c5017ace0f1de9f22be8fd6d3f83372ae0218b74b5b92b778039f26f31ed7df8b46126927d80da8b727f8168a2890
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/.rubocop.yml CHANGED
@@ -2,6 +2,7 @@ AllCops:
2
2
  Exclude:
3
3
  - 'dnc.gemspec'
4
4
  - 'lib/dnc/version.rb'
5
+ - 'lib/blank.rb'
5
6
  - 'spec/**/*'
6
7
  - 'vendor/cache/**/*'
7
8
  - 'vendor/bundle/**/*'
@@ -2,7 +2,6 @@
2
2
  # Extend the core Array class to include `.wrap`
3
3
  #
4
4
  class Array
5
-
6
5
  # Duplication of Ruby on Rails Array#wrap method
7
6
  def self.wrap(object)
8
7
  if object.nil?
data/lib/blank.rb ADDED
@@ -0,0 +1,131 @@
1
+ # encoding: utf-8
2
+
3
+ class Object
4
+ # An object is blank if it's false, empty, or a whitespace string.
5
+ # For example, '', ' ', +nil+, [], and {} are all blank.
6
+ #
7
+ # This simplifies
8
+ #
9
+ # address.nil? || address.empty?
10
+ #
11
+ # to
12
+ #
13
+ # address.blank?
14
+ #
15
+ # @return [true, false]
16
+ def blank?
17
+ respond_to?(:empty?) ? !!empty? : !self
18
+ end
19
+
20
+ # An object is present if it's not blank.
21
+ #
22
+ # @return [true, false]
23
+ def present?
24
+ !blank?
25
+ end
26
+
27
+ # Returns the receiver if it's present otherwise returns +nil+.
28
+ # <tt>object.presence</tt> is equivalent to
29
+ #
30
+ # object.present? ? object : nil
31
+ #
32
+ # For example, something like
33
+ #
34
+ # state = params[:state] if params[:state].present?
35
+ # country = params[:country] if params[:country].present?
36
+ # region = state || country || 'US'
37
+ #
38
+ # becomes
39
+ #
40
+ # region = params[:state].presence || params[:country].presence || 'US'
41
+ #
42
+ # @return [Object]
43
+ def presence
44
+ self if present?
45
+ end
46
+ end
47
+
48
+ class NilClass
49
+ # +nil+ is blank:
50
+ #
51
+ # nil.blank? # => true
52
+ #
53
+ # @return [true]
54
+ def blank?
55
+ true
56
+ end
57
+ end
58
+
59
+ class FalseClass
60
+ # +false+ is blank:
61
+ #
62
+ # false.blank? # => true
63
+ #
64
+ # @return [true]
65
+ def blank?
66
+ true
67
+ end
68
+ end
69
+
70
+ class TrueClass
71
+ # +true+ is not blank:
72
+ #
73
+ # true.blank? # => false
74
+ #
75
+ # @return [false]
76
+ def blank?
77
+ false
78
+ end
79
+ end
80
+
81
+ class Array
82
+ # An array is blank if it's empty:
83
+ #
84
+ # [].blank? # => true
85
+ # [1,2,3].blank? # => false
86
+ #
87
+ # @return [true, false]
88
+ alias_method :blank?, :empty?
89
+ end
90
+
91
+ class Hash
92
+ # A hash is blank if it's empty:
93
+ #
94
+ # {}.blank? # => true
95
+ # { key: 'value' }.blank? # => false
96
+ #
97
+ # @return [true, false]
98
+ alias_method :blank?, :empty?
99
+ end
100
+
101
+ class String
102
+ BLANK_RE = /\A[[:space:]]*\z/
103
+
104
+ # A string is blank if it's empty or contains whitespaces only:
105
+ #
106
+ # ''.blank? # => true
107
+ # ' '.blank? # => true
108
+ # "\t\n\r".blank? # => true
109
+ # ' blah '.blank? # => false
110
+ #
111
+ # Unicode whitespace is supported:
112
+ #
113
+ # "\u00a0".blank? # => true
114
+ #
115
+ # @return [true, false]
116
+ def blank?
117
+ BLANK_RE === self
118
+ end
119
+ end
120
+
121
+ class Numeric #:nodoc:
122
+ # No number is blank:
123
+ #
124
+ # 1.blank? # => false
125
+ # 0.blank? # => false
126
+ #
127
+ # @return [false]
128
+ def blank?
129
+ false
130
+ end
131
+ end
data/lib/dnc.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'dnc/version'
2
2
  require 'dnc/dn'
3
3
  require 'dnc/string'
4
- require 'dnc/array'
4
+ require 'blank'
5
+ require 'array'
data/lib/dnc/dn.rb CHANGED
@@ -5,22 +5,31 @@ class DnDelimiterUnparsableError < TypeError; end
5
5
  # Custom exception for strings that can't be parsed as per RFC1779
6
6
  class DnStringUnparsableError < TypeError; end
7
7
 
8
+ # rubocop:disable ClassLength
8
9
  # Accepts various DN strings and returns a DN object
9
10
  class DN
10
- attr_accessor :original_dn, :dn_string, :delimiter,
11
- :cn, :l, :st, :o, :ou, :c, :street, :dc
11
+ attr_accessor :original_dn, :dn_string, :delimiter, :transformation,
12
+ :string_order, :cn, :l, :st, :ou, :o, :c, :street, :dc, :uid
12
13
 
13
14
  # Initialize the instance
14
15
  #
15
16
  # @param opts [Hash] Options hash for new DN instance attribute values
16
17
  # @param opts[:dn_string] [String] The DN string you want to parse into a DN
17
18
  # @param opts[:logger] User provided logger vs Rails / Logging default logger
18
- def initialize(opts={})
19
- @dn_string = opts[:dn_string]
20
- @original_dn = dn_string
21
- fail "dnc: dn_string parameter is **required**" if dn_string.nil?
22
- @logger = opts[:logger].nil? ? logger : opts[:logger]
23
- @delimiter = opts[:delimiter].nil? ? identify_delimiter : opts[:delimiter]
19
+ # NOTE: opts[transformation] defaults to "upcase"; use "to_s" for no change.
20
+ # @param opts[:transformation] [String] String method for changing DN.
21
+ # @param opts[:delimiter] [String] Specify a custom delimiter for dn_string
22
+ # NOTE: opts[:string_order] is a last resort config, defaults to RFC4514 spec.
23
+ # @param opts[:string_order] [Array] Specify the order of RDNs for .to_s
24
+ # @return [DN]
25
+ def initialize(opts = {})
26
+ @dn_string = opts[:dn_string]
27
+ fail 'dnc: dn_string parameter is **required**' if dn_string.nil?
28
+ @original_dn = dn_string
29
+ @logger = opts[:logger] || logger
30
+ @transformation = opts[:transformation] || 'upcase'
31
+ @string_order = opts[:string_order] || %w(cn l st o ou c street dc uid)
32
+ @delimiter = opts[:delimiter] || identify_delimiter
24
33
  format_dn
25
34
  end
26
35
 
@@ -31,29 +40,30 @@ class DN
31
40
  @logger ||= Kernel.const_defined?('Rails') ? Rails.logger : logger
32
41
  end
33
42
 
34
- # Split passed DN by identified delimiter
35
- def split_by_delimiter
36
- dn_string.split(delimiter).reject(&:empty?)
37
- end
38
-
39
- # Convert DN object into a string
43
+ # Convert DN object into a string (order follows RFC4514 LDAP specifications)
40
44
  def to_s
41
- return_string = ""
42
- %w(cn dc l st ou o c street).each do |string_name|
43
- unless self.send(string_name.to_sym).nil? || self.send(string_name.to_sym).empty?
44
- return_string += "," unless return_string.empty?
45
- return_string += self.send("#{string_name}_string".to_sym)
45
+ return_string = ''
46
+ @string_order.each do |string_name|
47
+ unless send(string_name.to_sym).blank?
48
+ return_string += ',' unless return_string.empty?
49
+ return_string += send("#{string_name}_string".to_sym)
46
50
  end
47
51
  end
48
52
 
49
53
  return_string
50
54
  end
51
55
 
56
+ # Split passed DN by identified delimiter
57
+ def split_by_delimiter
58
+ dn_string.split(delimiter).reject(&:empty?)
59
+ end
60
+
52
61
  private
53
62
 
54
63
  # Orchestrates reformatting DN to expected element order for LDAP auth.
55
64
  def format_dn
56
- dn_string.upcase! # Upcase all DNs for consistency
65
+ # Transform dn_string for consistency / uniqueness
66
+ @dn_string = dn_string.send(transformation.to_sym)
57
67
  format_dn_element_order unless dn_begins_properly?(dn_string)
58
68
  parse_rdns_to_attrs
59
69
  self
@@ -62,10 +72,10 @@ class DN
62
72
  # Parse @dn_string RDNs and assign them to DN attributes
63
73
  def parse_rdns_to_attrs
64
74
  split_by_delimiter.each do |rdn|
65
- unless rdn.include?('+')
66
- parse_top_level_rdn(rdn)
67
- else
75
+ if rdn.include?('+')
68
76
  parse_nested_rdn(rdn)
77
+ else
78
+ parse_top_level_rdn(rdn)
69
79
  end
70
80
  end
71
81
 
@@ -76,11 +86,10 @@ class DN
76
86
  rdn_array = rdn.split('=')
77
87
  method = rdn_array[0].downcase.to_sym
78
88
  value = rdn_array[1]
79
- unless send(method).nil? || send(method).empty?
80
- send("#{method}=", Array.wrap(send(method)))
81
- send("#{method}").insert(0, value)
89
+ if send(method).blank?
90
+ assign_rdn_as_string(method, value)
82
91
  else
83
- send("#{method}=", value)
92
+ assign_rdn_as_array(method, value)
84
93
  end
85
94
  end
86
95
 
@@ -95,20 +104,32 @@ class DN
95
104
  send("#{rdn_keypairs.keys.first.downcase}=", rdn_keypairs)
96
105
  end
97
106
 
98
- # Ensure order of DN elements is proper for CAS server with ',' delimiter
107
+ def assign_rdn_as_string(method_name, value)
108
+ send("#{method_name}=", value)
109
+ end
110
+
111
+ def assign_rdn_as_array(method_name, value)
112
+ send("#{method_name}=", Array.wrap(send(method_name)))
113
+ send("#{method_name}").push(value)
114
+ end
115
+
116
+ # Ensure order of DN elements is proper for CAS server
99
117
  def format_dn_element_order
100
118
  formatted_dn = split_by_delimiter.reverse.join(delimiter)
101
119
  if dn_begins_properly?(formatted_dn)
102
- dn_string = formatted_dn
103
-
120
+ @dn_string = formatted_dn
104
121
  else
105
- fail("DN invalid format for LDAP authentication, DN:\r\n#{original_dn}")
122
+ fail "DN invalid format for LDAP authentication, DN:\r\n#{original_dn}"
106
123
  end
107
124
  end
108
125
 
109
126
  # Verify DN starts with 'CN='
110
127
  def dn_begins_properly?(dn_str)
111
- dn_str.nil? ? false : (dn_str.start_with?("CN=") || dn_str.start_with?("#{delimiter}CN="))
128
+ if dn_str.nil?
129
+ false
130
+ else
131
+ dn_str.start_with?('CN=') || dn_str.start_with?("#{delimiter}CN=")
132
+ end
112
133
  end
113
134
 
114
135
  # Regex to match the DN delimiter by getting the 2nd key non-word predecessor
@@ -118,60 +139,28 @@ class DN
118
139
 
119
140
  # Identify and set the DN delimiter
120
141
  def identify_delimiter
121
- begin
122
- logger.debug("DN.identify_delimeter: #{dn_string}")
123
- delimiter_regexp.match(dn_string)[1]
142
+ logger.debug("DN.identify_delimeter: #{dn_string}")
143
+ delimiter_regexp.match(dn_string)[1]
124
144
  rescue
125
- fail DnDelimiterUnparsableError, "DN delimiter could not be identified
145
+ raise DnDelimiterUnparsableError, "DN delimiter could not be identified
126
146
  \r\nPlease ensure your string complies with RFC1779 formatting."
127
- end
128
- end
129
-
130
- def cn_string
131
- dynamic_strings('cn', cn.class)
132
147
  end
133
148
 
134
- def l_string
135
- dynamic_strings('l', l.class)
136
- end
137
-
138
- def st_string
139
- dynamic_strings('st', st.class)
140
- end
141
-
142
- def o_string
143
- dynamic_strings('o', o.class)
144
- end
145
-
146
- def ou_string
147
- dynamic_strings('ou', ou.class)
148
- end
149
-
150
- def c_string
151
- dynamic_strings('c', c.class)
152
- end
153
-
154
- def street_string
155
- dynamic_strings('street', street.class)
156
- end
149
+ def method_missing(method_name)
150
+ # Catch methods that end with _string
151
+ method_match = method_name.to_s.match(/(.+)_string\z/)
152
+ unless method_match.blank?
153
+ method = method_match[1]
154
+ method_class = send(method.to_sym).class
155
+ return send(:dynamic_strings, method.to_s, method_class)
156
+ end
157
157
 
158
- def dc_string
159
- dynamic_strings('dc', dc.class)
158
+ super
160
159
  end
161
160
 
162
- # Identify which RDN string formatteer to call by value's class
161
+ # Dynamically format the "#{attr}_string" method by value's class type
163
162
  def dynamic_strings(getter_method, value_class)
164
- case value_class.to_s
165
- when Array.to_s
166
- dn_array_to_string(getter_method)
167
- when Hash.to_s
168
- dn_hash_to_string(getter_method)
169
- when String.to_s
170
- dn_string_to_string(getter_method)
171
- else
172
- logger.error "Invalid string accessor method class: #{value_class}"
173
- fail "Invalid string accessor method class: #{value_class}"
174
- end
163
+ send("dn_#{value_class.to_s.downcase}_to_string".to_sym, getter_method)
175
164
  end
176
165
 
177
166
  # NOTE:
@@ -180,10 +169,10 @@ class DN
180
169
 
181
170
  # Dynamically define a method to return DN array values as string format
182
171
  def dn_array_to_string(getter_method)
183
- return_string = ""
184
- value = self.send(getter_method.to_sym)
172
+ return_string = ''
173
+ value = send(getter_method.to_sym)
185
174
  value.each do |element|
186
- return_string += "," unless return_string.empty?
175
+ return_string += ',' unless return_string.empty?
187
176
  return_string += "#{getter_method.to_s.upcase}=#{element}"
188
177
  end
189
178
 
@@ -192,10 +181,10 @@ class DN
192
181
 
193
182
  # Dynamically define a method to return DN hash values as string format
194
183
  def dn_hash_to_string(getter_method)
195
- return_string = ""
196
- value = self.send(getter_method.to_sym)
184
+ return_string = ''
185
+ value = send(getter_method.to_sym)
197
186
  value.each do |key, string|
198
- return_string += "+" unless return_string.empty?
187
+ return_string += '+' unless return_string.empty?
199
188
  return_string += "#{key}=#{string}"
200
189
  end
201
190
 
@@ -204,6 +193,6 @@ class DN
204
193
 
205
194
  # Dynamically define a method to return DN string values as string format
206
195
  def dn_string_to_string(getter_method)
207
- "#{getter_method.to_s.upcase}=#{self.send(getter_method.to_sym)}"
196
+ "#{getter_method.to_s.upcase}=#{send(getter_method.to_sym)}"
208
197
  end
209
198
  end
data/lib/dnc/string.rb CHANGED
@@ -4,12 +4,11 @@ require 'dnc'
4
4
  # Extend the core String class to include `.to_dn` && `.to_dn!`
5
5
  #
6
6
  class String
7
-
8
7
  # Parses the string to return a DN object
9
8
  # Returns nil if a DN instance cannot be created
10
9
  def to_dn
11
10
  begin
12
- new_dn = DN.new(dn_string: self.to_s)
11
+ new_dn = DN.new(dn_string: to_s)
13
12
  rescue StandardError
14
13
  new_dn = nil
15
14
  end
@@ -21,13 +20,12 @@ class String
21
20
  # explicitly parsed to a DN instance
22
21
  def to_dn!
23
22
  begin
24
- new_dn = DN.new(dn_string: self.to_s)
23
+ new_dn = DN.new(dn_string: to_s)
25
24
  rescue StandardError
26
25
  raise DnStringUnparsableError,
27
- "Could not force conversion to DN:\n#{inspect}"
26
+ "Could not force conversion to DN:\n#{inspect}"
28
27
  end
29
28
 
30
29
  new_dn
31
30
  end
32
31
  end
33
-
data/lib/dnc/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Dnc
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1"
3
3
  end
@@ -1,3 +1,7 @@
1
+ CN=Stusrvich Terrance Edward Testusr,OU=D135,OU=Isle,OU=web,O=L.O.S.T. others,C=us%CN=STUSRVICH TERRANCE EDWARD TESTUSR,OU=D135,OU=ISLE,OU=WEB,O=L.O.S.T. OTHERS,C=US
2
+ CN=DIAGO Desmond d123456,OU=People,OU=PENNY,OU=Not,O=L.O.S.T. OTHERS,C=US%CN=DIAGO DESMOND D123456,OU=PEOPLE,OU=PENNY,OU=NOT,O=L.O.S.T. OTHERS,C=US
3
+ CN=BOB-THORNTON William JAMES wjbob,OU=boat,OU=b047,OU=ISLE,OU=NOT,O=l.o.s.t. others,C=us%CN=BOB-THORNTON WILLIAM JAMES WJBOB,OU=BOAT,OU=B047,OU=ISLE,OU=NOT,O=L.O.S.T. OTHERS,C=US
4
+ CN=NODE RUBY G RGNODE9,OU=JIEDDO,OU=PEOPLE,OU=JCK,OU=JHN,O=L.O.S.T. OTHERS,C=US%CN=NODE RUBY G RGNODE9,OU=JIEDDO,OU=PEOPLE,OU=JCK,OU=JHN,O=L.O.S.T. OTHERS,C=US
1
5
  /C=US/O=RB/OU=DEV/OU=RAILS/OU=People/CN=Last First (initial)%CN=LAST FIRST (INITIAL),OU=PEOPLE,OU=RAILS,OU=DEV,O=RB,C=US
2
6
  /CN=Smith John+initials=cpt/OU=People/OU=RAILS/OU=DEV/O=RB/C=GB%CN=SMITH JOHN+INITIALS=CPT,OU=DEV,OU=RAILS,OU=PEOPLE,O=RB,C=GB
3
7
  CN=John Smith+email=jsmith@mayflower.org,O=ISODE Consortium,C=GB,O=ISODE Consortium%CN=JOHN SMITH+EMAIL=JSMITH@MAYFLOWER.ORG,O=ISODE CONSORTIUM,C=GB,O=ISODE CONSORTIUM
data/spec/lib/dn_spec.rb CHANGED
@@ -4,7 +4,7 @@ describe DN do
4
4
  let!(:raw_dn) { '/C=US/O=RB/OU=DEV/OU=JS/OU=People/CN=Last First M (initial)' }
5
5
  let!(:dn_to_s) { 'CN=LAST FIRST M (INITIAL),OU=PEOPLE,OU=JS,OU=DEV,O=RB,C=US' }
6
6
  let(:valid_subject) { DN.new(dn_string: raw_dn) }
7
- let(:dn_elements) { ["C=US", "O=RB", "OU=DEV", "OU=JS", "OU=PEOPLE", "CN=LAST FIRST M (INITIAL)"] }
7
+ let(:dn_elements) { ["CN=LAST FIRST M (INITIAL)", "OU=PEOPLE", "OU=JS", "OU=DEV", "O=RB", "C=US"] }
8
8
 
9
9
  #
10
10
  # Unit specs
@@ -32,11 +32,11 @@ describe DN do
32
32
  end
33
33
 
34
34
  it "should return appropriate attrs as arrays" do
35
- [:ou, :dc].each do |array_wrapped_el|
36
- dn = DN.new(dn_string: '/C=US/O=RB/OU=DEV/OU=JS/OU=People/DC=example/DC=org/CN=Last First M (initial)')
37
- expect(dn.dc).to eq(['ORG', 'EXAMPLE'])
38
- expect(dn.ou).to eq(['PEOPLE', 'JS', 'DEV'])
39
- end
35
+ expect(valid_subject.ou).to eq(['PEOPLE','JS','DEV'])
36
+ expect(DN.new(dn_string: dn_to_s).ou).to eq(['PEOPLE','JS','DEV'])
37
+ dn = DN.new(dn_string: '/C=US/O=RB/OU=DEV/OU=JS/OU=People/DC=example/DC=org/CN=Last First M (initial)')
38
+ expect(dn.ou).to eq(['PEOPLE', 'JS', 'DEV'])
39
+ expect(dn.dc).to eq(['ORG', 'EXAMPLE'])
40
40
  end
41
41
 
42
42
  it "should handle multiple RDN key value pairs in the CN and return an array of elements" do
@@ -55,19 +55,16 @@ describe DN do
55
55
  describe ".to_s" do
56
56
  it "should return a properly formatted string for CAS & RFC1779 use" do
57
57
  dn = DN.new(dn_string: '/C=US/O=RB/OU=DEV/OU=JS/OU=People/DC=example/DC=org/CN=Last First M (initial)+email=initial@example.org+office=home')
58
- dn_string = 'CN=LAST FIRST M (INITIAL)+EMAIL=INITIAL@EXAMPLE.ORG+OFFICE=HOME,DC=ORG,DC=EXAMPLE,OU=PEOPLE,OU=JS,OU=DEV,O=RB,C=US'
58
+ dn_string = 'CN=LAST FIRST M (INITIAL)+EMAIL=INITIAL@EXAMPLE.ORG+OFFICE=HOME,O=RB,OU=PEOPLE,OU=JS,OU=DEV,C=US,DC=ORG,DC=EXAMPLE'
59
59
  expect(dn.to_s).to eq(dn_string)
60
60
  end
61
61
 
62
- it "should parse common DN formats into DN objects" do
63
- pending "Finish this"
64
- File.readlines('spec/fixtures/common_dns.txt').each do |line|
65
- dn_in = line.rstrip.split('%')[0]
66
- dn_out = line.rstrip.split('%')[1]
67
- #ap dn_in
68
- #ap dn_out
69
- expect(DN.new(dn_string: dn_in).to_s).to eq(dn_out)
70
- end
71
- end
62
+ # it "should parse common DN formats into DN objects" do
63
+ # File.readlines('spec/fixtures/common_dns.txt').each do |line|
64
+ # dn_in = line.rstrip.split('%')[0]
65
+ # dn_out = line.rstrip.split('%')[1]
66
+ # expect(DN.new(dn_string: dn_in).to_s).to eq(dn_out)
67
+ # end
68
+ # end
72
69
  end
73
70
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dnc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: '0.1'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Haddox
@@ -30,7 +30,7 @@ cert_chain:
30
30
  42qdwEXvvkODZAD6KAIXPdmbMfBgPbcd+B/4eUA0PyKo+4dgL1NuqX4MPWToevIZ
31
31
  O8EKLF2X7NmC6FY1bOsSj/J8r1SOkx0rxgF+geRvY1P+hfNjDfxTsjU=
32
32
  -----END CERTIFICATE-----
33
- date: 2015-01-13 00:00:00.000000000 Z
33
+ date: 2015-01-14 00:00:00.000000000 Z
34
34
  dependencies:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: logging
@@ -204,8 +204,9 @@ files:
204
204
  - Rakefile
205
205
  - certs/stevenhaddox.pem
206
206
  - dnc.gemspec
207
+ - lib/array.rb
208
+ - lib/blank.rb
207
209
  - lib/dnc.rb
208
- - lib/dnc/array.rb
209
210
  - lib/dnc/dn.rb
210
211
  - lib/dnc/string.rb
211
212
  - lib/dnc/version.rb
metadata.gz.sig CHANGED
@@ -1 +1,3 @@
1
- (Q�W�@��)�5M+Q$Q\Rm�(#l�{��ۊ��G!Ƕ��B��~�/Ov�Jm�B.���K��Gǭ) ���e&EJ,j�6~���-�v
1
+ �)�`�mq��P���N�rkQ�$-JBB x]�}j�Ԥ�'�ܴ?�y��
2
+ $ N
3
+ �on1�E�T HD�=���Os.S���4k(�0�i�@�j��%*���p@�E3��Y�GaO�����Y