izi_json_ld 1.0.1 → 1.0.6

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.
Files changed (45) hide show
  1. checksums.yaml +5 -5
  2. data/app/entities/aggregate_rating_entity.rb +3 -1
  3. data/app/entities/answer_entity.rb +7 -0
  4. data/app/entities/application_entity.rb +54 -7
  5. data/app/entities/article_entity.rb +16 -0
  6. data/app/entities/breadcrumb_list_entity.rb +7 -0
  7. data/app/entities/faq_page_entity.rb +8 -0
  8. data/app/entities/image_object_entity.rb +6 -0
  9. data/app/entities/list_item_entity.rb +9 -0
  10. data/app/entities/offer_entity.rb +2 -1
  11. data/app/entities/organization_entity.rb +10 -0
  12. data/app/entities/person_entity.rb +14 -0
  13. data/app/entities/product_entity.rb +2 -2
  14. data/app/entities/question_entity.rb +19 -0
  15. data/app/entities/rating_entity.rb +1 -1
  16. data/app/entities/review_entity.rb +3 -3
  17. data/app/entities/web_page_entity.rb +11 -0
  18. data/lib/izi_json_ld/types.rb +3 -0
  19. data/lib/izi_json_ld/types/date_time.rb +11 -0
  20. data/lib/izi_json_ld/types/one_or_more.rb +13 -0
  21. data/lib/izi_json_ld/version.rb +1 -1
  22. data/spec/dummy/config/application.rb +5 -1
  23. data/spec/dummy/config/environments/test.rb +9 -7
  24. data/spec/dummy/db/development.sqlite3 +0 -0
  25. data/spec/dummy/db/test.sqlite3 +0 -0
  26. data/spec/dummy/log/development.log +16 -0
  27. data/spec/dummy/log/test.log +17813 -0
  28. data/spec/entities/aggregate_rating_entity_spec.rb +2 -1
  29. data/spec/entities/article_entity_spec.rb +113 -0
  30. data/spec/entities/breadcrumb_list_entity_spec.rb +55 -0
  31. data/spec/entities/faq_page_entity_spec.rb +75 -0
  32. data/spec/entities/product_entity_spec.rb +52 -0
  33. data/spec/rails_helper.rb +1 -17
  34. metadata +24 -24
  35. data/app/entities/service_entity.rb +0 -10
  36. data/spec/dummy/Gemfile +0 -14
  37. data/spec/dummy/Gemfile.lock +0 -229
  38. data/spec/dummy/app/models/application_record.rb +0 -3
  39. data/spec/dummy/bin/_guard-core +0 -29
  40. data/spec/dummy/bin/guard +0 -29
  41. data/spec/dummy/bin/rails +0 -4
  42. data/spec/dummy/bin/rake +0 -4
  43. data/spec/dummy/bin/rspec +0 -29
  44. data/spec/dummy/bin/setup +0 -33
  45. data/spec/entities/service_entity_spec.rb +0 -62
@@ -23,7 +23,8 @@ RSpec.describe AggregateRatingEntity do
23
23
 
24
24
  [
25
25
  ['bestRating', 5],
26
- ['worstRating', 1]
26
+ ['worstRating', 1],
27
+ ['reviewCount', 1]
27
28
  ].each do |(field, value)|
28
29
  it "should have default #{field}" do
