sax-machine 0.2.0.rc1 → 0.2.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.
@@ -1,9 +1,12 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.8.7
4
3
  - 1.9.2
5
4
  - 1.9.3
6
- - rbx-18mode
5
+ - 2.0.0
6
+ - ruby-head
7
+ - jruby-19mode
8
+ - jruby-head
7
9
  - rbx-19mode
8
- notifications:
9
- irc: "irc.freenode.org#sax-machine"
10
+ matrix:
11
+ allow_failures:
12
+ - rvm: ruby-head
data/Gemfile CHANGED
@@ -5,6 +5,5 @@ gemspec
5
5
  group :development, :test do
6
6
  gem 'rake'
7
7
  gem 'guard-rspec'
8
- gem 'growl', :require => false
9
8
  gem 'simplecov', :require => false, :platforms => :mri_19
10
9
  end
@@ -20,11 +20,11 @@ module SAXMachine
20
20
  end
21
21
 
22
22
  def value_from_attrs(attrs)
23
- attrs.index(@name) ? attrs[attrs.index(@name) + 1] : nil
23
+ attrs.fetch(@name, nil)
24
24
  end
25
25
 
26
26
  def attrs_match?(attrs)
27
- attrs.index(@name) ? true : false
27
+ attrs.key?(@name) || attrs.value?(@name)
28
28
  end
29
29
 
30
30
  def has_value_and_attrs_match?(attrs)
@@ -37,4 +37,4 @@ module SAXMachine
37
37
  end
38
38
 
39
39
  end
40
- end
40
+ end
@@ -5,16 +5,10 @@ module SAXMachine
5
5
  attr_reader :name
6
6
 
7
7
  def initialize(name, options)
8
- @name = name.to_s
9
- @class = options[:class]
10
- @as = options[:as].to_s
11
-
12
- if options.has_key?(:with)
13
- # for faster comparisons later
14
- @with = options[:with].to_a.flatten.collect {|o| o.to_s}
15
- else
16
- @with = nil
17
- end
8
+ @name = name.to_s
9
+ @class = options[:class]
10
+ @as = options[:as].to_s
11
+ @with = options.fetch(:with, {})
18
12
  end
19
13
 
20
14
  def accessor
@@ -22,10 +16,8 @@ module SAXMachine
22
16
  end
23
17
 
24
18
  def attrs_match?(attrs)
25
- if @with
26
- @with == (@with & attrs)
27
- else
28
- true
19
+ @with.all? do |key, value|
20
+ value === attrs[key.to_s]
29
21
  end
30
22
  end
31
23
 
@@ -42,4 +34,4 @@ module SAXMachine
42
34
  end
43
35
 
44
36
  end
45
- end
37
+ end
@@ -3,16 +3,27 @@ require "nokogiri"
3
3
  module SAXMachine
4
4
 
5
5
  def self.included(base)
6
+ base.send(:include, InstanceMethods)
6
7
  base.extend ClassMethods
7
8
  end
8
9
 
9
10
  def parse(xml_text, on_error = nil, on_warning = nil)
10
11
  sax_handler = SAXHandler.new(self, on_error, on_warning)
11
12
  parser = Nokogiri::XML::SAX::Parser.new(sax_handler)
12
- parser.parse(xml_text)
13
+ parser.parse(xml_text) do |ctx|
14
+ ctx.replace_entities = true
15
+ end
13
16
  self
14
17
  end
15
18
 
19
+ module InstanceMethods
20
+ def initialize(attributes = {})
21
+ attributes.each do |name, value|
22
+ send("#{name}=", value)
23
+ end
24
+ end
25
+ end
26
+
16
27
  module ClassMethods
17
28
 
18
29
  def inherited(subclass)
@@ -6,14 +6,8 @@ module SAXMachine
6
6
 
7
7
  def initialize(name, options)
8
8
  @name = name.to_s
9
-
10
- if options.has_key?(:with)
11
- # for faster comparisons later
12
- @with = options[:with].to_a.flatten.collect {|o| o.to_s}
13
- else
14
- @with = nil
15
- end
16
-
9
+ @with = options.fetch(:with, {})
10
+
17
11
  if options.has_key?(:value)
18
12
  @value = options[:value].to_s
19
13
  else
@@ -49,14 +43,12 @@ module SAXMachine
49
43
  end
50
44
 
51
45
  def value_from_attrs(attrs)
52
- attrs.index(@value) ? attrs[attrs.index(@value) + 1] : nil
46
+ attrs.fetch(@value, nil)
53
47
  end
54
48
 
55
49
  def attrs_match?(attrs)
56
- if @with
57
- @with == (@with & attrs)
58
- else
59
- true
50
+ @with.all? do |key, value|
51
+ value === attrs[key.to_s]
60
52
  end
