dnc 0.0.2 → 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.
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