microformat 0.0.1 → 0.0.2

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/.rvmrc ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env bash
2
+
3
+ if ! rvm list | grep -q ruby-1.9.3-p194 ; then
4
+ rvm install 1.9.3-p194
5
+ fi
6
+
7
+ rvm 1.9.3-p194@platformq_microformat --create
8
+
9
+ if ! gem list | grep -q bundler ; then
10
+ gem install --no-ri --no-rdoc bundler
11
+ bundle install --without production
12
+ fi
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
data/README.md CHANGED
@@ -1,12 +1,14 @@
1
1
  # Microformat
2
2
 
3
- TODO: Write a gem description
3
+ Reads Microformats from HTML documents
4
4
 
5
5
  ## Installation
6
6
 
7
7
  Add this line to your application's Gemfile:
8
8
 
9
- gem 'microformat'
9
+ ```ruby
10
+ gem "microformat"
11
+ ```
10
12
 
11
13
  And then execute:
12
14
 
@@ -18,7 +20,58 @@ Or install it yourself as:
18
20
 
19
21
  ## Usage
20
22
 
21
- TODO: Write usage instructions here
23
+ You can parse a document (or partial document), providing the HTML as a string:
24
+
25
+ ```ruby
26
+ html = "<html>...</html>"
27
+ Microformat.parse(html) # => Microformat::Collection
28
+ ```
29
+
30
+ Or provide a Nokogiri element:
31
+
32
+ ```ruby
33
+ require "nokogiri"
34
+
35
+ html = "<html>...</html>"
36
+ doc = Nokogiri::HTML(html)
37
+ element = doc.css(".hreview")
38
+ Microformat.parse(element)
39
+ # => Microformat::Collection
40
+ ```
41
+
42
+ Collections act as standard Ruby arrays, however they provide additional filtering methods:
43
+
44
+ ```ruby
45
+ collection = Microformat.parse(element)
46
+ # => Microformat::Collection (of all microformat objects)
47
+ collection.filter(Microformat::Review, Microformat::ReviewAggregate)
48
+ # => Microformat::Collection (of only hreviews and hreview-aggregates)
49
+ ```
50
+
51
+ You can also improve performance by passing a set of formats to the initial parse:
52
+
53
+ ```ruby
54
+ formats = [Microformat::Review, Microformat::Card]
55
+ Microformat.parse(element, filter: formats)
56
+ # => Microformat::Collection (of only hreviews and hcards)
57
+ ```
58
+
59
+ You can specify a limit (should you only want the first or a few objects)
60
+
61
+ ```ruby
62
+ Microformat.parse(element, limit: 3)
63
+ # => Microformat::Collection (of max size 3)
64
+ ```
65
+
66
+ You can also parse a Nokogiri element to return an object of the first found exact Microformat:
67
+
68
+ ```ruby
69
+ html = "<html>...</html>"
70
+ doc = Nokogiri::HTML(html)
71
+ element = doc.css(".hcard")
72
+ Microformat::Card.parse(element)
73
+ # => Microformat::Card instance
74
+ ```
22
75
 
23
76
  ## Contributing
24
77
 