29
30
  expect(item.as_json).to have_key field
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe ArticleEntity do
4
+ let(:item) do
5
+ described_class.new(
6
+ headline: 'Test Article Title',
7
+ mainEntityOfPage: {
8
+ web_page: 'https://exampla.com/blog/page'
9
+ }
10
+ )
11
+ end
12
+
13
+ it 'should be searializable as hash' do
14
+ expect(item.as_json).to be_present
15
+ end
16
+
17
+ it 'should have @type' do
18
+ expect(item.as_json).to have_key '@type'
19
+ expect(item.as_json['@type']).to be_present
20
+ expect(item.as_json['@type']).to eq 'Article'
21
+ end
22
+
23
+ it 'should have @context at root entity' do
24
+ expect(item.as_json).to have_key '@context'
25
+ expect(item.as_json['@context']).to be_present
26
+ expect(item.as_json['@context']).to include 'schema.org'
27
+ end
28
+
29
+ it 'possible to set mainEntityOfPage as URL' do
30
+ custom = described_class.new(headline: 'Title', mainEntityOfPage: 'https://exampla.com/blog/page')
31
+ expect(custom.as_json.dig('mainEntityOfPage')).to be_present
32
+ expect(custom.as_json.dig('mainEntityOfPage')).to eq 'https://exampla.com/blog/page'
33
+ end
34
+
35
+ context 'filled Article' do
36
+ let(:item) do
37
+ described_class.new(
38
+ mainEntityOfPage: {
39
+ web_page: 'https://exampla.com/blog/page'
40
+ },
41
+ headline: 'Test Article Title',
42
+ description: 'Test Article Description',
43
+ image: 'https://exampla.com/blog/page.png',
44
+ author: { name: 'TestUser' },
45
+ publisher: {
46
+ name: 'TestInc',
47
+ logo: { url: 'https://exampla.com/logo.png' }
48
+ },
49
+ datePublished: 1.week.ago,
50
+ dateModified: 2.days.ago
51
+ )
52
+ end
53
+
54
+ it 'should not fail' do
55
+ expect do
56
+ item.dump
57
+ item.as_json
58
+ item.to_json
59
+ end.not_to raise_exception
60
+ end
61
+
62
+ [
63
+ ['Publisher name', %w[publisher name], 'TestInc'],
64
+ ['Main Entity id', %w[mainEntityOfPage @id], 'https://exampla.com/blog/page'],
65
+ ['Publisher type', %w[publisher @type], 'Organization'],
66
+ ['Publisher logo type', %w[publisher logo @type], 'ImageObject'],
67
+ ['Publisher logo', %w[publisher logo url], 'https://exampla.com/logo.png'],
68
+ ['Post image', %w[image], 'https://exampla.com/blog/page.png'],
69
+ ['Author as org', %w[author @type], 'Organization'],
70
+ ['Author name', %w[author name], 'TestUser']
71
+ ].each do |(desc, path, val)|
72
+ it "should render #{desc}[#{path.join('.')}]" do
73
+ expect(item.as_json.dig(*path)).to be_present
74
+ expect(item.as_json.dig(*path)).to eq val
75
+ end
76
+ end
77
+ end
78
+
79
+ context 'with author as a Person' do
80
+ let(:item) do
81
+ described_class.new(
82
+ mainEntityOfPage: {
83
+ web_page: 'https://exampla.com/blog/page'
84
+ },
85
+ headline: 'Test Article Title',
86
+ publisher: {
87
+ person_name: 'SiteOwner',
88
+ email: 'site.owner@example.com',
89
+ image: 'owner.png'
90
+ },
91
+ author: {
92
+ person_name: 'TestBlogger',
93
+ image: 'blogger.png'
94
+ }
95
+ )
96
+ end
97
+
98
+ [
99
+ ['Publisher as person', %w[publisher @type], 'Person'],
100
+ ['Publisher name', %w[publisher name], 'SiteOwner'],
101
+ ['Publisher email', %w[publisher email], 'site.owner@example.com'],
102
+ ['Publisher image', %w[publisher image], 'owner.png'],
103
+ ['Author as person', %w[author @type], 'Person'],
104
+ ['Author name', %w[author name], 'TestBlogger'],
105
+ ['Author image', %w[author image], 'blogger.png']
106
+ ].each do |(desc, path, val)|
107
+ it "should render #{desc}[#{path.join('.')}]" do
108
+ expect(item.as_json.dig(*path)).to be_present
109
+ expect(item.as_json.dig(*path)).to eq val
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe BreadcrumbListEntity do
4
+ let(:item) { described_class.new(itemListElement: []) }
5
+
6
+ it 'should be searializable as hash' do
7
+ expect(item.as_json).to be_present
8
+ end
9
+
10
+ it 'should have @type' do
11
+ expect(item.as_json).to have_key '@type'
12
+ expect(item.as_json['@type']).to be_present
13
+ expect(item.as_json['@type']).to eq 'BreadcrumbList'
14
+ end
15
+
16
+ it 'should have @context at root entity' do
17
+ expect(item.as_json).to have_key '@context'
18
+ expect(item.as_json['@context']).to be_present
19
+ expect(item.as_json['@context']).to include 'schema.org'
20
+ end
21
+
22
+ context 'with simple item' do
23
+ let(:item) do
24
+ described_class.new(itemListElement: { name: 'Home', position: 0, item: 'https://example.com' })
25
+ end
26
+
27
+ it 'should not fail' do
28
+ expect do
29
+ item.dump
30
+ item.as_json
31
+ item.to_json
32
+ end.not_to raise_exception
33
+ end
34
+ end
35
+
36
+ context 'with multiple items' do
37
+ let(:item) do
38
+ described_class.new(
39
+ itemListElement: [
40
+ { name: 'Home', position: 0, item: 'https://example.com' },
41
+ { name: 'Blog', position: 1, item: 'https://example.com/blog' },
42
+ { name: 'Post', position: 2, item: 'https://example.com/blog/post' },
43
+ ]
44
+ )
45
+ end
46
+
47
+ it 'should not fail' do
48
+ expect do
49
+ item.dump
50
+ item.as_json
51
+ item.to_json
52
+ end.not_to raise_exception
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe FaqPageEntity do
4
+ let(:item) { described_class.new(mainEntity: []) }
5
+
6
+ it 'should be searializable as hash' do
7
+ expect(item.as_json).to be_present
8
+ end
9
+
10
+ it 'should be searializable as string' do
11
+ expect(item.to_json).to be_present
12
+ end
13
+
14
+ it 'should return html_safe string' do
15
+ expect(item.to_json).to be_html_safe
16
+ end
17
+
18
+ it 'should have @type' do
19
+ expect(item.as_json).to have_key '@type'
20
+ expect(item.as_json['@type']).to be_present
21
+ expect(item.as_json['@type']).to eq 'FAQPage'
22
+ end
23
+
24
+ context 'filled' do
25
+ let(:item) do
26
+ described_class.new(
27
+ mainEntity: [
28
+ { name: 'Question 1', acceptedAnswer: { text: 'Test answer 1' } },
29
+ { name: 'Question 2', acceptedAnswer: { text: 'Test answer 2' } },
30
+ { name: 'Question 3', acceptedAnswer: { text: 'Test answer 3' } }
31
+ ]
32
+ )
33
+ end
34
+ let(:singular) do
35
+ described_class.new(
36
+ mainEntity: {
37
+ name: 'Sing-Question', acceptedAnswer: { text: 'Sing-Answer' }
38
+ }
39
+ )
40
+ end
41
+ let(:shortland) do
42
+ described_class.new(
43
+ mainEntity: [
44
+ { name: 'ShortQuestion', answer: 'ShortAnswer' }
45
+ ]
46
+ )
47
+ end
48
+
49
+ it 'should render items' do
50
+ expect(item.as_json).to have_key 'mainEntity'
51
+ expect(item.as_json['mainEntity']).to be_present
52
+ expect(item.as_json['mainEntity'].size).to eq 3
53
+ end
54
+
55
+ it 'should render answer properly' do
56
+ answer = item.as_json.dig('mainEntity', 0)
57
+ expect(answer['name']).to eq 'Question 1'
58
+ expect(answer.dig('acceptedAnswer', 'text')).to eq 'Test answer 1'
59
+ end
60
+
61
+ it 'should render singular' do
62
+ answer = singular.as_json['mainEntity']
63
+ expect(answer['name']).to eq 'Sing-Question'
64
+ expect(answer.dig('acceptedAnswer', 'text')).to eq 'Sing-Answer'
65
+ end
66
+
67
+ it 'should accept name/answer shortland items' do
68
+ answer = shortland.as_json.dig('mainEntity', 0)
69
+
70
+ expect(answer).to be_present
71
+ expect(answer['name']).to eq 'ShortQuestion'
72
+ expect(answer.dig('acceptedAnswer', 'text')).to eq 'ShortAnswer'
73
+ end
74
+ end
75
+ end
@@ -35,6 +35,12 @@ RSpec.describe ProductEntity do
35
35
  expect(item.as_json['aggregateRating']).to be_present
