lector 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/.document CHANGED
@@ -3,3 +3,4 @@ bin/*
3
3
  -
4
4
  features/**/*.feature
5
5
  LICENSE.txt
6
+ README.md
data/Gemfile CHANGED
@@ -4,4 +4,5 @@ gemspec
4
4
 
5
5
  group :test do
6
6
  gem 'rake'
7
+ gem 'rns'
7
8
  end
data/Gemfile.lock CHANGED
@@ -1,46 +1,42 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lector (0.0.4)
4
+ lector (0.0.5)
5
5
  citrus
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
10
  citrus (2.4.1)
11
- coderay (0.9.8)
11
+ coderay (1.0.6)
12
12
  diff-lcs (1.1.3)
13
13
  ffi (1.0.11)
14
- guard (1.0.1)
14
+ guard (1.0.2)
15
15
  ffi (>= 0.5.0)
16
16
  thor (~> 0.14.6)
17
- guard-rspec (0.5.8)
18
- guard (>= 0.8.4)
19
- method_source (0.6.7)
20
- ruby_parser (>= 2.3.1)
21
- multi_json (1.0.3)
22
- pry (0.9.7.4)
23
- coderay (~> 0.9.8)
24
- method_source (~> 0.6.7)
25
- ruby_parser (>= 2.3.1)
26
- slop (~> 2.1.0)
17
+ guard-rspec (0.7.0)
18
+ guard (>= 0.10.0)
19
+ method_source (0.7.1)
20
+ multi_json (1.3.4)
21
+ pry (0.9.9.4)
22
+ coderay (~> 1.0.5)
23
+ method_source (~> 0.7.1)
24
+ slop (>= 2.4.4, < 3)
27
25
  rake (0.9.2.2)
28
- rspec (2.7.0)
29
- rspec-core (~> 2.7.0)
30
- rspec-expectations (~> 2.7.0)
31
- rspec-mocks (~> 2.7.0)
32
- rspec-core (2.7.1)
33
- rspec-expectations (2.7.0)
34
- diff-lcs (~> 1.1.2)
35
- rspec-mocks (2.7.0)
36
- ruby_parser (2.3.1)
37
- sexp_processor (~> 3.0)
38
- sexp_processor (3.0.8)
39
- simplecov (0.5.4)
40
- multi_json (~> 1.0.3)
26
+ rns (0.0.1)
27
+ rspec (2.10.0)
28
+ rspec-core (~> 2.10.0)
29
+ rspec-expectations (~> 2.10.0)
30
+ rspec-mocks (~> 2.10.0)
31
+ rspec-core (2.10.0)
32
+ rspec-expectations (2.10.0)
33
+ diff-lcs (~> 1.1.3)
34
+ rspec-mocks (2.10.0)
35
+ simplecov (0.6.2)
36
+ multi_json (~> 1.3)
41
37
  simplecov-html (~> 0.5.3)
42
38
  simplecov-html (0.5.3)
43
- slop (2.1.0)
39
+ slop (2.4.4)
44
40
  thor (0.14.6)
45
41
 
46
42
  PLATFORMS
@@ -52,5 +48,6 @@ DEPENDENCIES
52
48
  lector!
53
49
  pry
54
50
  rake
51
+ rns
55
52
  rspec
56
53
  simplecov