data/Rakefile CHANGED
@@ -1,2 +1,13 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
+
4
+ require "rspec/core/rake_task"
5
+
6
+ desc "Runs all the specs"
7
+ task default: %w(spec)
8
+
9
+ desc "Run specs"
10
+ RSpec::Core::RakeTask.new do |t|
11
+ t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
12
+ # Put spec opts in a file named .rspec in root
13
+ end
@@ -0,0 +1,41 @@
1
+ require "microformat/attribute_map"
2
+
3
+ module Microformat
4
+ class Attribute
5
+ attr_reader :name, :options, :attributes
6
+
7
+ def initialize(name, options = {}, &block)
8
+ @name = name
9
+ @options = options
10
+ @attributes ||= {}
11
+ if options[:format]
12
+ @attributes.merge!(options[:format].attribute_definition.attributes)
13
+ end
14
+ block.yield(self) if block_given?
15
+ end
16
+
17
+ def attribute(name, options = {}, &block)
18
+ Attribute.new(name, options, &block).tap do |attribute|
19
+ @attributes.merge!(name.to_sym => attribute)
20
+ end
21
+ end
22
+
23
+ def read_from(document)
24
+ selector = options[:selector] || ".#{@name}"
25
+ sub_document = document.css(selector).first
26
+ value = read_value_from(sub_document)
27
+ AttributeMap.new(self, sub_document, { value: value })
28
+ end
29
+
30
+ def read_value_from(document)
31
+ Array(options[:attribute] || "text").each do |attr|
32
+ if attr == "text"
33
+ return document.text
34
+ elsif document[attr]
35
+ return document[attr]
36
+ end
37
+ end
38
+ return nil
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,23 @@
1
+ require "microformat/attribute"
2
+ require "microformat/attribute_map"
3
+
4
+ module Microformat
5
+ class AttributeDefinition
6
+ attr_reader :attributes
7
+
8
+ def initialize(&block)
9
+ @attributes ||= {}
10
+ block.yield(self)
11
+ end
12
+
13
+ def attribute(name, options = {}, &block)
14
+ Attribute.new(name, options, &block).tap do |attribute|
15
+ @attributes.merge!(name.to_sym => attribute)
16
+ end
17
+ end
18
+
19
+ def map_to(document)
20
+ AttributeMap.new(self, document)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,40 @@
1
+ module Microformat
2
+ class AttributeMap
3
+ attr_reader :definition, :document
4
+
5
+ def initialize(definition, document, values = {})
6
+ @definition = definition
7
+ @document = document
8
+ @values = values
9
+ @attribute_cache = {}
10
+ end
11
+
12
+ def respond_to_missing?(name, public_only = false)
13
+ values_responds_to?(name) ||
14
+ definition_responds_to?(name)
15
+ end
16
+
17
+ def method_missing(name, *args, &block)
18
+ if values_responds_to?(name)
19
+ @values.fetch(name.to_sym)
20
+ elsif @attribute_cache.has_key?(name)
21
+ @attribute_cache[name]
22
+ elsif definition_responds_to?(name)
23
+ attribute = @definition.attributes.fetch(name)
24
+ value = attribute.read_from(document)
25
+ @attribute_cache[name] = value
26
+ else
27
+ super(name)
28
+ end
29
+ end
30
+
31
+ private
32
+ def values_responds_to?(name)
33
+ @values.has_key?(name.to_sym)
34
+ end
35
+
36
+ def definition_responds_to?(name)
37
+ @definition.attributes.has_key?(name.to_sym)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,34 @@
1
+ require "microformat/format"
2
+
3
+ module Microformat
4
+ class Card < Format
5
+ selector ".vcard"
6
+
7
+ attribute_definition do |root|
8
+ root.attribute(:fn, required: true)
9
+ root.attribute(:n) do |n|
10
+ n.attribute(:"honorific-prefix")
11
+ n.attribute(:"given-name")
12
+ n.attribute(:"additional-name")
13
+ n.attribute(:"family-name")
14
+ n.attribute(:"honorific-suffix")
15
+ end
16
+ root.attribute(:nickname)
17
+ root.attribute(:org)
18
+ root.attribute(:photo, cast: :url, attribute: ["href", "src"])
19
+ root.attribute(:url, cast: :url, attribute: "href")
20
+ root.attribute(:email, cast: :email)
21
+ root.attribute(:tel, cast: :tel)
22
+ root.attribute(:adr) do |adr|
23
+ adr.attribute(:"street-address")
24
+ adr.attribute(:locality)
25
+ adr.attribute(:region)
26
+ adr.attribute(:"postal-code")
27
+ adr.attribute(:"country-name")
28
+ end
29
+ root.attribute(:"bday")
30
+ root.attribute(:"category")
31
+ root.attribute(:"note")
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ require "microformat/selectors"
2
+
3
+ module Microformat
4
+ class Collection < ::Array
5
+ def <<(element)
6
+ # load the first matching format
7
+ format = Selectors.class_matching(element)
8
+ # use the microformat to parse the element
9
+ parsed = format.parse(element)
10
+ # add the parsed object to the array
11
+ super(parsed)
12
+ end
13
+
14
+ def filter(*args)
15
+ classes = Array(args).flatten
16
+ # find the applicable classes
17
+ filtered = select do |object|
18
+ Array(classes).include?(object.class)
19
+ end
20
+ # create a new collection from them
21
+ self.class.new.tap do |collection|
22
+ collection.replace(filtered)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,48 @@
1
+ require "microformat/attribute_definition"
2
+ require "microformat/selectors"
3
+
4
+ module Microformat
5
+ class Format
6
+ def self.selector(selector = nil)
7
+ define_selector(selector) if selector
8
+ @selector
9
+ end
10
+
11
+ def self.attribute_definition(&block)
12
+ @attribute_definition = AttributeDefinition.new(&block) if block_given?
13
+ @attribute_definition
14
+ end
15
+
16
+ def self.parse(document)
17
+ new(document)
18
+ end
19
+
20
+ attr_reader :document
21
+
22
+ def initialize(document)
23
+ @document = document
24
+ end
25
+
26
+ def respond_to_missing?(name, public_only = false)
27
+ attribute_map.respond_to?(name)
28
+ end
29
+
30
+ def method_missing(name)
31
+ if attribute_map.respond_to?(name)
32
+ attribute_map.send(name)
33
+ else
34
+ super(name)
35
+ end
36
+ end
37
+
38
+ private
39
+ def attribute_map
40
+ @attribute_map ||= self.class.attribute_definition.map_to(document)
41
+ end
42
+
43
+ def self.define_selector(selector)
44
+ Selectors.define(selector, self)
45
+ @selector = selector
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,48 @@
1
+ require "nokogiri"
2
+ require "microformat/collection"
3
+ require "microformat/selectors"
4
+
5
+ module Microformat
6
+ class Parser
7
+ def self.parse(doc, options = {})
8
+ # ensure the document is parsed
9
+ unless doc.respond_to?(:css)
10
+ doc = Nokogiri::HTML(doc)
11
+ end
12
+ # return the collection
13
+ new(doc, options).collection
14
+ end
15
+
16
+ attr_reader :doc, :options
17
+
18
+ def initialize(doc, options)
19
+ @doc = doc
20
+ @options = options
21
+ parse(elements)
22
+ end
23
+
24
+ def parse(elements)
25
+ i = 0; while i < [limit, elements.size].min do
26
+ collection << elements[i]
27
+ i += 1
28
+ end
29
+ end
30
+
31
+ def limit
32
+ @limit ||= options[:limit] || Float::INFINITY
33
+ end
34
+
35
+ def selectors
36
+ @selectors ||= Selectors.filter(options[:filter])
37
+ end
38
+
39
+ def collection
40
+ @collection ||= Collection.new
41
+ end
42
+
43
+ private
44
+ def elements
45
+ @elements ||= doc.css(selectors.join(", "))
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,19 @@
1
+ require "microformat/format"
2
+ require "microformat/card"
3
+
4
+ module Microformat
5
+ class Review < Format
6
+ selector ".hreview"
7
+
8
+ attribute_definition do |root|
9
+ root.attribute(:summary)
10
+ root.attribute(:type)
11
+ root.attribute(:item, format: Card)
12
+ root.attribute(:reviewer, format: Card)
13
+ root.attribute(:rating, cast: :decimal)
14
+ root.attribute(:description)
15
+ root.attribute(:tags, multiple: true, selector: "[rel='tag']")
16
+ root.attribute(:permalink, selector: "[rel='bookmark']", attribute: "href")
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,45 @@
1
+ require "singleton"
2
+
3
+ module Microformat
4
+ class Selectors < Hash
5
+ include Singleton
6
+
7
+ def self.class_matching(element)
8
+ # load the CSS classes of the element
9
+ css_classes = element["class"].split(/\s+/).map do |c|
10
+ ".#{c}"
11
+ end
12
+ # loop through the classes
13
+ Array(css_classes).each do |css_class|
14
+ instance.each do |selector, klass|
15
+ if selector == css_class
16
+ return klass
17
+ end
18
+ end
19
+ end
20
+ raise RuntimeError, "No class is defined for any of the selectors: #{css_classes.join(" / ")}"
21
+ end
22
+
23
+ def self.define(selector, klass)
24
+ if instance.has_key?(selector) && instance.fetch(selector) != klass
25
+ raise ArgumentError, "#{instance.fetch(selector).name} has already implemented the selector '#{selector}'"
26
+ else
27
+ instance.merge!(selector => klass)
28
+ end
29
+ end
30
+
31
+ def self.filter(klasses = nil)
32
+ if klasses
33
+ instance.filter(Array(klasses))
34
+ else
35
+ instance.keys
36
+ end
37
+ end
38
+
39
+ def filter(klasses)
40
+ select do |selector, klass|
41
+ Array(klasses).include?(klass)
42
+ end.keys
43
+ end
44
+ end
45
+ end
@@ -1,3 +1,3 @@
1
1
  module Microformat
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/microformat.rb CHANGED
@@ -1,5 +1,10 @@
1
1
  require "microformat/version"
