swissparser 0.9.0 → 0.10.0
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.
- data/.gitignore +1 -0
- data/CHANGELOG.rdoc +11 -0
- data/Rakefile +11 -2
- data/examples/tutorial_1.rb +1 -1
- data/examples/tutorial_2.rb +65 -0
- data/features/parser_extension.feature +53 -0
- data/features/step_definitions/steps.rb +103 -0
- data/features/user_friendly.feature +29 -0
- data/lib/swissparser.rb +18 -11
- metadata +16 -2
data/.gitignore
CHANGED
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
== 0.10.0 / 2009-11-14
|
2
|
+
|
3
|
+
* 1 new feature:
|
4
|
+
- SwissParser can now parse an input string or whatever input responding to the +each_line+ method
|
5
|
+
|
6
|
+
* 1 bug fix:
|
7
|
+
- +with_text_after+ and +set_separator+ can now be properly replaced when extended.
|
8
|
+
|
9
|
+
* Misc:
|
10
|
+
- First release with tests using cucumber
|
11
|
+
|
1
12
|
== 0.9.0 / 2009-11-14
|
2
13
|
|
3
14
|
* 1 new feature:
|
data/Rakefile
CHANGED
@@ -7,8 +7,16 @@ end
|
|
7
7
|
ensure_in_path 'lib'
|
8
8
|
require 'swissparser'
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
require 'cucumber/rake/task'
|
11
|
+
|
12
|
+
task :default => :features
|
13
|
+
|
14
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
15
|
+
t.cucumber_opts = "--format pretty"
|
16
|
+
t.rcov = true
|
17
|
+
end
|
18
|
+
|
19
|
+
CLOBBER << "coverage/"
|
12
20
|
|
13
21
|
Bones {
|
14
22
|
name 'swissparser'
|
@@ -16,6 +24,7 @@ Bones {
|
|
16
24
|
email 'paradigmatic@streum.org'
|
17
25
|
url 'http://github.com/paradigmatic/SwissParser'
|
18
26
|
version Swiss::VERSION
|
27
|
+
gem.development_dependencies = [["cucumber", ">= 0.4"]]
|
19
28
|
readme_file 'README.rdoc'
|
20
29
|
history_file 'CHANGELOG.rdoc'
|
21
30
|
ignore_file '.gitignore'
|
data/examples/tutorial_1.rb
CHANGED
@@ -0,0 +1,65 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (C) 2009 Paradigmatic
|
3
|
+
|
4
|
+
This file is part of SwissParser.
|
5
|
+
|
6
|
+
SwissParser is free software: you can redistribute it and/or modify
|
7
|
+
it under the terms of the GNU General Public License as published by
|
8
|
+
the Free Software Foundation, either version 3 of the License, or
|
9
|
+
(at your option) any later version.
|
10
|
+
|
11
|
+
SwissParser is distributed in the hope that it will be useful,
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
GNU General Public License for more details.
|
15
|
+
|
16
|
+
You should have received a copy of the GNU General Public License
|
17
|
+
along with SwissParser. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
=end
|
19
|
+
|
20
|
+
#!/usr/bin/ruby -w
|
21
|
+
|
22
|
+
require 'swissparser'
|
23
|
+
require 'examples/tutorial_1'
|
24
|
+
|
25
|
+
class Protein
|
26
|
+
|
27
|
+
attr_accessor :id, :size, :species, :taxonomy, :sequence
|
28
|
+
|
29
|
+
def initialize
|
30
|
+
@taxonomy = []
|
31
|
+
@sequence = ""
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
module Uniprot
|
37
|
+
|
38
|
+
SpeciesParser = Uniprot::Parser.extend do
|
39
|
+
|
40
|
+
before do
|
41
|
+
{}
|
42
|
+
end
|
43
|
+
|
44
|
+
finish_entry do |protein, container|
|
45
|
+
if container[protein.species].nil?
|
46
|
+
container[protein.species] = []
|
47
|
+
end
|
48
|
+
container[protein.species] << protein
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
if $0 == __FILE__
|
56
|
+
|
57
|
+
filename = ARGV.shift
|
58
|
+
|
59
|
+
result = Uniprot::SpeciesParser.parse_file( filename )
|
60
|
+
|
61
|
+
result.each do |species, ary|
|
62
|
+
puts "#{species} => #{ary.map{ |p| p.id }.join(', ')}"
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
Feature: Parser Extension
|
2
|
+
I can extend existing parser
|
3
|
+
And replace existing rules
|
4
|
+
|
5
|
+
Background:
|
6
|
+
Given input data
|
7
|
+
"""
|
8
|
+
XX a1
|
9
|
+
YY b1
|
10
|
+
c1
|
11
|
+
//
|
12
|
+
XX a1
|
13
|
+
YY b2
|
14
|
+
c2
|
15
|
+
//
|
16
|
+
"""
|
17
|
+
|
18
|
+
Scenario: Extension without redefinition
|
19
|
+
Given a simple parser
|
20
|
+
When I extend it
|
21
|
+
Then the extended parser should parse it as the original one
|
22
|
+
|
23
|
+
Scenario: With replacing separator
|
24
|
+
Given a simple parser
|
25
|
+
When I extend it
|
26
|
+
And I replace with("XX") to return always 'foo'
|
27
|
+
And I replace with("YY") to do nothing
|
28
|
+
Then the parser should return "[{ 'XX' => 'foo'}, { 'XX' => 'foo'}]"
|
29
|
+
|
30
|
+
Scenario: Text after replacing
|
31
|
+
Given a simple parser
|
32
|
+
When I extend it
|
33
|
+
And I replace with("XX") to do nothing
|
34
|
+
And I replace with("YY") to return always 'bar'
|
35
|
+
And I replace with_text_after("YY") to return always 'foo'
|
36
|
+
Then the parser should return "[{ 'YY' => 'bar', 'txt-YY' => 'foo'}, { 'YY' => 'bar', 'txt-YY' => 'foo'}]"
|
37
|
+
|
38
|
+
Scenario:
|
39
|
+
Given a simple parser
|
40
|
+
And input data
|
41
|
+
"""
|
42
|
+
XX a1
|
43
|
+
YY b1
|
44
|
+
c1
|
45
|
+
%
|
46
|
+
XX a1
|
47
|
+
YY b2
|
48
|
+
c2
|
49
|
+
%
|
50
|
+
"""
|
51
|
+
When I extend it
|
52
|
+
And I set the separator to '%'
|
53
|
+
Then the parser should return '2' entries
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'lib/swissparser'
|
2
|
+
require 'spec/expectations'
|
3
|
+
|
4
|
+
|
5
|
+
Given /^a simple parser$/ do
|
6
|
+
@simple_parser = Swiss::Parser.define do
|
7
|
+
rules do
|
8
|
+
with("XX") {|c,e| e["XX"] = c}
|
9
|
+
with("YY") {|c,e| e["YY"] = c}
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
Given /^input data$/ do |string|
|
15
|
+
@data = string
|
16
|
+
end
|
17
|
+
|
18
|
+
When /^I extend it$/ do
|
19
|
+
@ext_parser = @simple_parser.extend {}
|
20
|
+
end
|
21
|
+
|
22
|
+
When /^I replace with\("([^\"]*)"\) to return always '([^\']*)'$/ do |key,out|
|
23
|
+
@ext_parser = @ext_parser.extend do
|
24
|
+
rules do
|
25
|
+
with( key ) {|c,e| e[key] = out }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
When /^I replace with\("([^\"]*)"\) to do nothing$/ do |key|
|
31
|
+
@ext_parser = @ext_parser.extend do
|
32
|
+
rules do
|
33
|
+
with( key ) {|c,e| }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
When /^I replace with_text_after\("([^\"]*)"\) to return always '([^\']*)'$/ do |key,out|
|
39
|
+
text_key = "txt-#{key}"
|
40
|
+
@ext_parser = @ext_parser.extend do
|
41
|
+
rules do
|
42
|
+
with_text_after( key ) {|c,e| e[text_key] = out }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
When /^I set the separator to '([^\']*)'$/ do |sep|
|
48
|
+
@ext_parser = @ext_parser.extend do
|
49
|
+
rules do
|
50
|
+
set_separator( sep )
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
When /^I define '([^\']*)' helper$/ do |name|
|
56
|
+
@ext_parser = @ext_parser.extend do
|
57
|
+
helper(name.to_sym) do
|
58
|
+
name
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
When /^I call '([^\']*)' helper in after action$/ do |name|
|
64
|
+
l = eval("lambda { |x| #{name} }")
|
65
|
+
@ext_parser = @ext_parser.extend do
|
66
|
+
after(&l)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
When /^I return param "([^\"]*)" in after action$/ do |name|
|
71
|
+
l = eval("lambda { |x| param(#{name}) }")
|
72
|
+
@ext_parser = @ext_parser.extend do
|
73
|
+
after(&l)
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
When /^I call parse with param "([^\"]*)" equal to "([^\"]*)"$/ do |key, val|
|
79
|
+
@result = @ext_parser.parse(@data, key => val)
|
80
|
+
end
|
81
|
+
|
82
|
+
Then /^the result should be "([^\"]*)"$/ do |val|
|
83
|
+
@result.should == val
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
Then /^the parser should return '([^\']*)'$/ do |val|
|
88
|
+
@ext_parser.parse( @data ).should == val
|
89
|
+
end
|
90
|
+
|
91
|
+
Then /^the parser should return '(\d*)' entries$/ do |num|
|
92
|
+
@ext_parser.parse( @data ).size.should == num.to_i
|
93
|
+
end
|
94
|
+
|
95
|
+
Then /^the extended parser should parse it as the original one$/ do
|
96
|
+
@simple_parser.parse( @data ).should == @ext_parser.parse( @data )
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
Then /^the parser should return "([^\"]*)"$/ do |ruby_exp|
|
101
|
+
result = eval(ruby_exp)
|
102
|
+
@ext_parser.parse( @data ).should == result
|
103
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
Feature: User Friendly
|
2
|
+
SwissParser is nice to use.
|
3
|
+
|
4
|
+
Background:
|
5
|
+
Given input data
|
6
|
+
"""
|
7
|
+
XX a1
|
8
|
+
YY b1
|
9
|
+
c1
|
10
|
+
//
|
11
|
+
XX a1
|
12
|
+
YY b2
|
13
|
+
c2
|
14
|
+
//
|
15
|
+
"""
|
16
|
+
|
17
|
+
Scenario: Helper Method
|
18
|
+
Given a simple parser
|
19
|
+
When I extend it
|
20
|
+
And I define 'foo' helper
|
21
|
+
And I call 'foo' helper in after action
|
22
|
+
Then the parser should return 'foo'
|
23
|
+
|
24
|
+
Scenario: Helper Method
|
25
|
+
Given a simple parser
|
26
|
+
When I extend it
|
27
|
+
And I return param "foo" in after action
|
28
|
+
And I call parse with param "foo" equal to "bar"
|
29
|
+
Then the result should be "bar"
|
data/lib/swissparser.rb
CHANGED
@@ -21,7 +21,7 @@ require 'open-uri'
|
|
21
21
|
|
22
22
|
module Swiss
|
23
23
|
|
24
|
-
VERSION = "0.
|
24
|
+
VERSION = "0.10.0"
|
25
25
|
|
26
26
|
# This class defines parsing rules. Its methods
|
27
27
|
# are accessible within the +rules+ section of
|
@@ -186,14 +186,15 @@ module Swiss
|
|
186
186
|
next
|
187
187
|
end
|
188
188
|
@actions[k] = v
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
189
|
+
end
|
190
|
+
r.actions[:text].each do |k,v|
|
191
|
+
@actions[:text][k] = v
|
192
|
+
end
|
193
|
+
if r.separator
|
194
|
+
@separator = r.separator
|
195
195
|
end
|
196
196
|
end
|
197
|
+
|
197
198
|
|
198
199
|
|
199
200
|
|
@@ -234,10 +235,14 @@ module Swiss
|
|
234
235
|
parse( file, params )
|
235
236
|
end
|
236
237
|
end
|
237
|
-
|
238
|
-
private
|
239
238
|
|
240
|
-
|
239
|
+
# Parses any input that accepts the +each_line+ method. Works for
|
240
|
+
# string, open files, etc. An optional hash of arbitrary arguments
|
241
|
+
# (+params+) can be specified. It is passed to the workflow
|
242
|
+
# methods blocks (+before+, +new_entry+, ...) It returns the
|
243
|
+
# value specified in the +after+ block. By default, it returns an
|
244
|
+
# array containing _entry_ objects.
|
245
|
+
def parse( data, params={} )
|
241
246
|
@ctx = ParsingContext.new( params )
|
242
247
|
helperModule = Module.new
|
243
248
|
@helpers.each do |name, proc|
|
@@ -246,7 +251,7 @@ module Swiss
|
|
246
251
|
@ctx.extend( helperModule )
|
247
252
|
container = @ctx.instance_exec( &@before )
|
248
253
|
entry = @ctx.instance_exec( &@begin )
|
249
|
-
|
254
|
+
data.each_line do |line|
|
250
255
|
state = parse_line( line, entry )
|
251
256
|
if state == :end
|
252
257
|
@ctx.instance_exec( entry, container, &@end )
|
@@ -256,6 +261,8 @@ module Swiss
|
|
256
261
|
@ctx.instance_exec( container, &@after )
|
257
262
|
end
|
258
263
|
|
264
|
+
private
|
265
|
+
|
259
266
|
PROTOTYPE = Parser.new
|
260
267
|
PROTOTYPE.instance_eval do
|
261
268
|
before { || [] }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swissparser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- paradigmatic
|
@@ -9,9 +9,19 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-11-
|
12
|
+
date: 2009-11-15 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: cucumber
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0.4"
|
24
|
+
version:
|
15
25
|
- !ruby/object:Gem::Dependency
|
16
26
|
name: bones
|
17
27
|
type: :development
|
@@ -44,7 +54,11 @@ files:
|
|
44
54
|
- examples/parse_from_uri.rb
|
45
55
|
- examples/signal_demo.rb
|
46
56
|
- examples/tutorial_1.rb
|
57
|
+
- examples/tutorial_2.rb
|
47
58
|
- examples/uniprot_param_demo.rb
|
59
|
+
- features/parser_extension.feature
|
60
|
+
- features/step_definitions/steps.rb
|
61
|
+
- features/user_friendly.feature
|
48
62
|
- lib/swiss_parser.rb
|
49
63
|
- lib/swissparser.rb
|
50
64
|
has_rdoc: true
|