html-schema 0.2.0.1 → 0.5.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/Rakefile +9 -4
- data/lib/html-schema.rb +54 -14
- data/lib/html-schema/api/object.rb +25 -6
- data/lib/html-schema/attribute.rb +9 -0
- data/lib/html-schema/dsl.rb +6 -0
- data/lib/html-schema/microdata.rb +2 -2
- data/lib/html-schema/object.rb +6 -0
- data/lib/html-schema/railtie.rb +9 -0
- metadata +12 -24
- data/spec/schema_spec.rb +0 -87
- data/spec/spec_helper.rb +0 -14
data/Rakefile
CHANGED
@@ -5,14 +5,19 @@ require 'rake/gempackagetask'
|
|
5
5
|
spec = Gem::Specification.new do |s|
|
6
6
|
s.name = "html-schema"
|
7
7
|
s.authors = ["Lance Pollard"]
|
8
|
-
s.version = "0.
|
9
|
-
s.
|
10
|
-
s.
|
8
|
+
s.version = "0.5.0"
|
9
|
+
s.summary = "Schema.org API for Ruby (Microdata and Microformats under one API)"
|
10
|
+
s.description = %{
|
11
|
+
A unified interface to the semantic web. You tell your ERB/Haml this is a "person" object,
|
12
|
+
and it will give you the schema.org microdata, the microformats, or both. Cuts out having to
|
13
|
+
remember these "non-human" keys :).
|
14
|
+
}
|
11
15
|
s.homepage = "http://github.com/viatropos/html-schema"
|
16
|
+
s.license = "MIT"
|
12
17
|
s.email = "lancejpollard@gmail.com"
|
13
18
|
s.rubyforge_project = "html-schema"
|
14
19
|
s.platform = Gem::Platform::RUBY
|
15
|
-
s.files = %w(Rakefile) + Dir["{lib
|
20
|
+
s.files = %w(Rakefile) + Dir["{lib}/**/*"]
|
16
21
|
s.require_path = "lib"
|
17
22
|
end
|
18
23
|
|
data/lib/html-schema.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'active_support/core_ext'
|
2
2
|
|
3
|
-
$:.unshift File.dirname(File.expand_path(__FILE__))
|
3
|
+
$:.unshift File.dirname(File.expand_path(__FILE__))
|
4
4
|
|
5
5
|
class HTMLSchema
|
6
6
|
class << self
|
@@ -60,24 +60,64 @@ class HTMLSchema
|
|
60
60
|
|
61
61
|
end
|
62
62
|
|
63
|
+
def to_hash(options = {})
|
64
|
+
recursively_stringify_keys(api.types.keys.inject({}) do |hash, key|
|
65
|
+
hash[key] = api.types[key].to_object
|
66
|
+
hash
|
67
|
+
end, options)
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_yaml
|
71
|
+
to_hash.to_yaml
|
72
|
+
end
|
73
|
+
|
63
74
|
protected
|
64
75
|
def define_api_method(name)
|
65
76
|
self.class.send :define_method, name do
|
66
77
|
self.api[name]
|
67
78
|
end unless self.respond_to?(name)
|
68
79
|
end
|
80
|
+
|
81
|
+
def compact_keys
|
82
|
+
@compact_keys ||= {
|
83
|
+
:itemtype => "t",
|
84
|
+
:itemscope => "s",
|
85
|
+
:itemprop => "p",
|
86
|
+
:class => "c",
|
87
|
+
:rel => "r",
|
88
|
+
:type => "k"
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
def recursively_stringify_keys(hash = {}, options = {})
|
94
|
+
hash.keys.inject({}) do |result, key|
|
95
|
+
value = hash[key]
|
96
|
+
result[options[:compact] ? (compact_keys[key] || key.to_s) : key.to_s] = case value
|
97
|
+
when ::Hash
|
98
|
+
recursively_stringify_keys(value, options)
|
99
|
+
when ::Array
|
100
|
+
value.map(&:to_s)
|
101
|
+
else
|
102
|
+
value.to_s
|
103
|
+
end
|
104
|
+
result
|
105
|
+
end
|
106
|
+
end
|
69
107
|
end
|
70
108
|
|
71
|
-
require '
|
72
|
-
require '
|
73
|
-
require '
|
74
|
-
require '
|
75
|
-
require '
|
76
|
-
require '
|
77
|
-
require '
|
78
|
-
require '
|
79
|
-
require '
|
80
|
-
require '
|
81
|
-
require '
|
82
|
-
require '
|
83
|
-
require '
|
109
|
+
require 'html-schema/railtie'
|
110
|
+
require 'html-schema/helper'
|
111
|
+
require 'html-schema/object'
|
112
|
+
require 'html-schema/attribute'
|
113
|
+
require 'html-schema/configuration'
|
114
|
+
require 'html-schema/dsl'
|
115
|
+
require 'html-schema/api/object'
|
116
|
+
require 'html-schema/api/attribute'
|
117
|
+
require 'html-schema/microdata/object'
|
118
|
+
require 'html-schema/microdata/attribute'
|
119
|
+
require 'html-schema/microformat/object'
|
120
|
+
require 'html-schema/microformat/attribute'
|
121
|
+
require 'html-schema/api'
|
122
|
+
require 'html-schema/microdata'
|
123
|
+
require 'html-schema/microformat'
|
@@ -10,16 +10,35 @@ class HTMLSchema
|
|
10
10
|
@microformat ||= HTMLSchema.instance.microformat[_name]
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
|
13
|
+
def to_hash
|
14
|
+
result = {}
|
15
|
+
deep_merge(result, microdata.to_hash) if microdata
|
16
|
+
deep_merge(result, microformat.to_hash) if microformat
|
17
|
+
result
|
15
18
|
end
|
16
19
|
|
17
|
-
def
|
18
|
-
|
20
|
+
def to_object
|
21
|
+
result = {}
|
22
|
+
deep_merge(result, microdata.to_object) if microdata
|
23
|
+
deep_merge(result, microformat.to_object) if microformat
|
24
|
+
result
|
19
25
|
end
|
20
26
|
|
21
|
-
|
22
|
-
|
27
|
+
private
|
28
|
+
def deep_merge(result, object = {})
|
29
|
+
object.each do |key, value|
|
30
|
+
if result.has_key?(key)
|
31
|
+
case result[key]
|
32
|
+
when ::Hash
|
33
|
+
result[key] = deep_merge(result[key], value)
|
34
|
+
when ::Array
|
35
|
+
result[key] |= value
|
36
|
+
end
|
37
|
+
else
|
38
|
+
result[key] = value
|
39
|
+
end
|
40
|
+
end
|
41
|
+
result
|
23
42
|
end
|
24
43
|
end
|
25
44
|
end
|
@@ -9,6 +9,7 @@ class HTMLSchema
|
|
9
9
|
@as = options[:as] || name
|
10
10
|
@classes = Array(as).map(&:to_s)
|
11
11
|
@required = options[:required] == true
|
12
|
+
@type = options[:type] || :string
|
12
13
|
|
13
14
|
@options = options.except(:as, :parent, :required, :type)
|
14
15
|
@options.each do |key, value|
|
@@ -34,6 +35,14 @@ class HTMLSchema
|
|
34
35
|
@value = format(value)
|
35
36
|
end
|
36
37
|
|
38
|
+
def to_hash
|
39
|
+
{}
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_object
|
43
|
+
to_hash.merge(:type => type)
|
44
|
+
end
|
45
|
+
|
37
46
|
class << self
|
38
47
|
def attribute?
|
39
48
|
true
|
data/lib/html-schema/dsl.rb
CHANGED
@@ -24,7 +24,7 @@ class HTMLSchema
|
|
24
24
|
attribute :country, :as => :addressCountry#, :type => :place, :source => :country
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
type :composition, :as => :Composition do
|
29
29
|
attribute :abstract, :as => :about, :type => :base
|
30
30
|
attribute :average_rating, :as => :aggregateRating, :type => :rating
|
@@ -56,7 +56,7 @@ class HTMLSchema
|
|
56
56
|
|
57
57
|
# dates
|
58
58
|
attribute :published_at, :as => :datePublished, :type => :date
|
59
|
-
attribute :updated_at, :as => :datePublished, :type => :date
|
59
|
+
#attribute :updated_at, :as => :datePublished, :type => :date
|
60
60
|
|
61
61
|
type :blog, :as => :Blog
|
62
62
|
type :book, :as => :Book
|
data/lib/html-schema/object.rb
CHANGED
@@ -36,6 +36,12 @@ class HTMLSchema
|
|
36
36
|
attributes[key]
|
37
37
|
end
|
38
38
|
|
39
|
+
def to_object
|
40
|
+
result = to_hash.merge(:attributes => attributes.keys.inject({}) { |hash, key| hash[key] = attributes[key].to_object ; hash })
|
41
|
+
result[:parent] = parent._name if parent
|
42
|
+
result
|
43
|
+
end
|
44
|
+
|
39
45
|
protected
|
40
46
|
def format_class
|
41
47
|
@format_class ||= "#{self.class.name.split("::")[0..-2].join("::")}".constantize
|
metadata
CHANGED
@@ -1,14 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: html-schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
- 0
|
10
|
-
- 1
|
11
|
-
version: 0.2.0.1
|
4
|
+
prerelease:
|
5
|
+
version: 0.5.0
|
12
6
|
platform: ruby
|
13
7
|
authors:
|
14
8
|
- Lance Pollard
|
@@ -16,11 +10,13 @@ autorequire:
|
|
16
10
|
bindir: bin
|
17
11
|
cert_chain: []
|
18
12
|
|
19
|
-
date: 2011-
|
20
|
-
default_executable:
|
13
|
+
date: 2011-09-20 00:00:00 Z
|
21
14
|
dependencies: []
|
22
15
|
|
23
|
-
description:
|
16
|
+
description: "\n\
|
17
|
+
A unified interface to the semantic web. You tell your ERB/Haml this is a \"person\" object,\n\
|
18
|
+
and it will give you the schema.org microdata, the microformats, or both. Cuts out having to\n\
|
19
|
+
remember these \"non-human\" keys :).\n"
|
24
20
|
email: lancejpollard@gmail.com
|
25
21
|
executables: []
|
26
22
|
|
@@ -44,13 +40,11 @@ files:
|
|
44
40
|
- lib/html-schema/microformat/object.rb
|
45
41
|
- lib/html-schema/microformat.rb
|
46
42
|
- lib/html-schema/object.rb
|
43
|
+
- lib/html-schema/railtie.rb
|
47
44
|
- lib/html-schema.rb
|
48
|
-
- spec/schema_spec.rb
|
49
|
-
- spec/spec_helper.rb
|
50
|
-
has_rdoc: true
|
51
45
|
homepage: http://github.com/viatropos/html-schema
|
52
|
-
licenses:
|
53
|
-
|
46
|
+
licenses:
|
47
|
+
- MIT
|
54
48
|
post_install_message:
|
55
49
|
rdoc_options: []
|
56
50
|
|
@@ -61,25 +55,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
61
55
|
requirements:
|
62
56
|
- - ">="
|
63
57
|
- !ruby/object:Gem::Version
|
64
|
-
hash: 3
|
65
|
-
segments:
|
66
|
-
- 0
|
67
58
|
version: "0"
|
68
59
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
60
|
none: false
|
70
61
|
requirements:
|
71
62
|
- - ">="
|
72
63
|
- !ruby/object:Gem::Version
|
73
|
-
hash: 3
|
74
|
-
segments:
|
75
|
-
- 0
|
76
64
|
version: "0"
|
77
65
|
requirements: []
|
78
66
|
|
79
67
|
rubyforge_project: html-schema
|
80
|
-
rubygems_version: 1.
|
68
|
+
rubygems_version: 1.8.10
|
81
69
|
signing_key:
|
82
70
|
specification_version: 3
|
83
|
-
summary:
|
71
|
+
summary: Schema.org API for Ruby (Microdata and Microformats under one API)
|
84
72
|
test_files: []
|
85
73
|
|
data/spec/schema_spec.rb
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe HTMLSchema do
|
4
|
-
context ":output" do
|
5
|
-
before do
|
6
|
-
@schema = HTMLSchema.instance
|
7
|
-
end
|
8
|
-
|
9
|
-
context ":organization" do
|
10
|
-
before do
|
11
|
-
@organization = @schema.organization
|
12
|
-
end
|
13
|
-
|
14
|
-
it "should have attributes" do
|
15
|
-
@organization.to_hash.should == {
|
16
|
-
:itemscope => "itemscope",
|
17
|
-
:itemtype => "http://schema.org/Organization",
|
18
|
-
:class => "org"
|
19
|
-
}
|
20
|
-
|
21
|
-
@organization.name.to_hash.should == {:itemprop => "name", :class => "organization-name"}
|
22
|
-
@organization.description.to_hash.should == {:itemprop => "description", :class => "description"}
|
23
|
-
@organization.url.to_hash.should == {:itemprop => "url", :class => "url"}
|
24
|
-
@organization.image.to_hash.should == {:itemprop => "image", :class => "image"}
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context ":person" do
|
29
|
-
before do
|
30
|
-
@person = @schema.person
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should have attributes" do
|
34
|
-
@person.to_hash.should == {
|
35
|
-
#:itemprop => "person",
|
36
|
-
:itemscope => "itemscope",
|
37
|
-
:itemtype => "http://schema.org/Person",
|
38
|
-
:class => "vcard"
|
39
|
-
}
|
40
|
-
@person.name.to_hash.should == {:itemprop => "name", :class => "fn"}
|
41
|
-
@person.url.to_hash.should == {:itemprop => "url", :class => "url"}
|
42
|
-
@person.image.to_hash.should == {:itemprop => "image", :class => "image"}
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
context ":address" do
|
47
|
-
before do
|
48
|
-
@address = @schema.address
|
49
|
-
end
|
50
|
-
|
51
|
-
it "should have attributes" do
|
52
|
-
@address.to_hash.should == {
|
53
|
-
#:itemprop => "address",
|
54
|
-
:itemscope => "itemscope",
|
55
|
-
:itemtype => "http://schema.org/PostalAddress",
|
56
|
-
:class => "adr"
|
57
|
-
}
|
58
|
-
@address.name.to_hash.should == {:itemprop => "name", :class => "name"}
|
59
|
-
@address.url.to_hash.should == {:itemprop => "url", :class => "url"}
|
60
|
-
@address.image.to_hash.should == {:itemprop => "image", :class => "image"}
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
context ":article" do
|
65
|
-
before do
|
66
|
-
@article = @schema.article
|
67
|
-
end
|
68
|
-
|
69
|
-
it "should have attributes" do
|
70
|
-
@article.to_hash.should == {
|
71
|
-
:itemscope => "itemscope",
|
72
|
-
:itemtype => "http://schema.org/Article",
|
73
|
-
:class => "hentry"
|
74
|
-
}
|
75
|
-
|
76
|
-
@article.title.to_hash.should == {:itemprop => "title", :class => "entry-title"}
|
77
|
-
@article.tag.to_hash.should == {:itemprop => "keywords", :rel => "tag", :class => "tag"}
|
78
|
-
@article.description.to_hash.should == {:itemprop => "description", :class => "entry-summary"}
|
79
|
-
@article.body.to_hash.should == {:itemprop => "articleBody", :class => "entry-content"}
|
80
|
-
@article.published_at.to_hash.should == {:itemprop => "datePublished", :class => "published"}
|
81
|
-
@article.updated_at.to_hash.should == {:class => "updated"}
|
82
|
-
@article.author.to_hash.should == {:itemprop => "author", :class => "author"}
|
83
|
-
@article.url.to_hash.should == {:itemprop => "url", :class => "url"}
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bundler/setup'
|
3
|
-
require 'active_support/core_ext'
|
4
|
-
require 'rspec'
|
5
|
-
|
6
|
-
# rspec spec/microdata/base_spec.rb
|
7
|
-
|
8
|
-
RSpec.configure do |config|
|
9
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
$:.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
|
13
|
-
|
14
|
-
require 'html-schema'
|