2
+ require "microformat/parser"
3
+ require "microformat/review"
4
+ require "microformat/card"
2
5
 
3
6
  module Microformat
4
- # Your code goes here...
5
- end
7
+ def self.parse(*args)
8
+ Parser.parse(*args)
9
+ end
10
+ end
data/microformat.gemspec CHANGED
@@ -1,17 +1,26 @@
1
1
  # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/microformat/version', __FILE__)
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
4
 
4
- Gem::Specification.new do |gem|
5
- gem.authors = ["Ryan Townsend"]
6
- gem.email = ["ryan@ryantownsend.co.uk"]
7
- gem.description = %q{Reads Microformats from HTML documents}
8
- gem.summary = gem.description
9
- gem.homepage = "https://github.com/platformq/microformat"
5
+ require "microformat/version"
10
6
 
11
- gem.files = `git ls-files`.split($\)
12
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
- gem.name = "microformat"
15
- gem.require_paths = ["lib"]
16
- gem.version = Microformat::VERSION
7
+ Gem::Specification.new do |s|
8
+ s.authors = ["Ryan Townsend"]
9
+ s.email = ["ryan@ryantownsend.co.uk"]
10
+ s.description = %q{Reads Microformats from HTML documents}
11
+ s.summary = s.description
12
+ s.homepage = "https://github.com/platformq/microformat"
13
+
14
+ s.files = `git ls-files`.split($\)
15
+ s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
17
+ s.name = "microformat"
18
+ s.require_paths = ["lib"]
19
+ s.version = Microformat::VERSION
20
+
21
+ # gems
22
+ s.add_dependency "nokogiri"
23
+ s.add_development_dependency "rake"
24
+ s.add_development_dependency "rspec"
25
+ s.add_development_dependency "simplecov"
17
26
  end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe Microformat::AttributeDefinition do
