contentstack_utils 0.1.0.pre.beta.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: df97218ab0794ad8c4adff69d4146df7e736eecb5b302c2f2bf8892e45c53262
4
+ data.tar.gz: 1112de7f8c3df79c172b623f1981e8de31d54c4ac3407e07aad5a5058f72ba1f
5
+ SHA512:
6
+ metadata.gz: 03d0dd9b13849d6f605855ec2e0bbdf551c0b02489bb38d8432747002639482db8188d065c53f9468367b7c9dba4654130927fdd1bf721d12576292853b4f868
7
+ data.tar.gz: 4e232dc32139bb1500fdfb6755710ba180d5492d1cda14ee3937af2b3a607c48fb3ba08fe5cf6bf742d8945bced1d7c8c01127d049d5f7760a146cef1abf30e5
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ contentstack-*
2
+ build_doc.sh
3
+ test
4
+ doc
5
+ spec-integration
6
+ coverage
7
+ \.yardoc
8
+ .DS_Store
9
+ .bundle/
10
+ */rspec_results.html
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.6
data/.yardopts ADDED
@@ -0,0 +1,3 @@
1
+ README.md
2
+ lib/contentstack_utils/*
3
+ lib/contentstack_utils.rb
data/CHANGELOG.md ADDED
@@ -0,0 +1,4 @@
1
+ # Changelog
2
+
3
+ ## [1.0.0](https://github.com/contentstack/contentstack-utils-ruby/tree/v1.0.0) (2021-04-02)
4
+ - Initial release for Contentstack Utils SDK
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ # Gemfile
2
+ source "https://rubygems.org"
3
+
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,76 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ contentstack_utils (1.0.0)
5
+ activesupport
6
+ nokogiri
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (6.1.0)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 1.6, < 2)
14
+ minitest (>= 5.1)
15
+ tzinfo (~> 2.0)
16
+ zeitwerk (~> 2.3)
17
+ addressable (2.7.0)
18
+ public_suffix (>= 2.0.2, < 5.0)
19
+ concurrent-ruby (1.1.7)
20
+ crack (0.4.5)
21
+ rexml
22
+ diff-lcs (1.4.4)
23
+ docile (1.3.4)
24
+ hashdiff (1.0.1)
25
+ i18n (1.8.7)
26
+ concurrent-ruby (~> 1.0)
27
+ mini_portile2 (2.5.0)
28
+ minitest (5.14.2)
29
+ nokogiri (1.11.0)
30
+ mini_portile2 (~> 2.5.0)
31
+ racc (~> 1.4)
32
+ public_suffix (4.0.6)
33
+ racc (1.5.2)
34
+ rake (13.0.3)
35
+ rexml (3.2.4)
36
+ rspec (3.10.0)
37
+ rspec-core (~> 3.10.0)
38
+ rspec-expectations (~> 3.10.0)
39
+ rspec-mocks (~> 3.10.0)
40
+ rspec-core (3.10.1)
41
+ rspec-support (~> 3.10.0)
42
+ rspec-expectations (3.10.1)
43
+ diff-lcs (>= 1.2.0, < 2.0)
44
+ rspec-support (~> 3.10.0)
45
+ rspec-mocks (3.10.1)
46
+ diff-lcs (>= 1.2.0, < 2.0)
47
+ rspec-support (~> 3.10.0)
48
+ rspec-support (3.10.1)
49
+ simplecov (0.21.1)
50
+ docile (~> 1.1)
51
+ simplecov-html (~> 0.11)
52
+ simplecov_json_formatter (~> 0.1)
53
+ simplecov-html (0.12.3)
54
+ simplecov_json_formatter (0.1.2)
55
+ tzinfo (2.0.4)
56
+ concurrent-ruby (~> 1.0)
57
+ webmock (3.11.0)
58
+ addressable (>= 2.3.6)
59
+ crack (>= 0.3.2)
60
+ hashdiff (>= 0.4.0, < 2.0.0)
61
+ yard (0.9.26)
62
+ zeitwerk (2.4.2)
63
+
64
+ PLATFORMS
65
+ ruby
66
+
67
+ DEPENDENCIES
68
+ contentstack_utils!
69
+ rake
70
+ rspec
71
+ simplecov
72
+ webmock
73
+ yard
74
+
75
+ BUNDLED WITH
76
+ 1.17.2
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2012-2021 Contentstack. All Rights Reserved
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # Contentstack Utils Ruby
2
+
3
+ Contentstack is a headless CMS with an API-first approach. It is a CMS that developers can use to build powerful cross-platform applications in their favorite languages. Build your application frontend, and Contentstack will take care of the rest. Read More.
4
+
5
+ This guide will help you get started with Contentstack Ruby Utils SDK to build apps powered by Contentstack.
6
+
7
+ ## Prerequisites
8
+
9
+ - Ruby version 2.0 or later
10
+
11
+ ## SDK Installation and Setup
12
+
13
+ To set up Ruby Utils SDK, install it via gem:
14
+ ```sh
15
+ gem install contentstack_utils
16
+ ```
17
+
18
+ > Note: If you are using Contentstack Ruby SDK, then “contentstack/utils” is already imported into your project.
19
+
20
+ ## Usage
21
+
22
+ Let’s learn how you can use Utils SDK to render embedded items.
23
+
24
+ ### Create Render Option:
25
+
26
+ To render embedded items on the front-end, use the render_option function, and define the UI elements you want to show in the front-end of your website, as shown in the example code below:
27
+ ```ruby
28
+ class CustomLOption < ContentstackUtils::Model::Option
29
+ def render_option(embeddedObject, metadata)
30
+ case metadata.style_type
31
+ when 'block'
32
+ if metadataArray.content_type_uid === 'product'
33
+ return "<div>
34
+ <h2 >#{embeddedObject["title"]}</h2>
35
+ <img src=#{embeddedObject["product_image"]["url"]} alt=#{embeddedObject["product_image"]["title"]}/>
36
+ <p>#{embeddedObject["price"]}</p>
37
+ </div>"
38
+ end
39
+ when 'inline'
40
+ return "<span><b>#{embeddedObject["title"]}</b> - #{embeddedObject["description"]}</span>"
41
+ when link
42
+ return "<a href='#{metadata.attributes["href"].value}'>#{metadata.text}</a>"
43
+ when 'display'
44
+ return "<img src='#{metadata.attributes["src"].value}' alt='#{metadata.alt}' />"
45
+ when download
46
+ return "<a href='#{metadata.attributes["href"].value}'>#{metadata.text}</a>"
47
+ end
48
+ super(embeddedObject, metadata)
49
+ end
50
+ end
51
+ ```
52
+ ## Basic Queries
53
+
54
+ Contentstack Utils SDK lets you interact with the Content Delivery APIs and retrieve embedded items from the RTE field of an entry.
55
+
56
+ ### Fetch Embedded Item(s) from a Single Entry:
57
+
58
+ To get an embedded item of a single entry, you need to provide the stack API key, environment name, delivery token, content type’s UID, and entry’s UID. Then, use the include_embedded_items function as shown below:
59
+ ```ruby
60
+ require 'contentstack'
61
+
62
+ @stack = Contentstack::Client.new('<API_KEY>', '<ENVIRONMENT_SPECIFIC_DELIVERY_TOKEN>', '<ENVIRONMENT>')
63
+ @entry = @stack.content_type('<CONTENT_TYPE>').entry('<ENTRY_UID>')
64
+ .include_embedded_items
65
+ .fetch
66
+
67
+ @rendered_rich_text = Contentstack.render_content(@entry.rte_field_uid, ContentstackUtils::Model::Option.new(@entry))
68
+ ```
69
+
70
+ If you want to render embedded items using the CustomOption function, you can refer to the code below:
71
+ ```ruby
72
+ @rendered_rich_text = Contentstack.render_content(@entry.rte_field_uid, CustomLOption.new(@entry))
73
+ ```
74
+ ### Fetch Embedded Item(s) from Multiple Entries
75
+
76
+ To get embedded items from multiple entries, you need to provide the stack API key, environment name, delivery token, and content type’s UID.
77
+ ```ruby
78
+ require 'contentstack'
79
+ @stack = Contentstack::Client.new('<API_KEY>', '<ENVIRONMENT_SPECIFIC_DELIVERY_TOKEN>', '<ENVIRONMENT>')
80
+ @query = @stack.content_type('<CONTENT_TYPE>').query
81
+ @entries = @query.where('title', 'welcome')
82
+ .include_embedded_items
83
+ .fetch
84
+
85
+ @entries.each do |entry|
86
+ Contentstack.render_content(@entry.rte_field_uid, ContentstackUtils::Model::Option.new(@entry))
87
+ end
88
+ ```
data/Rakefile ADDED
@@ -0,0 +1,33 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ require 'yard'
6
+ YARD::Rake::YardocTask.new do |t|
7
+ t.files = ['lib/contentstack_utils/*.rb', 'lib/contentstack_utils.rb'] # optional
8
+ end
9
+
10
+ require 'rspec/core/rake_task'
11
+ RSpec::Core::RakeTask.new(:spec) do |t|
12
+ t.pattern = Dir.glob('spec/**/*_spec.rb')
13
+ t.rspec_opts = '--format documentation'
14
+ end
15
+
16
+ require "rdoc/task"
17
+ task ghpages: :rdoc do
18
+ %x[git checkout gh-pages]
19
+ require "fileutils"
20
+ FileUtils.rm_rf "/tmp/html"
21
+ FileUtils.mv "html", "/tmp"
22
+ FileUtils.rm_rf "*"
23
+ FileUtils.cp_r Dir.glob("/tmp/html/*"), "."
24
+ end
25
+
26
+ RDoc::Task.new do |doc|
27
+ doc.main = "README.rdoc"
28
+ doc.title = "Rake -- Ruby Make"
29
+ doc.rdoc_files = FileList.new %w[lib LICENSE doc/**/*.rdoc *.rdoc]
30
+ doc.rdoc_dir = "html"
31
+ end
32
+
33
+ task default: :spec
@@ -0,0 +1,32 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ require 'contentstack_utils/version'
5
+ Gem::Specification.new do |s|
6
+ s.name = %q{contentstack_utils}
7
+ s.version = ContentstackUtils::VERSION.dup
8
+ s.date = Time.now
9
+ s.authors = [%q{Contentstack}]
10
+ s.email = ["support@contentstack.com"]
11
+
12
+ s.required_ruby_version = '>= 2.0'
13
+
14
+ s.license = "MIT"
15
+ s.homepage = "https://github.com/contentstack/contentstack-utils-ruby"
16
+
17
+ s.summary = %q{Contentstack Ruby Utils for }
18
+ s.description = %q{Contentstack Ruby client for the Content Delivery API}
19
+
20
+ s.files = `git ls-files`.split("\n")
21
+ s.test_files = s.files.grep(%r{^spec/})
22
+ s.require_paths = ["lib"]
23
+
24
+ s.add_dependency 'activesupport', '~> 6.1.0'
25
+ s.add_dependency 'nokogiri', '~> 1.11.0'
26
+
27
+ s.add_development_dependency 'rake', '~> 13.0.3'
28
+ s.add_development_dependency 'rspec', '~> 3.10.0'
29
+ s.add_development_dependency 'webmock', '~> 3.11.0'
30
+ s.add_development_dependency 'simplecov', '~> 0.21.1'
31
+ s.add_development_dependency 'yard', '~> 0.9.26'
32
+ end
@@ -0,0 +1,4 @@
1
+ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
2
+
3
+ require 'contentstack_utils/version'
4
+ require 'contentstack_utils/utils'
@@ -0,0 +1,9 @@
1
+ module ContentstackUtils
2
+ module Interface
3
+ class Rendarable
4
+ def render_option(embeddedObject, metadata)
5
+ raise NotImplementedError, "Implement this method in a child class"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,44 @@
1
+
2
+ module ContentstackUtils
3
+ module Model
4
+ class Metadata
5
+ def initialize( element )
6
+ @itemType = element.attribute('type')
7
+ @styleType = element.attribute('sys-style-type')
8
+ @itemUid ||= element.attribute('data-sys-entry-uid') || element.attribute('data-sys-asset-uid')
9
+ @contentTypeUid = element.attribute('data-sys-content-type-uid')
10
+ @text = element.text
11
+ @element = element
12
+ @attributes = element.attributes
13
+ end
14
+
15
+ def item_type
16
+ @itemType ? @itemType.value : nil
17
+ end
18
+
19
+ def style_type
20
+ @styleType ? @styleType.value : nil
21
+ end
22
+
23
+ def item_uid
24
+ @itemUid ? @itemUid.value : nil
25
+ end
26
+
27
+ def content_type_uid
28
+ @contentTypeUid ? @contentTypeUid.value : nil
29
+ end
30
+
31
+ def text
32
+ @text
33
+ end
34
+
35
+ def element
36
+ @element
37
+ end
38
+
39
+ def attributes
40
+ @attributes
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,34 @@
1
+ require_relative '../interface/renderable.rb'
2
+ require_relative './metadata.rb'
3
+
4
+ module ContentstackUtils
5
+ module Model
6
+ class Options < Interface::Rendarable
7
+
8
+ def initialize(entry)
9
+ @entry = entry
10
+ end
11
+
12
+ def entry
13
+ @entry
14
+ end
15
+
16
+ def render_option(embeddedObject, metadata)
17
+ renderString = ''
18
+ case metadata.style_type
19
+ when 'block'
20
+ renderString = "<div><p>#{embeddedObject['title'] || embeddedObject['uid']}</p><p>Content type: <span>#{embeddedObject['_content_type_uid']}</span></p></div>"
21
+ when 'inline'
22
+ renderString = "<span>#{embeddedObject["title"] || embeddedObject["uid"]}</span>";
23
+ when 'link'
24
+ renderString = "<a href='#{(metadata.attributes["href"] ? metadata.attributes["href"].value : nil) || embeddedObject["url"] || embeddedObject["title"] || embeddedObject["uid"]}'>#{(metadata.text && metadata.text != '' ? metadata.text : (embeddedObject["title"] || embeddedObject["uid"]))}</a>";
25
+ when 'display'
26
+ renderString = "<img src='#{(metadata.attributes["href"] ? metadata.attributes["href"].value : nil)|| embeddedObject["url"]}' alt='#{(metadata.attributes["alt"] ? metadata.attributes["alt"].value : (embeddedObject["title"] || embeddedObject["filename"] || embeddedObject["uid"]))}' />";
27
+ when 'download'
28
+ renderString = "<a href='#{(metadata.attributes["href"] ? metadata.attributes["href"].value : nil) || embeddedObject["url"]}'>#{(metadata.text && metadata.text != '' ? metadata.text : (embeddedObject["filename"] || embeddedObject["title"] || embeddedObject["uid"]))}</a>";
29
+ end
30
+ renderString
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,3 @@
1
+ def appendFrame(string)
2
+ "<documentfragmentcontainer>#{string}</documentfragmentcontainer>"
3
+ end
@@ -0,0 +1,54 @@
1
+ require_relative './model/options.rb'
2
+ require_relative './model/metadata.rb'
3
+ require_relative './support/helper.rb'
4
+ require 'nokogiri'
5
+
6
+ module ContentstackUtils
7
+ def self.render_content(content, options)
8
+ if (content.instance_of? Array)
9
+ result = []
10
+ content.each do |n|
11
+ result.push(render_string(n, options))
12
+ end
13
+ result
14
+ elsif content.instance_of? String
15
+ render_string(content, options)
16
+ end
17
+ end
18
+
19
+ private_class_method def self.render_string(string, options)
20
+ xml_doc = Nokogiri::HTML(appendFrame(string))
21
+ result = xml_doc.xpath('//documentfragmentcontainer').inner_html
22
+ findEmbeddedObject(xml_doc).each do |metadata|
23
+ object = findObject(metadata, options.entry)
24
+ replaceString = ''
25
+ if object!= nil && object.length() > 0
26
+ replaceString = options.render_option(object[0], metadata)
27
+ end
28
+ result = result.sub(metadata.element.to_html, replaceString)
29
+ end
30
+ result
31
+ end
32
+
33
+ private_class_method def self.findEmbeddedObject(doc)
34
+ metadataArray = []
35
+ doc.xpath('//*[contains(@class, "embedded-asset") or contains(@class, "embedded-entry")]').each do |n|
36
+ metadataArray.push(Model::Metadata.new(n))
37
+ end
38
+ metadataArray
39
+ end
40
+
41
+ private_class_method def self.findObject(metadata, entry)
42
+ if entry.has_key? '_embedded_items'
43
+ embedItems = entry['_embedded_items']
44
+ keys = embedItems.keys
45
+ keys.each do |key|
46
+ object = embedItems[key].select { |embedObject| embedObject['uid'] == metadata.item_uid }
47
+ if object != nil && object.length() > 0
48
+ return object
49
+ end
50
+ end
51
+ end
52
+ return nil
53
+ end
54
+ end