61
53
  end
62
54
 
@@ -32,7 +32,6 @@ module SAXMachine
32
32
  alias cdata_block characters
33
33
 
34
34
  def start_element(name, attrs = [])
35
- attrs.flatten!
36
35
 
37
36
  name = normalize_name(name)
38
37
  node = stack.last
@@ -41,6 +40,8 @@ module SAXMachine
41
40
  sax_config = sax_config_for(object)
42
41
 
43
42
  if sax_config
43
+ attrs = Hash[attrs]
44
+
44
45
  if collection_config = sax_config.collection_config(name, attrs)
45
46
  object = collection_config.data_class.new
46
47
  sax_config = sax_config_for(object)
@@ -1,3 +1,3 @@
1
1
  module SAXMachine
2
- VERSION = "0.2.0.rc1"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -6,18 +6,19 @@ Gem::Specification.new do |s|
6
6
  s.version = SAXMachine::VERSION
7
7
 
8
8
  s.authors = ["Paul Dix", "Julien Kirch", "Ezekiel Templin"]
9
- s.date = Date.today
10
9
  s.email = %q{paul@pauldix.net}
11
10
  s.homepage = %q{http://github.com/pauldix/sax-machine}
12
11
 
13
12
  s.summary = %q{Declarative SAX Parsing with Nokogiri}
14
13
 
14
+ s.license = %q{MIT}
15
+
15
16
  s.files = `git ls-files`.split("\n")
16
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
18
  s.require_paths = ["lib"]
18
19
 
19
20
  s.platform = Gem::Platform::RUBY
20
21
 
21
- s.add_dependency 'nokogiri', "~> 1.5.2"
22
- s.add_development_dependency "rspec", "~> 2.10.0"
23
- end
22
+ s.add_dependency 'nokogiri', "~> 1.6.0"
23
+ s.add_development_dependency "rspec", "~> 2.13.0"
24
+ end
@@ -9,7 +9,7 @@
9
9
  <generator uri="http://www.typepad.com/">TypePad</generator>
10
10
  <link rel="self" href="http://feeds.feedburner.com/PaulDixExplainsNothing" type="application/atom+xml" /><entry>
11
11
  <title>Marshal data too short error with ActiveRecord</title>
12
- <link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulDixExplainsNothing/~3/383536354/marshal-data-to.html" />
12
+ <link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulDixExplainsNothing/~3/383536354/marshal-data-to.html?param1=1&amp;param2=2" />
13
13
  <link rel="replies" type="text/html" href="http://www.pauldix.net/2008/09/marshal-data-to.html" thr:count="2" thr:updated="2008-11-17T14:40:06-05:00" />
14
14
  <id>tag:typepad.com,2003:post-55147740</id>
15
15
  <published>2008-09-04T16:07:19-04:00</published>
@@ -38,7 +38,7 @@
38
38
  &lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulDixExplainsNothing/~4/383536354" height="1" width="1"/&gt;</content>
39
39
 
40
40
 
41
- <feedburner:origLink>http://www.pauldix.net/2008/09/marshal-data-to.html</feedburner:origLink></entry>
41
+ <feedburner:origLink>http://www.pauldix.net/2008/09/marshal-data-to.html?param1=1&amp;param2=2</feedburner:origLink></entry>
42
42
  <entry>
43
43
  <title>Serializing data speed comparison: Marshal vs. JSON vs. Eval vs. YAML</title>
44
44
  <link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/PaulDixExplainsNothing/~3/376401099/serializing-dat.html" />
@@ -10,6 +10,11 @@ describe "SAXMachine" do
10
10
  end
11
11
  end
12
12
 
13
+ it "should provide mass assignment through initialize method" do
14
+ document = @klass.new(title: 'Title')
15
+ document.title.should == 'Title'
16
+ end
17
+
13
18
  it "should provide an accessor" do
14
19
  document = @klass.new
15
20
  document.title = "Title"
@@ -54,7 +59,7 @@ describe "SAXMachine" do
54
59
  element :date, :class => DateTime
55
60
  end
56
61
  @document = @klass.new
57
- @document.date = DateTime.now.to_s
62
+ @document.date = Time.now.iso8601
58
63
  end
59
64
  it "should be available" do
60
65
  @klass.data_class(:date).should == DateTime
@@ -306,6 +311,35 @@ describe "SAXMachine" do
306
311
  document.second.should == "second match"
307
312
  end
308
313
  end
314
+
315
+ describe "with only one element as a regular expression" do
316
+ before :each do
317
+ @klass = Class.new do
318
+ include SAXMachine
319
+ element :link, :with => {:foo => /ar$/}
320
+ end
321
+ end
322
+
323
+ it "should save the text of an element that has matching attributes" do
324
+ document = @klass.parse("<link foo=\"bar\">match</link>")
325
+ document.link.should == "match"
326
+ end
327
+
328
+ it "should not save the text of an element that doesn't have matching attributes" do
329
+ document = @klass.parse("<link>no match</link>")
330
+ document.link.should be_nil
331
+ end
332
+
333
+ it "should save the text of an element that has matching attributes when it is the second of that type" do
334
+ document = @klass.parse("<xml><link>no match</link><link foo=\"bar\">match</link></xml>")
335
+ document.link.should == "match"
336
+ end
337
+
338
+ it "should save the text of an element that has matching attributes plus a few more" do
339
+ document = @klass.parse("<xml><link>no match</link><link asdf='jkl' foo='bar'>match</link>")
340
+ document.link.should == "match"
341
+ end
342
+ end
309
343
  end # using the 'with' option
310
344
 
311
345
  describe "using the 'value' option" do
@@ -429,7 +463,7 @@ describe "SAXMachine" do
429
463
  @klass = Class.new do
430
464
  include SAXMachine
431
465
  elements :item, :as => :items, :with => {:type => 'Bar'}, :class => Bar
432
- elements :item, :as => :items, :with => {:type => 'Foo'}, :class => Foo
466
+ elements :item, :as => :items, :with => {:type => /Foo/}, :class => Foo
433
467
  end
434
468
  end
435
469
 
@@ -523,6 +557,7 @@ describe "SAXMachine" do
523
557
  element :title
524
558
  element :name, :as => :author
525
559
  element "feedburner:origLink", :as => :url
560
+ element :link, :as => :alternate, :value => :href, :with => {:type => "text/html", :rel => "alternate"}
526
561
  element :summary
527
562
  element :content
528
563
  element :published
@@ -541,6 +576,12 @@ describe "SAXMachine" do
541
576
  f = Atom.parse(@xml)
542
577
  f.url.should == "http://www.pauldix.net/"
543
578
  end
579
+
580
+ it "should parse entry url" do
581
+ f = Atom.parse(@xml)
582
+ f.entries.first.url.should == "http://www.pauldix.net/2008/09/marshal-data-to.html?param1=1&param2=2"
583
+ f.entries.first.alternate.should == "http://feeds.feedburner.com/~r/PaulDixExplainsNothing/~3/383536354/marshal-data-to.html?param1=1&param2=2"
584
+ end
544
585
  end
545
586
 
546
587
  describe "parsing a tree" do
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sax-machine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0.rc1
5
- prerelease: 6
4
+ version: 0.2.1
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Paul Dix
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-06-04 00:00:00.000000000 Z
14
+ date: 2013-10-14 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: nokogiri
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ~>
22
22
  - !ruby/object:Gem::Version
23
- version: 1.5.2
23
+ version: 1.6.0
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
@@ -28,7 +28,7 @@ dependencies:
28
28
  requirements:
29
29
  - - ~>
30
30
  - !ruby/object:Gem::Version
31
- version: 1.5.2
31
+ version: 1.6.0
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: rspec
34
34
  requirement: !ruby/object:Gem::Requirement
@@ -36,7 +36,7 @@ dependencies:
36
36
  requirements:
37
37
  - - ~>
38
38
  - !ruby/object:Gem::Version
39
- version: 2.10.0
39
+ version: 2.13.0
40
40
  type: :development
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
@@ -44,7 +44,7 @@ dependencies:
44
44
  requirements:
45
45
  - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: 2.10.0
47
+ version: 2.13.0
48
48
  description:
49
49
  email: paul@pauldix.net
50
50
  executables: []
@@ -80,7 +80,8 @@ files:
80
80
  - spec/sax-machine/sax_document_spec.rb
81
81
  - spec/spec_helper.rb
82
82
  homepage: http://github.com/pauldix/sax-machine
83
- licenses: []
83
+ licenses:
84
+ - MIT
84
85
  post_install_message:
85
86
  rdoc_options: []
86
87
  require_paths:
@@ -91,18 +92,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
91
92
  - - ! '>='
92
93
  - !ruby/object:Gem::Version
93
94
  version: '0'
94
- segments:
95
- - 0
96
- hash: 3574605312337356673
97
95
  required_rubygems_version: !ruby/object:Gem::Requirement
98
96
  none: false
99
97
  requirements:
100
- - - ! '>'
98
+ - - ! '>='
101
99
  - !ruby/object:Gem::Version
102
- version: 1.3.1
100
+ version: '0'
103
101
  requirements: []
104
102
  rubyforge_project:
105
- rubygems_version: 1.8.24
103
+ rubygems_version: 1.8.23
106
104
  signing_key:
107
105
  specification_version: 3
108
106
  summary: Declarative SAX Parsing with Nokogiri