4
+ subject { Microformat::AttributeDefinition }
5
+
6
+ describe "#initialize" do
7
+ it "should accept a block of nested attributes" do
8
+ map = subject.new do |map|
9
+ map.attribute(:one)
10
+ map.attribute(:two)
11
+ end
12
+
13
+ expect(map.attributes.size).to eq(2)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ describe Microformat::Attribute do
4
+ subject { Microformat::Attribute }
5
+
6
+ describe "#initialize" do
7
+ it "should accept a block of nested attributes" do
8
+ attribute = subject.new(:name) do |attr|
9
+ attr.attribute(:one)
10
+ attr.attribute(:two)
11
+ attr.attribute(:three) do |three|
12
+ three.attribute(:four)
13
+ end
14
+ end
15
+
16
+ expect(attribute.attributes.size).to eq(3)
17
+ end
18
+
19
+ it "should set the name" do
20
+ expect(subject.new(:fn).name).to eq(:fn)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe Microformat::Collection do
4
+ subject do
5
+ Microformat::Collection.new
6
+ end
7
+
8
+ describe "#<<" do
9
+ it "should parse the element to the collection" do
10
+ selector = ".selector"
11
+ source = %Q(<html><body>
12
+ <div class="#{selector.gsub(/^\./, "")}"></div>
13
+ </body></html>)
14
+ element = Nokogiri::HTML(source).css(selector).first
15
+ parsed = mock("parsed_object")
16
+ format = mock("format")
17
+ format.should_receive(:parse).and_return(parsed)
18
+ Microformat::Selectors.define(selector, format)
19
+ subject << element
20
+ expect(subject).to include parsed
21
+ end
22
+ end
23
+
24
+ describe "#filter" do
25
+ it "should filter the collection down to the specific classes" do
26
+ objects = [Object.new, Hash.new, Array.new]
27
+ subject.replace(objects)
28
+ expect(subject.filter(Hash)).to eq [objects[1]]
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,46 @@
1
+ require "spec_helper"
2
+
3
+ module Microformat
4
+ class TestFormat < Microformat::Format; end
5
+ end
6
+
7
+ describe Microformat::Format do
8
+ after(:each) do
9
+ Microformat::Selectors.instance.replace({})
10
+ end
11
+
12
+ describe "::selector" do
13
+ describe "getting the value" do
14
+ it "should return the value" do
15
+ Microformat::TestFormat.selector ".review"
16
+ expect(Microformat::TestFormat.selector).to eq ".review"
17
+ end
18
+ end
19
+
20
+ describe "setting the value" do
21
+ it "should define the selector" do
22
+ Microformat::TestFormat.selector ".review2"
23
+ expect(Microformat::Selectors.instance[".review2"]).to eq Microformat::TestFormat
24
+ end
25
+ end
26
+ end
27
+
28
+ describe "::attribute_definition" do
29
+ describe "setting the value" do
30
+ it "should accept a block and set the map correctly" do
31
+ map = Microformat::TestFormat.attribute_definition do |attr|
32
+ attr.attribute :name
33
+ end
34
+ expect(map.attributes.values.first.name).to eq :name
35
+ end
36
+ end
37
+ end
38
+
39
+ describe "::parse" do
40
+ it "should return and instance of the format using the given document" do
41
+ html = %Q(<html><body>Something</body></html>)
42
+ doc = Nokogiri::HTML(html)
43
+ expect(Microformat::TestFormat.parse(doc).document).to eq doc
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,83 @@
1
+ require "spec_helper"
2
+ require "nokogiri"
3
+
4
+ describe Microformat::Parser do
5
+ describe "::parse" do
6
+ subject do
7
+ Microformat::Parser.parse(doc)
8
+ end
9
+
10
+ before(:each) do
11
+ Microformat::Selectors.instance.replace({})
12
+ [
13
+ Microformat::Card,
14
+ Microformat::Review
15
+ ].each { |klass| klass.selector(klass.selector) }
16
+ end
17
+
18
+ let(:html) do
19
+ %Q(<html><body></body></html>)
20
+ end
21
+
22
+ let(:review_html) do
23
+ %Q(<html><body>
24
+ <div class="hreview">
25
+ <div class="summary">It's good</div>
26
+ <div class="reviewer">
27
+ <p class="fn">Dave</p>
28
+ </div>
29
+ </div>
30
+ </body></html>)
31
+ end
32
+
33
+ context "given a HTML string" do
34
+ let(:doc) { html }
35
+
36
+ it "should return an instance of Microformat::Collection" do
37
+ expect(subject).to be_kind_of Microformat::Collection
38
+ end
39
+ end
40
+
41
+ context "given a HTML document" do
42
+ let(:doc) { Nokogiri::HTML(html) }
43
+
44
+ it "should return an instance of Microformat::Collection" do
45
+ expect(subject).to be_kind_of Microformat::Collection
46
+ end
47
+ end
48
+
49
+ context "given a HTML element" do
50
+ let(:doc) { Nokogiri::HTML(html).css("body") }
51
+
52
+ it "should return an instance of Microformat::Collection" do
53
+ expect(subject).to be_kind_of Microformat::Collection
54
+ end
55
+ end
56
+
57
+ context "given a HTML document with a hReview" do
58
+ let(:doc) { Nokogiri::HTML(review_html) }
59
+
60
+ it "should return a collection with one object" do
61
+ expect(subject.size).to eq 1
62
+ end
63
+
64
+ describe "the returned Microformat object" do
65
+ subject do
66
+ Microformat::Parser.parse(doc).first
67
+ end
68
+
69
+ it "should be a Microformat::Review" do
70
+ expect(subject).to be_kind_of(Microformat::Review)
71
+ end
72
+
73
+ it "should return the summary" do
74
+ expect(subject.summary.value).to eq "It's good"
75
+ end
76
+
77
+ it "should return the reviewer's full name" do
78
+ expect(subject.reviewer.fn.value).to eq "Dave"
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,92 @@
1
+ require "spec_helper"
2
+
3
+ describe Microformat::Selectors do
4
+ let(:selectors) { Hash.new }
5
+
6
+ subject do
7
+ Microformat::Selectors.instance
8
+ end
9
+
10
+ before(:each) do
11
+ selectors.each do |sel,klass|
12
+ Microformat::Selectors.define(sel, klass)
13
+ end
14
+ end
15
+
16
+ after(:each) do
17
+ Microformat::Selectors.instance.replace({})
18
+ end
19
+
20
+ describe "::instance" do
21
+ it "should always return the same object" do
22
+ expect(subject.class.instance.object_id).to eq subject.class.instance.object_id
23
+ end
24
+ end
25
+
26
+ describe "::define" do
27
+ context "when the selector is already defined" do
28
+ it "should raise an exception" do
29
+ subject.class.define(".hello", Hash)
30
+ expect {
31
+ subject.class.define(".hello", Object)
32
+ }.to raise_error(ArgumentError)
33
+ end
34
+ end
35
+
36
+ context "when redefining the selector" do
37
+ it "should not raise an exception" do
38
+ subject.class.define(".hello", Hash)
39
+ expect {
40
+ subject.class.define(".hello", Hash)
41
+ }.not_to raise_error(ArgumentError)
42
+ end
43
+ end
44
+
45
+ context "when the selector is not defined" do
46
+ it "should add the definition to the hash" do
47
+ subject.class.define(".hello", Hash)
48
+ expect(subject[".hello"]).to eq Hash
49
+ end
50
+ end
51
+ end
52
+
53
+ describe "::class_matching" do
54
+ let(:selectors) do
55
+ {
56
+ ".review" => Object,
57
+ ".card" => Hash
58
+ }
59
+ end
60
+
61
+ it "should return the first class that matches the given selectors" do
62
+ doc = %Q(<html><body>
63
+ <div class="card review"></div>
64
+ </body></html>)
65
+ element = Nokogiri::HTML(doc).css(".card").first
66
+ expect(subject.class.class_matching(element)).to eq Hash
67
+ end
68
+
69
+ context "with no matching selectors" do
70
+ it "should raise an exception" do
71
+ doc = %Q(<html><body>
72
+ <div class="non"></div>
73
+ </body></html>)
74
+ element = Nokogiri::HTML(doc).css(".non").first
75
+ expect {
76
+ subject.class.class_matching(element)
77
+ }.to raise_error(RuntimeError)
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "::filter" do
83
+ let(:selectors) do
84
+ { ".review" => Object }
85
+ end
86
+
87
+ it "should return an array of selectors that match the given classes" do
88
+ expect(subject.class.filter(Object)).to eq [".review"]
89
+ expect(subject.class.filter(Hash)).to eq []
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ describe Microformat do
4
+ subject { Microformat }
5
+
6
+ describe "::parse" do
7
+ let(:args) { ["one", 2, :three] }
8
+
9
+ before(:each) do
10
+ Microformat::Parser.should_receive(:parse).with(*args).and_return(true)
11
+ end
12
+
13
+ it "should pass args onto the parser" do
14
+ expect(subject.parse(*args)).to be_true
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ require "simplecov"
2
+ SimpleCov.start do
3
+ add_filter "/spec/"
4
+ end
5
+
6
+ require "bundler"
7
+ Bundler.require
8
+
9
+ Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each { |f| require f }
@@ -0,0 +1,8 @@
1
+ RSpec.configure do |config|
2
+ config.expect_with :rspec do |c|
3
+ c.syntax = :expect
4
+ end
5
+
6
+ config.color_enabled = true
7
+ config.order = :random
8
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: microformat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,72 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-19 00:00:00.000000000 Z
13
- dependencies: []
12
+ date: 2012-10-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: nokogiri
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: simplecov
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
14
78
  description: Reads Microformats from HTML documents
