schema_dot_org 2.2.1 → 2.2.3

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: e51372213bf0a5e8a9330e21695ef2da7953777627d38df1e5fc3381ea01c446
4
- data.tar.gz: 9d8faef75d7ef9461d40af04900cbeed15f9afb3f1eab7278e70b49e775d2228
3
+ metadata.gz: 5e190c183425efbb7808c9e18f253cd377b91a4ce927d8f401f02158d6d704cf
4
+ data.tar.gz: 5e01217b962ed0ec450bda73923e2fbdff9ec4baeee2433c96cdc27c53e08bbf
5
5
  SHA512:
6
- metadata.gz: df934ac4daf68337bed44ff56b99763ea350f0d9a09f476f2bae1a9d7231b7b1583696fe0dd1c6c74786e59d55d39ccec9a51807a89f77ad69e6c70208ad6a72
7
- data.tar.gz: 68a81e34cb06baccf9743fe25ac20f674cf9e2c3972b252f4a80b212fb12b232555288c7dd2e3833d4505cefaefde5e2097ce4ba8a4e46cfaf7d3e301dbf69d5
6
+ metadata.gz: 36a893438da0d2731fba7a14a5d2a04b4a406688b5be906c6080ad30b2bb42865553943451fcb25e22a737e2e5478ac95a72f8fadf6447f28791c8e0ff89d2d9
7
+ data.tar.gz: 2b1feab097655a4efd511838774f1f4c5224c0767cf78aa970f7feb7b57bd6e7a74bf7327aee2eecd2578d38aee68eb494c5ea5b6ff6131651c82c429f27cb70
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- schema_dot_org (2.2.1)
4
+ schema_dot_org (2.2.3)
5
5
  validated_object (~> 2.3)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -2,22 +2,23 @@
2
2
 
3
3
  # SchemaDotOrg
4
4
 
