wildcard-pair 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env ruby -wKU
2
+
3
+ require 'active_model'
4
+ require_relative 'hash_mappable.rb'
5
+ require_relative 'Media.rb'
6
+
7
+ module WildcardPair
8
+ class Review
9
+
10
+ include ActiveModel::Validations
11
+ include ActiveModel::Serializers::JSON
12
+ include WildcardPair::HashMappable
13
+ include WildcardPair::Media
14
+
15
+ # required fields
16
+ attr_accessor :title, :html_content
17
+ # optional fields
18
+ attr_accessor :publication_date, :abstract_content, :source, :author,
19
+ :updated_date, :product_name, :app_link_ios,
20
+ :app_link_android
21
+ attr_reader :rating, :media
22
+
23
+ validates :title, presence: true
24
+ validates :html_content, presence: true
25
+
26
+ validate :validate_media
27
+ validate :validate_rating
28
+
29
+ def metatags=(metatags)
30
+ if metatags.nil? || !metatags.is_a?(Hash)
31
+ return
32
+ end
33
+
34
+ #see what you can set based on metatags
35
+ self.title=metatags['title']
36
+ self.html_content=metatags['html']
37
+ self.abstract_content=metatags['description']
38
+ self.media=Media::Image.new image_url: metatags['image_url']
39
+ self.app_link_ios=metatags['applink_ios']
40
+ self.app_link_android=metatags['applink_android']
41
+ end
42
+
43
+ def media=(media)
44
+ if media.is_a? Video
45
+ @media = map_hash(media, Media::Video.new)
46
+ elsif media.is_a? Image
47
+ @media = map_hash(media, Media::Image.new)
48
+ elsif media.is_a? Hash
49
+ if media[:type] == 'video'
50
+ @media = map_hash(media, Media::Video.new)
51
+ elsif media[:type] == 'image'
52
+ @media = map_hash(media, Media::Image.new)
53
+ else
54
+ @media = media
55
+ end
56
+ end
57
+ end
58
+
59
+ def validate_media
60
+ if @media.nil? then return end
61
+
62
+ if !@media.is_a? Media or !@media.valid?
63
+ errors.add(:media, "Media is invalid")
64
+ return false
65
+ end
66
+ end
67
+
68
+ def rating=(rating)
69
+ @rating = map_hash(rating, WildcardPair::Rating.new)
70
+ end
71
+
72
+ def initialize(attributes = {})
73
+ attributes.each do |name, value|
74
+ send("#{name}=", value)
75
+ end
76
+ end
77
+
78
+ def attributes
79
+ instance_values
80
+ end
81
+
82
+ def validate_rating
83
+ if @rating.nil? then return end
84
+
85
+ if !@rating.is_a? Rating or !@rating.valid?
86
+ errors.add(:rating, "Rating is invalid")
87
+ return false
88
+ end
89
+ end
90
+
91
+ #exclude validation fields in the JSON output
92
+ def as_json(options={})
93
+ super(options.merge({:except => [:errors, :validation_context]}))
94
+ end
95
+
96
+ def to_json(options={})
97
+ if self.valid?
98
+ super(options)
99
+ else
100
+ raise "Video is not valid - please remedy the following errors:" << self.errors.messages.to_s
101
+ end
102
+ end
103
+
104
+ end
105
+ end
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env ruby -wKU
2
+
3
+ require 'active_model'
4
+ require_relative 'hash_mappable.rb'
5
+
6
+ module WildcardPair
7
+ class ReviewCard
8
+ private
9
+
10
+ attr_accessor :review, :card_type, :pair_version
11
+
12
+ public
13
+
14
+ include ActiveModel::Validations
15
+ include ActiveModel::Serializers::JSON
16
+ include WildcardPair::HashMappable
17
+
18
+ attr_accessor :web_url
19
+ attr_reader :review, :card_type, :pair_version
20
+
21
+ validates :web_url, presence: true
22
+ validate :validate_review
23
+
24
+ def initialize(attributes = {})
25
+ attributes.each do |name, value|
26
+ send("#{name}=", value)
27
+ end
28
+
29
+ @card_type = 'review'
30
+
31
+ if !Gem.loaded_specs['wildcard-pair'].nil?
32
+ @pair_version = Gem.loaded_specs['wildcard-pair'].version.to_s
33
+ else
34
+ @pair_version = "unknown"
35
+ end
36
+ end
37
+
38
+ def attributes
39
+ instance_values
40
+ end
41
+
42
+ def populate_from_metatags(web_url)
43
+ @web_url=web_url
44
+ metatags = WildcardPair::ExtractMetaTags.extract(@web_url)
45
+
46
+ ##now that we've extracted metatags, let's create a Review
47
+ self.review=WildcardPair::Review.new metatags: metatags
48
+ end
49
+
50
+ def review=(review)
51
+ @review = map_hash(review, WildcardPair::Review.new)
52
+ end
53
+
54
+ def validate_review
55
+ if @review.nil? or !@review.is_a? Review
56
+ errors.add(:review, "A review is required")
57
+ return
58
+ end
59
+
60
+ if !@review.valid?
61
+ @review.errors.each do |error, msg|
62
+ errors["review[%s]" % error] = msg
63
+ end
64
+ end
65
+ end
66
+
67
+ #exclude validation fields in the JSON output
68
+ def as_json(options={})
69
+ super(options.merge({:except => [:errors, :validation_context]}))
70
+ end
71
+
72
+ def to_json(options={})
73
+ if self.valid?
74
+ super(options)
75
+ else
76
+ raise "Review Card is not valid - please remedy the following errors:" << self.errors.messages.to_s
77
+ end
78
+ end
79
+
80
+ end
81
+ end
82
+
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env ruby -wKU
2
+
3
+ require 'active_model'
4
+ require_relative 'hash_mappable.rb'
5
+ require_relative 'Media.rb'
6
+
7
+ module WildcardPair
8
+ class VideoCard
9
+ private
10
+
11
+ attr_accessor :media, :card_type, :pair_version
12
+
13
+ public
14
+
15
+ include ActiveModel::Validations
16
+ include ActiveModel::Serializers::JSON
17
+ include WildcardPair::HashMappable
18
+ include WildcardPair::Media
19
+
20
+ attr_accessor :web_url
21
+ attr_reader :media, :card_type, :pair_version
22
+
23
+ validates :web_url, presence: true
24
+ validate :validate_media
25
+
26
+ def initialize(attributes = {})
27
+ attributes.each do |name, value|
28
+ send("#{name}=", value)
29
+ end
30
+
31
+ @card_type = 'video'
32
+
33
+ if !Gem.loaded_specs['wildcard-pair'].nil?
34
+ @pair_version = Gem.loaded_specs['wildcard-pair'].version.to_s
35
+ else
36
+ @pair_version = "unknown"
37
+ end
38
+ end
39
+
40
+ def attributes
41
+ instance_values
42
+ end
43
+
44
+ def populate_from_metatags(web_url)
45
+ @web_url=web_url
46
+ metatags = WildcardPair::ExtractMetaTags.extract(@web_url)
47
+
48
+ ##now that we've extracted metatags, let's create a Video object with it
49
+ self.media=WildcardPair::Media::Video.new metatags: metatags
50
+ end
51
+
52
+ def media=(media)
53
+ @media = map_hash(media, WildcardPair::Media::Video.new)
54
+ end
55
+
56
+ def validate_media
57
+ if @media.nil? || !@media.is_a?(Video)
58
+ errors.add(:media, "A video is required")
59
+ return
60
+ end
61
+
62
+ if !@media.valid?
63
+ @media.errors.each do |error, msg|
64
+ errors["media[%s]" % error] = msg = msg
65
+ end
66
+ end
67
+ end
68
+
69
+ #exclude validation fields in the JSON output
70
+ def as_json(options={})
71
+ super(options.merge({:except => [:errors, :validation_context]}))
72
+ end
73
+
74
+ def to_json(options={})
75
+ if self.valid?
76
+ super(options)
77
+ else
78
+ raise "Video Card is not valid - please remedy the following errors:" << self.errors.messages.to_s
79
+ end
80
+ end
81
+
82
+ end
83
+ end
84
+
@@ -0,0 +1,18 @@
1
+ module WildcardPair
2
+ module HashMappable
3
+ def map_hash(value, target)
4
+ if value.is_a? Hash
5
+ target.attributes = value
6
+ return target
7
+ else
8
+ return value
9
+ end
10
+ end
11
+
12
+ def attributes=(hash)
13
+ hash.each do |key, value|
14
+ send("#{key}=", value)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,99 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+ require 'nokogiri'
4
+
5
+ module WildcardPair
6
+ module ExtractMetaTags
7
+
8
+ def self.get_metatag_key(attribute)
9
+
10
+ if attribute.nil?
11
+ return nil
12
+ end
13
+
14
+ case attribute
15
+ when "twitter:title", "og:title"
16
+ return "title"
17
+ when "twitter:description", "og:description"
18
+ return "description"
19
+ when "twitter:image", "twitter:image:src", "og:image"
20
+ return "image_url"
21
+ when "og:price:amount", "product:price:amount"
22
+ return "price"
23
+ when "twitter:app:url:iphone", "al:ios:url"
24
+ return "applink_ios"
25
+ when "twitter:app:url:googleplay", "al:android:url"
26
+ return "applink_android"
27
+ when "og:video", "twitter:player"
28
+ return "video_url"
29
+ when "og:video:width", "twitter:player:width"
30
+ return "video_width"
31
+ when "og:video:height", "twitter:player:height"
32
+ return "video_height"
33
+ else
34
+ return nil
35
+ end
36
+ end
37
+
38
+ def self.get_meta_key(meta_element)
39
+ if !meta_element.is_a?(Hash)
40
+ return nil
41
+ end
42
+
43
+ if (!meta_element['name'].nil?)
44
+ return meta_element['name'].value
45
+ elsif (!meta_element['property'].nil?)
46
+ return meta_element['property'].value
47
+ end
48
+
49
+ end
50
+
51
+ def self.get_meta_value(meta_element)
52
+ if !meta_element.is_a?(Hash)
53
+ return nil
54
+ end
55
+
56
+ if (!meta_element['content'].nil?)
57
+ return meta_element['content'].value
58
+ elsif (!meta_element['value'].nil?)
59
+ return meta_element['value'].value
60
+ end
61
+
62
+ end
63
+
64
+ private_class_method :get_meta_value, :get_meta_key, :get_metatag_key
65
+
66
+ public
67
+ def self.extract(web_url)
68
+ begin
69
+ metatags = Hash.new
70
+
71
+ if web_url.is_a?(String) && !web_url.nil? && !web_url.empty?
72
+ html_content = Net::HTTP.get(URI.parse(web_url))
73
+ ##store html content in metatags hash
74
+ metatags['html']=html_content
75
+ doc = Nokogiri::HTML(html_content)
76
+
77
+ doc.xpath("//meta").each do |meta|
78
+ meta_key = get_meta_key(meta.attributes)
79
+ meta_tag_key = get_metatag_key(meta_key)
80
+
81
+ next if meta_tag_key.nil?
82
+ next if metatags.has_key?(meta_tag_key)
83
+
84
+ metatags[meta_tag_key] = get_meta_value(meta.attributes)
85
+ end
86
+
87
+ end
88
+
89
+ return metatags
90
+
91
+ rescue Exception => e
92
+ ## something bad happened during extraction, lets output message and return empty hash
93
+ puts e.message
94
+ return {}
95
+ end
96
+ end
97
+
98
+ end
99
+ end
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wildcard-pair
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.1
5
+ platform: ruby
6
+ authors:
7
+ - Karthik Senthil
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: statsd-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.2'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.2.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.2'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.2.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: activemodel
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '4.1'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 4.1.1
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '4.1'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 4.1.1
53
+ - !ruby/object:Gem::Dependency
54
+ name: nokogiri
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: 1.6.4
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 1.6.4
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 1.6.4
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 1.6.4
73
+ description: Wildcard Pair SDK to facilitate partners being able to create cards for
74
+ their content
75
+ email:
76
+ - partners@trywildcard.com
77
+ executables: []
78
+ extensions: []
79
+ extra_rdoc_files: []
80
+ files:
81
+ - lib/wildcard-pair.rb
82
+ - lib/wildcard-pair/Article.rb
83
+ - lib/wildcard-pair/ArticleCard.rb
84
+ - lib/wildcard-pair/Color.rb
85
+ - lib/wildcard-pair/Media.rb
86
+ - lib/wildcard-pair/Media/Image.rb
87
+ - lib/wildcard-pair/Media/Video.rb
88
+ - lib/wildcard-pair/Offer.rb
89
+ - lib/wildcard-pair/Price.rb
90
+ - lib/wildcard-pair/Product.rb
91
+ - lib/wildcard-pair/ProductCard.rb
92
+ - lib/wildcard-pair/ProductSearchCard.rb
93
+ - lib/wildcard-pair/ProductSearchResult.rb
94
+ - lib/wildcard-pair/Rating.rb
95
+ - lib/wildcard-pair/Review.rb
96
+ - lib/wildcard-pair/ReviewCard.rb
97
+ - lib/wildcard-pair/VideoCard.rb
98
+ - lib/wildcard-pair/hash_mappable.rb
99
+ - lib/wildcard-pair/util/extract_metatags.rb
100
+ homepage: http://trywildcard.com/dev
101
+ licenses:
102
+ - MIT
103
+ metadata: {}
104
+ post_install_message:
105
+ rdoc_options: []
106
+ require_paths:
107
+ - lib
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ requirements: []
119
+ rubyforge_project:
120
+ rubygems_version: 2.4.3
121
+ signing_key:
122
+ specification_version: 4
123
+ summary: Wildcard Pair Ruby SDK
124
+ test_files: []