15
79
  email:
16
80
  - ryan@ryantownsend.co.uk
@@ -19,13 +83,33 @@ extensions: []
19
83
  extra_rdoc_files: []
20
84
  files:
21
85
  - .gitignore
86
+ - .rvmrc
87
+ - .travis.yml
22
88
  - Gemfile
23
89
  - LICENSE
24
90
  - README.md
25
91
  - Rakefile
26
92
  - lib/microformat.rb
93
+ - lib/microformat/attribute.rb
94
+ - lib/microformat/attribute_definition.rb
95
+ - lib/microformat/attribute_map.rb
96
+ - lib/microformat/card.rb
97
+ - lib/microformat/collection.rb
98
+ - lib/microformat/format.rb
99
+ - lib/microformat/parser.rb
100
+ - lib/microformat/review.rb
101
+ - lib/microformat/selectors.rb
27
102
  - lib/microformat/version.rb
28
103
  - microformat.gemspec
104
+ - spec/microformat/attribute_definition_spec.rb
105
+ - spec/microformat/attribute_spec.rb
106
+ - spec/microformat/collection_spec.rb
107
+ - spec/microformat/format_spec.rb
108
+ - spec/microformat/parser_spec.rb
109
+ - spec/microformat/selectors_spec.rb
110
+ - spec/microformat_spec.rb
111
+ - spec/spec_helper.rb
112
+ - spec/support/env.rb
29
113
  homepage: https://github.com/platformq/microformat
30
114
  licenses: []
31
115
  post_install_message:
@@ -46,8 +130,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
46
130
  version: '0'
47
131
  requirements: []
48
132
  rubyforge_project:
49
- rubygems_version: 1.8.24
133
+ rubygems_version: 1.8.23
50
134
  signing_key:
51
135
  specification_version: 3
52
136
  summary: Reads Microformats from HTML documents
53
- test_files: []
137
+ test_files:
138
+ - spec/microformat/attribute_definition_spec.rb
139
+ - spec/microformat/attribute_spec.rb
140
+ - spec/microformat/collection_spec.rb
141
+ - spec/microformat/format_spec.rb
142
+ - spec/microformat/parser_spec.rb
143
+ - spec/microformat/selectors_spec.rb
144
+ - spec/microformat_spec.rb
145
+ - spec/spec_helper.rb
146
+ - spec/support/env.rb