5
- Create [Structured Data](https://developers.google.com/search/docs/guides/intro-structured-data) with correct **syntax** and **semantics**,
6
- every single time. Good structured data [helps enhance a website's search result appearance](https://developers.google.com/search/docs/guides/enhance-site).
5
+ Easily create [Structured Data](https://developers.google.com/search/docs/guides/intro-structured-data) with **correct syntax and semantics**.
6
+ 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
 
10
10
  ## Usage
11
11
 
12
- Let's say you have a Rails app. If you put this in a controller:
12
+ Let's say you have a Rails app. First write plain-ruby code in a controller. Just instantiate
13
+ the structured data object you want in your web page:
13
14
 
14
15
  ```ruby
15
- @public_law = Organization.new(
16
+ @my_org = Organization.new(
16
17
  name: 'Public.Law',
17
18
  founder: Person.new(name: 'Robb Shecter'),
18
19
  founding_date: Date.new(2009, 3, 6),
19
20
  founding_location: Place.new(address: 'Portland, OR'),
20
- email: 'say_hi@public.law',
21
+ email: 'support@public.law',
21
22
  telephone: '+1 123 456 7890',
22
23
  url: 'https://www.public.law',
23
24
  logo: 'https://www.public.law/favicon-196x196.png',
@@ -28,13 +29,13 @@ Let's say you have a Rails app. If you put this in a controller:
28
29
  )
29
30
  ```
30
31
 
31
- ...and this in a template:
32
+ ...and then output it in a template:
32
33
 
33
34
  ```html
34
- <%= @public_law %>
35
+ <%= @my_org %>
35
36
  ```
36
37
 
37
- ...you'll get this in the HTML:
38
+ ...you'll get this perfectly formatted structured data in your HTML:
38
39
 
39
40
  ```html
40
41
  <script type="application/ld+json">
@@ -42,7 +43,7 @@ Let's say you have a Rails app. If you put this in a controller:
42
43
  "@context": "http://schema.org",
43
44
  "@type": "Organization",
44
45
  "name": "Public.Law",
45
- "email": "say_hi@public.law",
46
+ "email": "support@public.law",
46
47
  "telephone": "+1 123 456 7890",
47
48
  "url": "https://www.public.law",
48
49
  "logo": "https://www.public.law/favicon-196x196.png",
@@ -63,14 +64,25 @@ Let's say you have a Rails app. If you put this in a controller:
63
64
  </script>
64
65
  ```
65
66
 
66
- Strong typing is at work here. `SchemaDotOrg` will validate your code, and if correct, will generate Schema.org JSON-LD markup. If not, you'll get a descriptive error message.
67
+ ### Principle: No silent failures
68
+
69
+ We coded the library this way because the data is embedded in the HTML - and it's a
70
+ pain in the butt to manually check for errors. In my case, I manage 500,000 unique
71
+ pages in my Rails app. There's _no way_ I could place error-free structured data in
72
+ them without automatic validation.
73
+
74
+ `SchemaDotOrg` will validate your Ruby code, and if it's correct, will generate Schema.org JSON-LD markup when `#to_s`
75
+ is called. If you, e.g., didn't add the correct attributes, you'll get a descriptive error message pointing
76
+ you to the problem.
67
77
 
68
- Notice how the `foundingDate` is in the required ISO-8601 format. [The founding date must be a Ruby
69
- Date object](https://github.com/dogweather/schema-dot-org/blob/master/lib/schema_dot_org/organization.rb#L11) and so we can ensure correct formatting. In the same way, the `foundingLocation` is a `Place`
70
- which adds the proper `@type` attribute.
78
+ Notice how the `foundingDate` is in the required ISO-8601 format. In the same way, the `foundingLocation` is a `Place`
79
+ which adds the proper `@type` attribute. All Ruby snake-case names have been converted to the Schema.org standard camel-case.
80
+ Etc., etc.
71
81
 
72
82
  ### You are prevented from creating invalid markup
73
83
 
84
+ If your page loads, you know your markup is good.
85
+
74
86
  If you use the wrong type or try to set an unknown attribute, SchemaDotOrg will
75
87
  refuse to create the incorrect JSON-LD. Instead, you'll get a message explaining
76
88
  the problem:
@@ -86,15 +98,18 @@ Place.new(
86
98
  # => NoMethodError: undefined method `author'
87
99
  ```
88
100
 
89
- This type safety comes from the [ValidatedObject gem](https://github.com/dogweather/validated_object).
101
+ In my experience, I never get errors from the lib. I code it once, it works, and then
102
+ I move on to other things.
103
+
104
+ > This automatic validation comes from my [ValidatedObject gem](https://github.com/dogweather/validated_object), which in turn,
105
+ > is a thin wrapper around ActiveRecord::Validations. So there's nothing magical going on here.
90
106
 
91
107
  ## Supported Schema.org Types
92
108
 
93
109
  AggregateOffer, ContactPoint, ItemList, ListItem, Offer, Organization, Person, Place,
94
110
  Product, SearchAction, and WebSite.
95
111
 
96
- Here are a few example. The source code for these is **extremely easy** to read. Check them out to see
97
- all the available attributes.
112
+ Here are a few examples. [The source code for these is extremely easy to read.](https://github.com/dogweather/schema-dot-org/tree/master/lib/schema_dot_org) Check them out to see all the available attributes.
98
113
 
99
114
  ### WebSite
100
115
 
@@ -140,9 +155,6 @@ Organization.new(
140
155
  )
141
156
  ```
142
157
 
143
- ### Person, Place, and SearchAction
144
-
145
- These three aren't too useful on their own in web apps. They're used when creating a `WebSite` and `Organization`, as shown above.
146
158
 
147
159
  ## Installation
148
160
 
@@ -154,8 +166,8 @@ gem 'schema_dot_org'
154
166
 
155
167
  ## Development
156
168
 
157
- The Schema.org classes are as DRY as I could possibly make them. They're really
158
- easy to create and add to. For example, `Product`:
169
+ The coding is as DRY as I could possibly make it. I think it's really
170
+ easy to create and add to. For example, here's `Product`:
159
171
 
160
172
  ```ruby
161
173
  class Product < SchemaType
@@ -179,4 +191,4 @@ Bug reports and pull requests are welcome on GitHub.
179
191
 
180
192
  ## License
181
193
 
182
- [The](The) gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
194
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -1,10 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'date'
4
- require 'schema_dot_org'
5
- require 'schema_dot_org/offer'
6
-
7
- # Model the Schema.org `Thing > Place`. See https://schema.org/Offer
3
+ #
4
+ # Model the Schema.org `Thing > Intangible > Offer > AggregateOffer`. See https://schema.org/Offer
8
5
  #
9
6
  module SchemaDotOrg
10
7
  class AggregateOffer < SchemaType
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+
4
+ #
5
+ # https://schema.org/CollegeOrUniversity
6
+ #
7
+ module SchemaDotOrg
8
+ class CollegeOrUniversity < SchemaType
9
+ validated_attr :name, type: String, presence: true
10
+ validated_attr :url, type: String, allow_nil: true
11
+ end
12
+ end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'schema_dot_org'
4
-
5
3
 
6
4
  #
7
5
  # Model the Schema.org `ContactPoint`. See http://schema.org/ContactPoint
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'schema_dot_org'
4
3
 
5
4
  #
6
5
  # Model the Schema.org `ItemList`. See https://schema.org/ItemList
@@ -1,16 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'schema_dot_org'
4
- require 'schema_dot_org/product'
5
3
 
4
+ require_relative 'product'
6
5
 
6
+ #
7
+ # Model the Schema.org `ItemListElement`. See https://schema.org/ItemListElement
8
+ #
7
9
  module SchemaDotOrg
8
- # Model the Schema.org `ItemListElement`. See https://schema.org/ItemListElement
9
10
  class ListItem < SchemaType
10
- validated_attr :image, type: String, allow_nil: true
11
- validated_attr :item, type: Product, allow_nil: true
12
- validated_attr :name, type: String, allow_nil: true
13
- validated_attr :position, type: Integer, presence: true
14
- validated_attr :url, type: String, allow_nil: true
11
+ validated_attr :image, type: String, allow_nil: true
12
+ validated_attr :item, type: SchemaDotOrg::Product, allow_nil: true
13
+ validated_attr :name, type: String, allow_nil: true
14
+ validated_attr :position, type: Integer, presence: true
15
+ validated_attr :url, type: String, allow_nil: true
15
16
  end
16
17
  end
@@ -1,10 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'date'
4
- require 'schema_dot_org'
5
3
 
6
4
  #
7
- # Model the Schema.org `Thing > Place`. See https://schema.org/Offer
5
+ # Model the Schema.org `Thing > Intangible > Offer`. See https://schema.org/Offer
8
6
  #
9
7
  module SchemaDotOrg
10
8
  class Offer < SchemaType
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'date'
4
- require 'schema_dot_org'
5
- require 'schema_dot_org/person'
6
- require 'schema_dot_org/place'
7
- require 'schema_dot_org/contact_point'
8
4
 
5
+ require_relative 'person'
6
+ require_relative 'place'
7
+
8
+ # Google allows `url` to be a string:
9
+ # https://developers.google.com/search/docs/appearance/structured-data/logo
9
10
 
10
11
  module SchemaDotOrg
11
12
  class Organization < SchemaType
@@ -14,9 +15,11 @@ module SchemaDotOrg
14
15
  validated_attr :founder, type: SchemaDotOrg::Person, allow_nil: true
15
16
  validated_attr :founding_date, type: Date, allow_nil: true
16
17
  validated_attr :founding_location, type: SchemaDotOrg::Place, allow_nil: true
18
+ validated_attr :legal_name, type: String, allow_nil: true
17
19
  validated_attr :logo, type: String
18
20
  validated_attr :name, type: String
19
21
  validated_attr :same_as, type: Array, allow_nil: true
22
+ validated_attr :slogan, type: String, allow_nil: true
20
23
  validated_attr :telephone, type: String, allow_nil: true
21
24
  validated_attr :url, type: String
22
25
  end
@@ -1,12 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+
3
4
  #
4
5
  # Model the Schema.org **Person**. See http://schema.org/Person
5
6
  #
6
7
  module SchemaDotOrg
7
8
  class Person < SchemaType
8
- validated_attr :name, type: String, presence: true
9
- validated_attr :same_as, type: Array, allow_nil: true
10
- validated_attr :url, type: String, allow_nil: true
9
+ validated_attr :award, type: String, allow_nil: true
10
+ validated_attr :alumni_of, type: SchemaDotOrg::CollegeOrUniversity, allow_nil: true
11
+ validated_attr :honorific_suffix, type: String, allow_nil: true
12
+ validated_attr :name, type: String, presence: true
13
+ validated_attr :same_as, type: Array, allow_nil: true
14
+ validated_attr :url, type: String, allow_nil: true
11
15
  end
12
16
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+
3
4
  #
4
5
  # Model the Schema.org `Thing > Place`. See http://schema.org/Place
5
6
  #
@@ -1,11 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'date'
4
- require 'schema_dot_org'
5
- require 'schema_dot_org/aggregate_offer'
6
3
 
7
4
  #
8
- # Model the Schema.org `Thing > Place`. See https://schema.org/Product
5
+ # Model the Schema.org `Thing > Product`. See https://schema.org/Product
9
6
  #
10
7
  module SchemaDotOrg
11
8
  class Product < SchemaType
@@ -5,7 +5,7 @@
5
5
  # Model the Schema.org `Thing > SearchAction`. See http://schema.org/SearchAction
6
6
  #
7
7
  module SchemaDotOrg
8
- class SearchAction < SchemaType
8
+ class SearchAction < SchemaDotOrg::SchemaType
9
9
  validated_attr :query_input, type: String, presence: true
10
10
  validated_attr :target, type: String, presence: true
11
11
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+
3
4
  #
4
5
  # Model the Schema.org `Thing > CreativeWork > WebSite`.
5
6
  # @See http://schema.org/WebSite
@@ -1,16 +1,128 @@
1
1
  # frozen_string_literal: true
2
- require 'schema_dot_org/schema_type'
3
- require 'schema_dot_org/search_action'
4
- require 'schema_dot_org/web_site'
5
- require 'schema_dot_org/organization'
6
- require 'schema_dot_org/product'
2
+ require 'json'
3
+ require 'validated_object'
4
+
5
+ #
6
+ # Abstract base class for all the Schema.org types.
7
+ #
8
+ module SchemaDotOrg
9
+ class SchemaType < ValidatedObject::Base
10
+ ROOT_ATTR = { "@context" => "https://schema.org" }.freeze
11
+ UNQUALIFIED_CLASS_NAME_REGEX = /([^:]+)$/
12
+
13
+
14
+ def to_s
15
+ json_string = to_json_ld(pretty: (!rails_production? && !ENV['SCHEMA_DOT_ORG_MINIFIED_JSON']))
16
+
17
+ # Mark as safe if we're in Rails
18
+ if json_string.respond_to?(:html_safe)
19
+ json_string.html_safe
20
+ else
21
+ json_string
22
+ end
23
+ end
24
+
25
+
26
+ def to_json_ld(pretty: false)
27
+ "<script type=\"application/ld+json\">\n" + to_json(pretty: pretty, as_root: true) + "\n</script>"
28
+ end
29
+
30
+
31
+ def to_json(pretty: false, as_root: false)
32
+ structure = as_root ? ROOT_ATTR.merge(to_json_struct) : to_json_struct
33
+
34
+ if pretty
35
+ JSON.pretty_generate(structure)
36
+ else
37
+ structure.to_json
38
+ end
39
+ end
40
+
41
+
42
+ # Use the class name to create the "@type" attribute.
43
+ # @return a hash structure representing json.
44
+ def to_json_struct
45
+ { "@type" => un_namespaced_classname }.merge(_to_json_struct.reject { |_, v| v.blank? })
46
+ end
47
+
48
+
49
+ def _to_json_struct
50
+ attrs_and_values
51
+ end
52
+
53
+
54
+ # @return the classname without the module namespace.
55
+ def un_namespaced_classname
56
+ self.class.name =~ UNQUALIFIED_CLASS_NAME_REGEX
57
+ Regexp.last_match(1)
58
+ end
59
+
60
+
61
+ def object_to_json_struct(object)
62
+ return nil unless object
63
+ object.to_json_struct
64
+ end
65
+
66
+
67
+ def attrs_and_values
68
+ attrs.map do |attr|
69
+ # Clean up and andle the `query-input` attribute, which
70
+ # doesn't follow the normal camelCase convention.
71
+ attr_name = snake_case_to_lower_camel_case(attr.to_s.delete_prefix('@')).sub('queryInput', 'query-input')
72
+ attr_value = instance_variable_get(attr)
73
+
74
+ [attr_name, resolve_value(attr_value)]
75
+ end.to_h
76
+ end
77
+
78
+
79
+ def resolve_value(value)
80
+ if value.is_a?(Array)
81
+ value.map { |v| resolve_value(v) }
82
+
83
+ elsif value.is_a?(Date)
84
+ value.to_s
85
+
86
+ elsif is_schema_type?(value)
87
+ value.to_json_struct
88
+
89
+ else
90
+ value
91
+ end
92
+ end
93
+
94
+
95
+ def snake_case_to_lower_camel_case(snake_case)
96
+ snake_case.to_s.split('_').map.with_index { |s, i| i.zero? ? s : s.capitalize }.join
97
+ end
98
+
99
+
100
+ def attrs
101
+ instance_variables.reject{ |v| [:@validation_context, :@errors].include?(v) }
102
+ end
103
+
104
+
105
+ def is_schema_type?(object)
106
+ object.class.module_parent == SchemaDotOrg
107
+ end
108
+
109
+
110
+ def rails_production?
111
+ defined?(Rails) && Rails.env.production?
112
+ end
113
+ end
114
+ end
115
+
116
+
117
+ require 'schema_dot_org/aggregate_offer'
118
+ require 'schema_dot_org/college_or_university'
119
+ require 'schema_dot_org/contact_point'
7
120
  require 'schema_dot_org/item_list'
8
121
  require 'schema_dot_org/list_item'
122
+ require 'schema_dot_org/organization'
9
123
  require 'schema_dot_org/person'
10
124
  require 'schema_dot_org/place'
11
- require 'schema_dot_org/aggregate_offer'
125
+ require 'schema_dot_org/product'
12
126
  require 'schema_dot_org/offer'
13
- require 'schema_dot_org/contact_point'
14
-
15
- module SchemaDotOrg
16
- end
127
+ require 'schema_dot_org/search_action'
128
+ require 'schema_dot_org/web_site'
@@ -7,7 +7,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
7
7
  Gem::Specification.new do |spec|
8
8
  spec.required_ruby_version = '>= 2.6'
9
9
  spec.name = 'schema_dot_org'
10
- spec.version = '2.2.1'
10
+ spec.version = '2.2.3'
11
11
  spec.authors = ['Robb Shecter']
12
12
  spec.email = ['robb@public.law']
13
13
 
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: 2.2.1
4
+ version: 2.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robb Shecter
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-10-12 00:00:00.000000000 Z
11
+ date: 2023-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: validated_object
@@ -87,6 +87,7 @@ files:
87
87
  - bin/tapioca
88
88
  - lib/schema_dot_org.rb
89
89
  - lib/schema_dot_org/aggregate_offer.rb
90
+ - lib/schema_dot_org/college_or_university.rb
90
91
  - lib/schema_dot_org/contact_point.rb
91
92
  - lib/schema_dot_org/item_list.rb
92
93
  - lib/schema_dot_org/list_item.rb
@@ -95,7 +96,6 @@ files:
95
96
  - lib/schema_dot_org/person.rb
96
97
  - lib/schema_dot_org/place.rb
97
98
  - lib/schema_dot_org/product.rb
98
- - lib/schema_dot_org/schema_type.rb
99
99
  - lib/schema_dot_org/search_action.rb
100
100
  - lib/schema_dot_org/web_site.rb
101
101
  - schema_dot_org.gemspec
@@ -1,110 +0,0 @@
1
- require 'json'
2
- require 'validated_object'
3
-
4
- module SchemaDotOrg
5
- class SchemaType < ValidatedObject::Base
6
- ROOT_ATTR = { "@context" => "http://schema.org" }.freeze
7
- UNQUALIFIED_CLASS_NAME_REGEX = /([^:]+)$/
8
-
9
-
10
- def to_s
11
- json_string = to_json_ld(pretty: (!rails_production? && !ENV['SCHEMA_DOT_ORG_MINIFIED_JSON']))
12
-
13
- # Mark as safe if we're in Rails
14
- if json_string.respond_to?(:html_safe)
15
- json_string.html_safe
16
- else
17
- json_string
18
- end
19
- end
20
-
21
-
22
- def to_json_ld(pretty: false)
23
- "<script type=\"application/ld+json\">\n" + to_json(pretty: pretty, as_root: true) + "\n</script>"
24
- end
25
-
26
-
27
- def to_json(pretty: false, as_root: false)
28
- structure = as_root ? ROOT_ATTR.merge(to_json_struct) : to_json_struct
29
-
30
- if pretty
31
- JSON.pretty_generate(structure)
32
- else
33
- structure.to_json
34
- end
35
- end
36
-
37
-
38
- # Use the class name to create the "@type" attribute.
39
- # @return a hash structure representing json.
40
- def to_json_struct
41
- { "@type" => un_namespaced_classname }.merge(_to_json_struct.reject { |_, v| v.blank? })
42
- end
43
-
44
-
45
- def _to_json_struct
46
- attrs_and_values
47
- end
48
-
49
-
50
- # @return the classname without the module namespace.
51
- def un_namespaced_classname
52
- self.class.name =~ UNQUALIFIED_CLASS_NAME_REGEX
53
- Regexp.last_match(1)
54
- end
55
-
56
-
57
- def object_to_json_struct(object)
58
- return nil unless object
59
- object.to_json_struct
60
- end
61
-
62
-
63
- def attrs_and_values
64
- attrs.map do |attr|
65
- # Clean up and andle the `query-input` attribute, which
66
- # doesn't follow the normal camelCase convention.
67
- attr_name = snake_case_to_lower_camel_case(attr.to_s.delete_prefix('@')).sub('queryInput', 'query-input')
68
- attr_value = instance_variable_get(attr)
69
-
70
- [attr_name, resolve_value(attr_value)]
71
- end.to_h
72
- end
73
-
74
-
75
- def resolve_value(value)
76
- if value.is_a?(Array)
77
- value.map { |v| resolve_value(v) }
78
-
79
- elsif value.is_a?(Date)
80
- value.to_s
81
-
82
- elsif is_schema_type?(value)
83
- value.to_json_struct
84
-
85
- else
86
- value
87
- end
88
- end
89
-
90
-
91
- def snake_case_to_lower_camel_case(snake_case)
92
- snake_case.to_s.split('_').map.with_index { |s, i| i.zero? ? s : s.capitalize }.join
93
- end
94
-
95
-
96
- def attrs
97
- instance_variables.reject{ |v| [:@validation_context, :@errors].include?(v) }
98
- end
99
-
100
-
101
- def is_schema_type?(object)
102
- object.class.module_parent == SchemaDotOrg
103
- end
104
-
105
-
106
- def rails_production?
107
- defined?(Rails) && Rails.env.production?
108
- end
109
- end
110
- end