36
36
  expect(item.as_json.dig('aggregateRating', 'ratingValue')).to eq 4
37
37
  end
38
+
39
+ it 'should have aggregateRating @type' do
40
+ expect(item.as_json).to have_key 'aggregateRating'
41
+ expect(item.as_json['aggregateRating']).to be_present
42
+ expect(item.as_json.dig('aggregateRating', '@type')).to eq 'AggregateRating'
43
+ end
38
44
  end
39
45
 
40
46
  context 'with offers' do
@@ -45,5 +51,51 @@ RSpec.describe ProductEntity do
45
51
  expect(item.as_json['offers']).to be_present
46
52
  expect(item.as_json.dig('offers', 'url')).to eq 'test'
47
53
  end
54
+
55
+ it 'offers should have right @type' do
56
+ expect(item.as_json).to have_key 'offers'
57
+ expect(item.as_json['offers']).to be_present
58
+ expect(item.as_json.dig('offers', '@type')).to eq 'Offer'
59
+ end
60
+ end
61
+
62
+ context 'with review' do
63
+ let(:review) { { author: 'test', reviewRating: { ratingValue: 2 } } }
64
+ let(:reviews) do
65
+ [
66
+ { author: 'test', reviewRating: { ratingValue: 2 } },
67
+ { author: 'test2', reviewRating: { ratingValue: 3 } },
68
+ { author: 'test3', reviewRating: { ratingValue: 4 } }
69
+ ]
70
+ end
71
+
72
+ it 'should allow create product with single review' do
73
+ data = described_class.new(name: 'Test', review: review)
74
+ expect(data.to_json).to be_present
75
+ expect(data.as_json['review']).to be_present
76
+ expect(data.as_json['review'].class.name).to eq 'Hash'
77
+ end
78
+
79
+ it 'should allow create product with single review' do
80
+ data = described_class.new(name: 'Test', review: reviews)
81
+ expect(data.to_json).to be_present
82
+ expect(data.as_json['review']).to be_present
83
+ expect(data.as_json['review'].class.name).to eq 'Array'
84
+ end
85
+
86
+ it 'review & reviewRating should contain right @type' do
87
+ data = described_class.new(name: 'Test', review: reviews)
88
+ expect(data.as_json.dig('review', 0, '@type')).to eq 'Review'
89
+ expect(data.as_json.dig('review', 0, 'reviewRating', '@type')).to eq 'Rating'
90
+ end
91
+
92
+ it 'ensure proper serialization' do
93
+ data = described_class.new(name: 'Test', review: reviews)
94
+ raw = data.to_json
95
+ parsed = JSON.parse(raw)
96
+ expect(parsed).to be_present
97
+ expect(parsed.dig('review', 0, '@type')).to eq 'Review'
98
+ expect(parsed.dig('review', 0, 'reviewRating', '@type')).to eq 'Rating'
99
+ end
48
100
  end