data/LICENSE.txt ADDED
@@ -0,0 +1,24 @@
1
+ lector is distributed under the following terms:
2
+
3
+ Copyright (c) Alan Dipert <alan@dipert.org>. All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions
7
+ are met:
8
+ 1. Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+ 2. Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+
14
+ THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
+ ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
18
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
+ SUCH DAMAGE.
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
- `lector` reads Ruby data as a string or from a file without evaluating the code it reads. [![Build Status](https://secure.travis-ci.org/alandipert/lector.png)](http://travis-ci.org/alandipert/lector)
1
+ `lector` reads Ruby data from strings or files without necessarily evaluating either.
2
+
3
+ Oh yeah, and the build status? We have one of those: [![Build Status](https://secure.travis-ci.org/alandipert/lector.png)](http://travis-ci.org/alandipert/lector)
2
4
 
3
5
  # Usage
4
6
 
@@ -14,9 +16,9 @@
14
16
  ```
15
17
  # read-eval is off by default:
16
18
  > Lector::read_s("{three: #='1+2'}")
17
- => {:three=>"1+2"}
19
+ RuntimeError: Evaluation isn't allowed if :read_eval is false
18
20
 
19
- # but you can turn it on...
21
+ # but when you turn it on...
20
22
  > Lector::read_s("{three: #='1+2'}", :read_eval => true)
21
23
  => {:three=>3}
22
24
  ```
data/lector.gemspec CHANGED
@@ -5,10 +5,11 @@ require "lector/version"
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "lector"
7
7
  s.version = Lector::VERSION
8
- s.authors = ["Alan Dipert", "Michael Fogus", "Alex Redington"]
9
- s.email = ["alan@dipert.org"]
8
+ s.authors = ["Alan Dipert", "Jon Distad", "Michael Fogus", "Alex Redington"]
9
+ s.email = ["alan@dipert.org", "jon.distad@gmail.com"]
10
10
  s.homepage = "http://github.com/alandipert/lector"
11
11
  s.summary = %q{A Ruby data reader.}
12
+ s.license = "BSD-new"
12
13
  s.description = %q{lector parses Ruby data into Ruby data structures.}
13
14
 
14
15
  s.rubyforge_project = "lector"
@@ -0,0 +1,23 @@
1
+ grammar Lector::Digits
2
+
3
+ rule digit
4
+ [0-9] ('_' & [0-9])?
5
+ end
6
+
7
+ rule nonzero
8
+ [1-9] ('_' & [0-9])?
9
+ end
10
+
11
+ rule hexdigit
12
+ [0-9a-fA-F] ('_' & [0-9a-fA-F])?
13
+ end
14
+
15
+ rule octaldigit
16
+ [0-7] ('_' & [0-7])?
17
+ end
18
+
19
+ rule octalzero
20
+ '0' ('_' & [0-7])?
21
+ end
22
+
23
+ end
@@ -1,5 +1,7 @@
1
1
  grammar Lector::RubyParse
2
2
 
3
+ include Lector::Digits
4
+
3
5
  rule ruby_data
4
6
  (space* form space*) <Lector::Types::Data>
5
7
  end
@@ -53,26 +55,29 @@ grammar Lector::RubyParse
53
55
  end
54
56
 
55
57
  rule number
56
- hex_integer | float | integer
58
+ hex_integer | float | octal_integer | integer
59
+ end
60
+
61
+ rule integer
62
+ ([+-]? ('0' | nonzero digit*)) <Lector::Types::Integer>
57
63
  end
58
64
 
59
65
  rule hex_integer
60
- /([-+]?)0[xX]([0-9A-Fa-f]+)?/ <Lector::Types::HexInteger>
66
+ ([+-]? `0x` hexdigit+) <Lector::Types::HexInteger>
61
67
  end
62
68
 
63
- rule float
64
- ((number:/[-+]?[0-9]+\.[0-9]*(?:[eE][-+]?[0-9]+)?/)
65
- | (number:/[-+]?[0-9][eE][-+]?[0-9]+/)) <Lector::Types::Float>
69
+ rule octal_integer
70
+ ([+-]? octalzero octaldigit+) <Lector::Types::OctalInteger>
66
71
  end
67
72
 
68
- rule integer
69
- /([-+]?0)|([-+]?[1-9]\d*)?/ <Lector::Types::Integer>
73
+ rule float
74
+ (integer '.' digit+ (`e` integer)?
75
+ | integer `e` integer) <Lector::Types::Float>
70
76
  end
71
77
 
72
78
  rule array
73
- #TODO: Spurious commas should be parse errors.
74
79
  ('['
75
- ((space* form space* ',')* (space* form space*))
80
+ ((space* form space* ',')* (space* form space*)?)
76
81
  ']') <Lector::Types::Array>
77
82
  end
78
83
 
data/lib/lector/types.rb CHANGED
@@ -5,6 +5,7 @@ module Lector
5
5
  module Nil; def val; nil; end; end
6
6
  module Integer; def val; to_i; end; end
7
7
  module HexInteger; def val; to_i 16; end; end
8
+ module OctalInteger; def val; to_i 8; end; end
8
9
  module Float; def val; to_f; end; end
9
10
  module SimpleSymbol; def val; slice(1..-1).to_sym; end; end
10
11
  module StringSymbol; def val; slice(2..-2).to_sym; end; end
@@ -1,3 +1,3 @@
1
1
  module Lector
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
data/lib/lector.rb CHANGED
@@ -2,11 +2,13 @@ require 'citrus'
2
2
  require 'lector/types'
3
3
 
4
4
  module Lector
5
+ Citrus.load('lib/lector/digits', :force => true)
5
6
  Citrus.load('lib/lector/reader', :force => true)
6
7
  end
7
8
 
8
9
  module Lector
9
10
  module RubyParse; end
11
+ module Digits; end
10
12
  def self.read_s(string, opts = {})
11
13
  $_LECTOR_READ_EVAL = opts[:read_eval] || false
12
14
  string_without_comments = $_LECTOR_READ_EVAL ? string : string.gsub(/#[^=].*$/, '')
@@ -1,126 +1,182 @@
1
1
  require File.join(File.dirname(__FILE__), *%w[.. spec_helper.rb])
2
2
  require 'pry'
3
3
  require 'tempfile'
4
+ require 'rns'
5
+
6
+ Rns::using(Lector => [:read_s, :read_file]) do
7
+ describe Lector do
8
+ context 'reading strings' do
9
+ it 'parses integers' do
10
+ read_s("+42").should == 42
11
+ read_s("-42").should == -42
12
+ read_s("42").should == 42
13
+ read_s("-42").should == -42
14
+ read_s("-0").should == 0
15
+ read_s("+0").should == 0
16
+ end
4
17
 
5
- describe Lector do
6
- context 'reading strings' do
7
- it 'parses integers' do
8
- Lector::read_s("+42").should == 42
9
- Lector::read_s("-42").should == -42
10
- Lector::read_s("42").should == 42
11
- Lector::read_s("-42").should == -42
12
- Lector::read_s("-0").should == 0
13
- Lector::read_s("+0").should == 0
14
- end
18
+ it "parses hex integers" do
19
+ read_s("0x0").should == 0
20
+ read_s("0xF").should == 15
21
+ read_s("+0xF").should == 15
22
+ read_s("-0xF").should == -15
23
+ end
15
24
 
16
- it "parses hex integers" do
17
- Lector::read_s("0xF").should == 15
18
- Lector::read_s("+0xF").should == 15
19
- Lector::read_s("-0xF").should == -15
20
- end
25
+ it "parses ocatals" do
26
+ read_s("00").should == 0
27
+ read_s("010").should == 8
28
+ read_s("-010").should == -8
29
+ read_s("+010").should == 8
30
+ end
21
31
 
22
- it "parses floating point numbers" do
23
- Lector::read_s("1.1").should == 1.1
24
- Lector::read_s("-1.1").should == -1.1
25
- Lector::read_s("-1.21e10").should == -12_100_000_000.0
26
- Lector::read_s("+1.21e10").should == 12_100_000_000.0
27
- Lector::read_s("1e4").should == 10_000
28
- end
32
+ it "parses floating point numbers" do
33
+ read_s("1.1").should == 1.1
34
+ read_s("-1.1").should == -1.1
35
+ read_s("-1.21e10").should == -12_100_000_000.0
36
+ read_s("+1.21e10").should == 12_100_000_000.0
37
+ read_s("1e4").should == 10_000
38
+ expect { read_s("1.") }.to raise_error(Citrus::ParseError)
39
+ expect { read_s("1.e5") }.to raise_error(Citrus::ParseError)
40
+ end
29
41
 
30
- it "parses true and false" do
31
- Lector::read_s("true").should == true
32
- Lector::read_s("false").should == false
33
- end
42
+ context "parsing individual underscores in the middle of numbers" do
43
+ it "in integers" do
44
+ read_s("1_0").should == 10
45
+ read_s("1_03_4").should == 1034
46
+ expect { read_s("1_03_4_") }.to raise_error(Citrus::ParseError)
47
+ expect { read_s("1__03_4") }.to raise_error(Citrus::ParseError)
48
+ end
49
+
50
+ it "in octals" do
51
+ read_s("0_1_0").should == 010
52
+ read_s("0_1_03_4").should == 01034
53
+ expect { read_s("0_1_03_4_") }.to raise_error(Citrus::ParseError)
54
+ expect { read_s("0_1__03_4") }.to raise_error(Citrus::ParseError)
55
+ end
56
+
57
+ it "in hex" do
58
+ read_s("0x3_f_0").should == 0x3F0
59
+ read_s("0x1_0D_4").should == 0x10D4
60
+ expect { read_s("0x1_03_4_") }.to raise_error(Citrus::ParseError)
61
+ expect { read_s("0x_1_03_4") }.to raise_error(Citrus::ParseError)
62
+ expect { read_s("0x1__03_4") }.to raise_error(Citrus::ParseError)
63
+ end
64
+
65
+ it "in floats" do
66
+ read_s("1_0.2_3").should == 10.23
67
+ read_s("1_0.2_3e4_5").should == 10.23e45
68
+ expect { read_s("1__0.2") }.to raise_error(Citrus::ParseError)
69
+ expect { read_s("_1_0.2") }.to raise_error(Citrus::ParseError)
70
+ expect { read_s("1._2") }.to raise_error(Citrus::ParseError)
71
+ expect { read_s("1.1__2") }.to raise_error(Citrus::ParseError)
72
+ expect { read_s("1.2_") }.to raise_error(Citrus::ParseError)
73
+ expect { read_s("1.2e1__3") }.to raise_error(Citrus::ParseError)
74
+ expect { read_s("1.2e_3") }.to raise_error(Citrus::ParseError)
75
+ expect { read_s("1.2e3_") }.to raise_error(Citrus::ParseError)
76
+ end
77
+ end
34
78
 
35
- it "parses nil" do
36
- Lector::read_s("nil").should == nil
37
- end
79
+ it "parses true and false" do
80
+ read_s("true").should == true
81
+ read_s("false").should == false
82
+ end
38
83
 
39
- it 'parses symbols' do
40
- Lector::read_s(":sym").should == :sym
41
- Lector::read_s(':"blah"').should == :blah
42
- Lector::read_s(':"blah blah"').should == :"blah blah"
43
- Lector::read_s(":'foo foo'").should == :"foo foo"
44
- end
84
+ it "parses nil" do
85
+ read_s("nil").should == nil
86
+ end
45
87
 
46
- it 'parses arrays of single elements' do
47
- Lector::read_s('[42]').should == [42]
48
- end
88
+ it 'parses symbols' do
89
+ read_s(":sym").should == :sym
90
+ read_s(':"blah"').should == :blah
91
+ read_s(':"blah blah"').should == :"blah blah"
92
+ read_s(":'foo foo'").should == :"foo foo"
93
+ end
49
94
 
50
- it 'ignores whitespace' do
51
- Lector::read_s("[ 42 ]").should == [42]
52
- end
95
+ it 'parses arrays of single elements' do
96
+ read_s('[42]').should == [42]
97
+ end
53
98
 
54
- it 'parses arrays of multiple elements' do
55
- Lector::read_s("[42, -1]").should == [42, -1]
56
- end
99
+ it 'ignores whitespace' do
100
+ read_s("[ 42 ]").should == [42]
101
+ end
57
102
 
58
- it 'parses hashes' do
59
- Lector::read_s("{a: 7, b: 6}").should == {:a => 7, :b => 6}
60
- Lector::read_s("{b: 6}").should == {:b => 6}
61
- Lector::read_s("{:a => 7, :b => 6}").should == {:a => 7, :b => 6}
62
- Lector::read_s("{:a => 7, b: 6}").should == {:a => 7, :b => 6}
63
- end
103
+ it 'parses arrays of multiple elements' do
104
+ read_s("[42, -1]").should == [42, -1]
105
+ end
64
106
 
65
- it 'parses nested collections' do
66
- Lector::read_s("[[1,2], 3, 4]").should == [[1, 2], 3, 4]
67
- end
107
+ it 'fails to parse arrays with spurious commas' do
108
+ expect { read_s('[1,,2]') }.to raise_error(Citrus::ParseError)
109
+ end
68
110
 
69
- it 'has no problem with hashes of arrays' do
70
- Lector::read_s("{a: [1, 2], b: [3, 4]}").should == {:a => [1, 2], :b => [3, 4]}
71
- Lector::read_s("{:a => [1, 2], :b => [3, 4]}").should == {:a => [1, 2], :b => [3, 4]}
72
- end
111
+ it 'allows trailing commas in arrays' do
112
+ read_s('[1,2,]').should == [1,2]
113
+ end
73
114
 
74
- it 'copes when data is surrounded by whitespace' do
75
- Lector::read_s("
115
+ it 'parses hashes' do
116
+ read_s("{a: 7, b: 6}").should == {:a => 7, :b => 6}
117
+ read_s("{b: 6}").should == {:b => 6}
118
+ read_s("{:a => 7, :b => 6}").should == {:a => 7, :b => 6}
119
+ read_s("{:a => 7, b: 6}").should == {:a => 7, :b => 6}
120
+ end
121
+
122
+ it 'parses nested collections' do
123
+ read_s("[[1,2], 3, 4]").should == [[1, 2], 3, 4]
124
+ end
125
+
126
+ it 'has no problem with hashes of arrays' do
127
+ read_s("{a: [1, 2], b: [3, 4]}").should == {:a => [1, 2], :b => [3, 4]}
128
+ read_s("{:a => [1, 2], :b => [3, 4]}").should == {:a => [1, 2], :b => [3, 4]}
129
+ end
130
+
131
+ it 'copes when data is surrounded by whitespace' do
132
+ read_s("
76
133
  {a: 7, b: 6} ").should == {:a => 7, :b => 6}
77
- end
134
+ end
78
135
 
79
- it 'reads double-quoted strings' do
80
- Lector::read_s('"a string by any other name is just as tangly"').should == 'a string by any other name is just as tangly'
81
- end
136
+ it 'reads double-quoted strings' do
137
+ read_s('"a string by any other name is just as tangly"').should == 'a string by any other name is just as tangly'
138
+ end
82
139
 
83
- it 'reads single-quoted strings' do
84
- Lector::read_s("'i only have single quotes'").should == 'i only have single quotes'
85
- end
140
+ it 'reads single-quoted strings' do
141
+ read_s("'i only have single quotes'").should == 'i only have single quotes'
142
+ end
86
143
 
87
- it 'reads strings with escaped quotes' do
88
- Lector::read_s('"a string with an \"escaped quote\""').should == 'a string with an "escaped quote"'
89
- end
144
+ it 'reads strings with escaped quotes' do
145
+ read_s('"a string with an \"escaped quote\""').should == 'a string with an "escaped quote"'
146
+ end
90
147
 
91
- it 'preserves other escaped characters' do
92
- Lector::read_s('"a string with a\nnewline"').should == 'a string with a\nnewline'
93
- end
148
+ it 'preserves other escaped characters' do
149
+ read_s('"a string with a\nnewline"').should == 'a string with a\nnewline'
150
+ end
94
151
 
95
- it 'deals with comments' do
96
- Lector::read_s("{#Here's a comment in the code.\nx: #And another!\n10}").
97
- should == {:x => 10}
152
+ it 'deals with comments' do
153
+ read_s("{#Here's a comment in the code.\nx: #And another!\n10}").
154
+ should == {:x => 10}
155
+ end
98
156
  end
99
- end
100
157
 
101
- context 'read-evaling' do
102
- it "blows up when read-eval is off and there's embedded code" do
103
- expect {
104
- Lector::read_s("#='1+2'").should == '1+2'
105
- }.to raise_error(RuntimeError)
106
- end
158
+ context 'read-evaling' do
159
+ it "blows up when read-eval is off and there's embedded code" do
160
+ expect { read_s("#='1+2'") }.to raise_error(RuntimeError)
161
+ end
107
162
 
108
- it "embedded code works when :read_eval is on" do
109
- Lector::read_s("#='1+2'", :read_eval => true).should == 3
110
- end
163
+ it "embedded code works when :read_eval is on" do
164
+ read_s("#='1+2'", :read_eval => true).should == 3
165
+ end
111
166
 
112
- it "copes when strings have comments" do
113
- Lector::read_s("[:a#some comment\n,:b,:c]").should == [:a, :b, :c]
167
+ it "copes when strings have comments" do
168
+ read_s("[:a#some comment\n,:b,:c]").should == [:a, :b, :c]
169
+ end
114
170
  end
115
- end
116
171
 
117
- context 'reading files' do
118
- it 'should be able to round-trip data to file' do
119
- hsh = {:a => [1, 2], nil => false, :b => [3, 4], blah: [1.2, {:x => 20}]}
120
- Tempfile.new('lector').tap do |f|
121
- f.write(hsh.to_s)
122
- f.rewind
123
- Lector::read_file(f).should == hsh
172
+ context 'reading files' do
173
+ it 'should be able to round-trip data to file' do
174
+ hsh = {:a => [1, 2], nil => false, :b => [3, 4], blah: [1.2, {:x => 20}]}
175
+ Tempfile.new('lector').tap do |f|
176
+ f.write(hsh.to_s)
177
+ f.rewind
178
+ read_file(f).should == hsh
179
+ end
124
180
  end
125
181
  end
126
182
  end
metadata CHANGED
@@ -1,17 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lector
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Alan Dipert
9
+ - Jon Distad
9
10
  - Michael Fogus
10
11
  - Alex Redington
11
12
  autorequire:
12
13
  bindir: bin
13
14
  cert_chain: []
14
- date: 2012-05-04 00:00:00.000000000 Z
15
+ date: 2012-05-07 00:00:00.000000000 Z
15
16
  dependencies:
16
17
  - !ruby/object:Gem::Dependency
17
18
  name: pry
@@ -112,6 +113,7 @@ dependencies:
112
113
  description: lector parses Ruby data into Ruby data structures.
113
114
  email:
114
115
  - alan@dipert.org
116
+ - jon.distad@gmail.com
115
117
  executables: []
116
118
  extensions: []
117
119
  extra_rdoc_files: []
@@ -123,17 +125,20 @@ files:
123
125
  - Gemfile
124
126
  - Gemfile.lock
125
127
  - Guardfile
128
+ - LICENSE.txt
126
129
  - README.md
127
130
  - Rakefile
128
131
  - lector.gemspec
129
132
  - lib/lector.rb
133
+ - lib/lector/digits.citrus
130
134
  - lib/lector/reader.citrus
131
135
  - lib/lector/types.rb
132
136
  - lib/lector/version.rb
133
137
  - spec/lector/reader_spec.rb
134
138
  - spec/spec_helper.rb
135
139
  homepage: http://github.com/alandipert/lector
136
- licenses: []
140
+ licenses:
141
+ - BSD-new
137
142
  post_install_message:
138
143
  rdoc_options: []
139
144
  require_paths: