schema_dot_org 1.3.0 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '06093d53aa2d45e3ccb4220a1fb8537f6e0f6aae306d14d23e609b6939413aa5'
4
- data.tar.gz: a4f5f7a98ef6753142f80c15eb82b37358e0c227d210962b98793cb0e10c3b0d
3
+ metadata.gz: ce2b289fea268f2a78df900f63d7d36736bcd0b08446eb7c18a21997cfb6ec8c
4
+ data.tar.gz: e0a512dcf0d386376a5d227312e8fea47f95a014ed34b2b4ac9be8777f5ef1fe
5
5
  SHA512:
6
- metadata.gz: 5e336d118cff1aa7afb2b73d825314993f7ee67d55a9c4c58ce3c05d0db05d9ca8d078d48903bc76d5f41fdd2931d39136b4f4fbd81c8099ef7158790d34cbc5
7
- data.tar.gz: 6bcdfe9ab05c06aafe5b762c84b98a64687d2dfbd9623dc3c2d1e15dde6d1aeae78994ddf4900b21d5428d628214bd12158cf1809a748418515392b03ff47f8c
6
+ metadata.gz: 05ca9ceb7a3c95478f86c31d11df20f6661f6caee962170615ac35c178e4e2747f031a2675e97ea31881c50931775304caf9e684335633e8fcb5fdb527935243
7
+ data.tar.gz: 31b3407922f8757746424c39d9571050dc063d24610a98762ee67d424af498314b97dbaf13a5c2f57ea9a23411c8f2509587bbf596fb6d956abce5c31e28b942
@@ -1 +1 @@
1
- 2.5.0
1
+ 2.5.1
@@ -1,5 +1,6 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.4.2
4
+ - 2.4.0
5
+ - 2.5.1
5
6
  before_install: gem install bundler -v 1.16.1