49
101
  end
data/spec/rails_helper.rb CHANGED
@@ -22,25 +22,9 @@ require 'rspec/rails'
22
22
  #
23
23
  # Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }
24
24
 
25
- # Checks for pending migrations and applies them before tests are run.
26
- # If you are not using ActiveRecord, you can remove these lines.
27
- begin
28
- ActiveRecord::Migration.maintain_test_schema!
29
- rescue ActiveRecord::PendingMigrationError => e
30
- puts e.to_s.strip
31
- exit 1
32
- end
33
25
  RSpec.configure do |config|
34
- # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
35
- config.fixture_path = "#{::Rails.root}/spec/fixtures"
36
-
37
- # If you're not using ActiveRecord, or you'd prefer not to run each of your
38
- # examples within a transaction, remove the following line or assign false
39
- # instead of true.
40
- config.use_transactional_fixtures = true
41
-
42
26
  # You can uncomment this line to turn off ActiveRecord support entirely.
43
- # config.use_active_record = false
27
+ config.use_active_record = false
44
28
 
45
29
  # RSpec Rails can automatically mix in different behaviours to your tests
46
30
  # based on their file location, for example enabling you to call `get` and
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: izi_json_ld
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - IzikAJ
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-15 00:00:00.000000000 Z
11
+ date: 2021-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-struct
@@ -48,32 +48,34 @@ extra_rdoc_files: []
48
48
  files:
49
49
  - README.rdoc
50
50
  - app/entities/aggregate_rating_entity.rb
51
+ - app/entities/answer_entity.rb
51
52
  - app/entities/application_entity.rb
53
+ - app/entities/article_entity.rb
54
+ - app/entities/breadcrumb_list_entity.rb
55
+ - app/entities/faq_page_entity.rb
56
+ - app/entities/image_object_entity.rb
57
+ - app/entities/list_item_entity.rb
52
58
  - app/entities/offer_entity.rb
59
+ - app/entities/organization_entity.rb
60
+ - app/entities/person_entity.rb
53
61
  - app/entities/product_entity.rb
62
+ - app/entities/question_entity.rb
54
63
  - app/entities/rating_entity.rb
55
64
  - app/entities/review_entity.rb
56
- - app/entities/service_entity.rb
65
+ - app/entities/web_page_entity.rb
57
66
  - app/helpers/json_ld_helper.rb
58
67
  - lib/izi_json_ld.rb
59
68
  - lib/izi_json_ld/engine.rb
60
69
  - lib/izi_json_ld/extentions/autoload_paths.rb
61
70
  - lib/izi_json_ld/types.rb
71
+ - lib/izi_json_ld/types/date_time.rb
72
+ - lib/izi_json_ld/types/one_or_more.rb
62
73
  - lib/izi_json_ld/version.rb
63
- - spec/dummy/Gemfile
64
- - spec/dummy/Gemfile.lock
65
74
  - spec/dummy/Rakefile
66
75
  - spec/dummy/app/assets/config/manifest.js
67
76
  - spec/dummy/app/controllers/application_controller.rb
68
77
  - spec/dummy/app/helpers/application_helper.rb
69
- - spec/dummy/app/models/application_record.rb
70
78
  - spec/dummy/app/views/layouts/application.html.erb
71
- - spec/dummy/bin/_guard-core
72
- - spec/dummy/bin/guard
73
- - spec/dummy/bin/rails
74
- - spec/dummy/bin/rake
75
- - spec/dummy/bin/rspec
76
- - spec/dummy/bin/setup
77
79
  - spec/dummy/config.ru
78
80
  - spec/dummy/config/application.rb
79
81
  - spec/dummy/config/boot.rb
@@ -89,16 +91,19 @@ files:
89
91
  - spec/dummy/config/initializers/wrap_parameters.rb
90
92
  - spec/dummy/config/puma.rb
91
93
  - spec/dummy/config/routes.rb
94
+ - spec/dummy/db/development.sqlite3
92
95
  - spec/dummy/db/test.sqlite3
93
96
  - spec/dummy/log/development.log
94
97
  - spec/dummy/log/test.log
95
98
  - spec/dummy/tmp/development_secret.txt
96
99
  - spec/entities/aggregate_rating_entity_spec.rb
100
+ - spec/entities/article_entity_spec.rb
101
+ - spec/entities/breadcrumb_list_entity_spec.rb
102
+ - spec/entities/faq_page_entity_spec.rb
97
103
  - spec/entities/offer_entity_spec.rb
98
104
  - spec/entities/product_entity_spec.rb
99
105
  - spec/entities/rating_entity_spec.rb
100
106
  - spec/entities/review_entity_spec.rb
101
- - spec/entities/service_entity_spec.rb
102
107
  - spec/rails_helper.rb
103
108
  - spec/spec_helper.rb
104
109
  homepage: https://bitbucket.org/netfixllc/izi_json_ld
@@ -120,23 +125,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
125
  - !ruby/object:Gem::Version
121
126
  version: '0'
122
127
  requirements: []
123
- rubygems_version: 3.1.2
128
+ rubyforge_project:
129
+ rubygems_version: 2.6.14.4
124
130
  signing_key:
125
131
  specification_version: 4
126
132
  summary: Izi Lightup
127
133
  test_files:
128
134
  - spec/spec_helper.rb
129
- - spec/dummy/app/models/application_record.rb
130
135
  - spec/dummy/app/controllers/application_controller.rb
131
136
  - spec/dummy/app/views/layouts/application.html.erb
132
137
  - spec/dummy/app/assets/config/manifest.js
133
138
  - spec/dummy/app/helpers/application_helper.rb
134
- - spec/dummy/bin/rake
135
- - spec/dummy/bin/setup
136
- - spec/dummy/bin/_guard-core
137
- - spec/dummy/bin/guard
138
- - spec/dummy/bin/rspec
139
- - spec/dummy/bin/rails
140
139
  - spec/dummy/config/routes.rb
141
140
  - spec/dummy/config/environments/production.rb
142
141
  - spec/dummy/config/environments/development.rb
@@ -154,15 +153,16 @@ test_files:
154
153
  - spec/dummy/config.ru
155
154
  - spec/dummy/Rakefile
156
155
  - spec/dummy/db/test.sqlite3
157
- - spec/dummy/Gemfile
156
+ - spec/dummy/db/development.sqlite3
158
157
  - spec/dummy/log/test.log
159
158
  - spec/dummy/log/development.log
160
- - spec/dummy/Gemfile.lock
161
159
  - spec/dummy/tmp/development_secret.txt
162
160
  - spec/rails_helper.rb
163
161
  - spec/entities/aggregate_rating_entity_spec.rb
164
- - spec/entities/service_entity_spec.rb
165
162
  - spec/entities/review_entity_spec.rb
163
+ - spec/entities/breadcrumb_list_entity_spec.rb
164
+ - spec/entities/faq_page_entity_spec.rb
166
165
  - spec/entities/rating_entity_spec.rb
167
166
  - spec/entities/offer_entity_spec.rb
167
+ - spec/entities/article_entity_spec.rb
168
168
  - spec/entities/product_entity_spec.rb