@@ -1,22 +1,22 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- schema_dot_org (1.3.0)
5
- validated_object (~> 2.0.0)
4
+ schema_dot_org (1.5.0)
5
+ validated_object (~> 2.0.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activemodel (5.1.5)
11
- activesupport (= 5.1.5)
12
- activesupport (5.1.5)
10
+ activemodel (5.1.6)
11
+ activesupport (= 5.1.6)
12
+ activesupport (5.1.6)
13
13
  concurrent-ruby (~> 1.0, >= 1.0.2)
14
- i18n (~> 0.7)
14
+ i18n (>= 0.7, < 2)
15
15
  minitest (~> 5.1)
16
16
  tzinfo (~> 1.1)
17
17
  concurrent-ruby (1.0.5)
18
18
  diff-lcs (1.3)
19
- i18n (0.9.5)
19
+ i18n (1.0.0)
20
20
  concurrent-ruby (~> 1.0)
21
21
  minitest (5.11.3)
22
22
  rake (10.5.0)
@@ -36,7 +36,7 @@ GEM
36
36
  thread_safe (0.3.6)
37
37
  tzinfo (1.2.5)
38
38
  thread_safe (~> 0.1)
39
- validated_object (2.0.0)
39
+ validated_object (2.0.2)
40
40
  activemodel (>= 3.2.21)
41
41
 
42
42
  PLATFORMS
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
- [![CircleCI](https://circleci.com/gh/dogweather/schema-dot-org.svg?style=svg)](https://circleci.com/gh/dogweather/schema-dot-org) [![Gem Version](https://badge.fury.io/rb/schema_dot_org.svg)](https://badge.fury.io/rb/schema_dot_org) [![Maintainability](https://api.codeclimate.com/v1/badges/e0c60b4cbc998563a484/maintainability)](https://codeclimate.com/github/dogweather/schema-dot-org/maintainability)
1
+ [![Build Status](https://travis-ci.org/dogweather/schema-dot-org.svg?branch=master)](https://travis-ci.org/dogweather/schema-dot-org) [![Gem Version](https://badge.fury.io/rb/schema_dot_org.svg)](https://badge.fury.io/rb/schema_dot_org) [![Maintainability](https://api.codeclimate.com/v1/badges/e0c60b4cbc998563a484/maintainability)](https://codeclimate.com/github/dogweather/schema-dot-org/maintainability)
2
2
 
3
3
  # SchemaDotOrg
4
4
 
5
5
  Let's create [Structured Data](https://developers.google.com/search/docs/guides/intro-structured-data) that's correct,
6
- every single time.
6
+ every single time. Good structured data [helps enhance a website's search result appearance](https://developers.google.com/search/docs/guides/enhance-site).
7
7
 
8
8
  > Google Search works hard to understand the content of a page. You can help us by providing explicit clues about the meaning of a page . . .
9
9
 
@@ -19,7 +19,11 @@ Let's say you have a Rails app. If you put this in a controller:
19
19
  founding_location: Place.new(address: 'Portland, OR'),
20
20
  email: 'say_hi@public.law',
21
21
  url: 'https://www.public.law',
22
- logo: 'https://www.public.law/favicon-196x196.png'
22
+ logo: 'https://www.public.law/favicon-196x196.png',
23
+ same_as: [
24
+ 'https://twitter.com/law_is_code',
25
+ 'https://www.facebook.com/PublicDotLaw'
26
+ ]
23
27
  )
24
28
  ```
25
29
 
@@ -48,7 +52,11 @@ Let's say you have a Rails app. If you put this in a controller:
48
52
  "foundingLocation": {
49
53
  "@type": "Place",
50
54
  "address": "Portland, OR"
51
- }
55
+ },
56
+ "sameAs": [
57
+ "https://twitter.com/law_is_code",
58
+ "https://www.facebook.com/PublicDotLaw"
59
+ ],
52
60
  </script>
53
61
  ```
54
62
 
@@ -71,16 +79,60 @@ Place.new(
71
79
  address: '12345 Happy Street',
72
80
  author: 'Hemmingway'
73
81
  )
74
- # => NoMethodError: undefined method `author='
82
+ # => NoMethodError: undefined method `author'
75
83
  ```
76
84
 
77
85
  This type safety comes from the [ValidatedObject gem](https://github.com/dogweather/validated_object).
78
86
 
79
- ## The Goal: Rich enough vocabulary for Google Schema.org parsing
87
+ ## Supported Schema.org Types
88
+
89
+ ### WebSite
90
+
91
+ Example with only the required attributes:
92
+
93
+ ```ruby
94
+ WebSite.new(
95
+ name: 'Texas Public Law',
96
+ url: 'https://texas.public.law',
97
+ )
98
+ ```
99
+
100
+ With the optional `SearchAction` to enable a [Sitelinks Searchbox](https://developers.google.com/search/docs/data-types/sitelinks-searchbox):
101
+
102
+ ```ruby
103
+ WebSite.new(
104
+ name: 'Texas Public Law',
105
+ url: 'https://texas.public.law',
106
+ potential_action: SearchAction.new(
107
+ target: 'https://texas.public.law/?search={search_term_string}',
108
+ query_input: 'required name=search_term_string'
109
+ )
110
+ )
111
+ ```
112
+
113
+ ### Organization
114
+
115
+ Example:
116
+
117
+ ```ruby
118
+ Organization.new(
119
+ name: 'Public.Law',
120
+ founder: Person.new(name: 'Robb Shecter'),
121
+ founding_date: Date.new(2009, 3, 6),
122
+ founding_location: Place.new(address: 'Portland, OR'),
123
+ email: 'say_hi@public.law',
124
+ url: 'https://www.public.law',
125
+ logo: 'https://www.public.law/favicon-196x196.png',
126
+ same_as: [
127
+ 'https://twitter.com/law_is_code',
128
+ 'https://www.facebook.com/PublicDotLaw'
129
+ ]
130
+ )
131
+ ```
132
+
133
+ ### Person, Place, and SearchAction
80
134
 
81
- The plan is to implement a subset of types and attributes relevant to the Google web crawler.
82
- See `test-script.rb` for the supported types. Currently, all the attributes are required.
83
- Propose new types and attributes by opening an Issue.
135
+ These three aren't too useful on their own in web apps. They're used when creating a `WebSite` and `Organization`, as shown above.
84
136
 
85
137
  ## Installation
86
138
 
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
  require 'validated_object'
3
- require 'schema_dot_org/version'
4
5
 
5
6
  module SchemaDotOrg
6
7
  #
7
8
  # Base class for schema types. Refactors out common code.
8
9
  #
9
10
  class SchemaType < ValidatedObject::Base
10
- ROOT_ATTR = {"@context" => "http://schema.org"}
11
+ ROOT_ATTR = { "@context" => "http://schema.org" }.freeze
12
+ UNQUALIFIED_CLASS_NAME_REGEX = /([^:]+)$/
13
+
11
14
 
12
-
13
15
  def to_s
14
16
  json_string = to_json_ld(pretty: true)
15
17
 
@@ -26,7 +28,7 @@ module SchemaDotOrg
26
28
  "<script type=\"application/ld+json\">\n" + to_json(pretty: pretty, as_root: true) + "\n</script>"
27
29
  end
28
30
 
29
-
31
+
30
32
  def to_json(pretty: false, as_root: false)
31
33
  structure = as_root ? ROOT_ATTR.merge(to_json_struct) : to_json_struct
32
34
 
@@ -41,7 +43,7 @@ module SchemaDotOrg
41
43
  # Use the class name to create the "@type" attribute.
42
44
  # @return a hash structure representing json.
43
45
  def to_json_struct
44
- { "@type" => un_namespaced_classname }.merge( _to_json_struct )
46
+ { "@type" => un_namespaced_classname }.merge(_to_json_struct.compact)
45
47
  end
46
48
 
47
49
 
@@ -52,8 +54,8 @@ module SchemaDotOrg
52
54
 
53
55
  # @return the classname without the module namespace.
54
56
  def un_namespaced_classname
55
- self.class.name =~ /([^:]+)$/
56
- $1
57
+ self.class.name =~ UNQUALIFIED_CLASS_NAME_REGEX
58
+ Regexp.last_match(1)
57
59
  end
58
60
  end
59
61
  end
@@ -1,18 +1,30 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'date'
2
4
  require 'schema_dot_org'
5
+ require 'schema_dot_org/person'
6
+ require 'schema_dot_org/place'
3
7
 
4
8
 
5
9
  module SchemaDotOrg
6
10
  class Organization < SchemaType
7
- attr_accessor :email, :founder, :founding_date, :founding_location, :logo, :name, :url
11
+ attr_accessor :email,
12
+ :founder,
13
+ :founding_date,
14
+ :founding_location,
15
+ :logo,
16
+ :name,
17
+ :url,
18
+ :same_as
8
19
 
9
20
  validates :email, type: String
10
- validates :founder, type: Person
21
+ validates :founder, type: SchemaDotOrg::Person
11
22
  validates :founding_date, type: Date
12
- validates :founding_location, type: Place
23
+ validates :founding_location, type: SchemaDotOrg::Place
13
24
  validates :logo, type: String
14
25
  validates :name, type: String
15
26
  validates :url, type: String
27
+ validates :same_as, type: Array, allow_nil: true
16
28
 
17
29
  def _to_json_struct
18
30
  {
@@ -22,8 +34,9 @@ module SchemaDotOrg
22
34
  "logo" => logo,
23
35
  "founder" => founder.to_json_struct,
24
36
  "foundingDate" => founding_date.to_s,
25
- "foundingLocation" => founding_location.to_json_struct
37
+ "foundingLocation" => founding_location.to_json_struct,
38
+ "sameAs" => same_as
26
39
  }
27
40
  end
28
41
  end
29
- end
42
+ end
@@ -1,18 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'schema_dot_org'
2
4
 
3
5
 
4
6
  module SchemaDotOrg
5
7
  # Model the Schema.org `Person`. See http://schema.org/Person
6
8
  class Person < SchemaType
7
-
8
9
  attr_accessor :name
9
10
  validates :name, type: String, presence: true
10
11
 
11
12
 
12
13
  def _to_json_struct
13
14
  {
14
- name: self.name
15
+ 'name' => self.name
15
16
  }
16
17
  end
17
18
  end
18
- end
19
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'schema_dot_org'
2
4
 
3
5
 
@@ -9,8 +11,8 @@ module SchemaDotOrg
9
11
 
10
12
  def _to_json_struct
11
13
  {
12
- address: self.address
14
+ 'address' => self.address
13
15
  }
14
16
  end
15
17
  end
16
- end
18
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'schema_dot_org'
4
+
5
+
6
+ module SchemaDotOrg
7
+ # Model the Schema.org `Thing > SearchAction`. See http://schema.org/SearchAction
8
+ class SearchAction < SchemaType
9
+ attr_accessor :target, :query_input
10
+ validates :target, type: String, presence: true
11
+ validates :query_input, type: String, presence: true
12
+
13
+ def _to_json_struct
14
+ {
15
+ 'target' => self.target,
16
+ 'query_input' => self.query_input
17
+ }
18
+ end
19
+ end
20
+ end
@@ -1,22 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'schema_dot_org'
2
4
 
3
5
 
4
6
  module SchemaDotOrg
5
- # Model the Schema.org `Thing > CreativeWork > WebSite`.
7
+ # Model the Schema.org `Thing > CreativeWork > WebSite`.
6
8
  # @See http://schema.org/WebSite
7
9
  class WebSite < SchemaType
8
- attr_accessor :name
9
- validates :name, type: String, presence: true
10
-
11
- attr_accessor :url
12
- validates :url, type: String, presence: true
10
+ attr_accessor :name, :url, :potential_action
11
+ validates :name, type: String, presence: true
12
+ validates :url, type: String, presence: true
13
+ validates :potential_action, type: SearchAction, allow_nil: true
13
14
 
14
15
  def _to_json_struct
15
16
  {
16
- name: self.name,
17
- url: self.url
17
+ 'name' => self.name,
18
+ 'url' => self.url,
19
+ 'potentialAction' => self.potential_action&.to_json_struct
18
20
  }
19
21
  end
20
22
  end
21
23
  end
22
-
@@ -1,11 +1,10 @@
1
1
 
2
2
  lib = File.expand_path("../lib", __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "schema_dot_org/version"
5
4
 
6
5
  Gem::Specification.new do |spec|
7
6
  spec.name = "schema_dot_org"
8
- spec.version = SchemaDotOrg::VERSION
7
+ spec.version = '1.5.0'
9
8
  spec.authors = ["Robb Shecter"]
10
9
  spec.email = ["robb@public.law"]
11
10
 
@@ -21,7 +20,7 @@ Gem::Specification.new do |spec|
21
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
21
  spec.require_paths = ["lib"]
23
22
 
24
- spec.add_dependency "validated_object", "~> 2.0.0"
23
+ spec.add_dependency "validated_object", "~> 2.0.2"
25
24
 
26
25
  spec.add_development_dependency "bundler", "~> 1.16"
27
26
  spec.add_development_dependency "rake", "~> 10.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schema_dot_org
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robb Shecter
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-02-24 00:00:00.000000000 Z
11
+ date: 2018-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: validated_object
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.0.0
19
+ version: 2.0.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.0.0
26
+ version: 2.0.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -88,7 +88,7 @@ files:
88
88
  - lib/schema_dot_org/organization.rb
89
89
  - lib/schema_dot_org/person.rb
90
90
  - lib/schema_dot_org/place.rb
91
- - lib/schema_dot_org/version.rb
91
+ - lib/schema_dot_org/search_action.rb
92
92
  - lib/schema_dot_org/web_site.rb
93
93
  - schema_dot_org.gemspec
94
94
  - test-script.rb
@@ -1,3 +0,0 @@
1
- module SchemaDotOrg
2
- VERSION = "1.3.0"
3
- end