onebox 1.8.22 → 1.8.23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +98 -16
  3. data/.travis.yml +5 -1
  4. data/CHANGELOG.md +6 -0
  5. data/Guardfile +3 -5
  6. data/README.md +7 -0
  7. data/Rakefile +1 -1
  8. data/lib/onebox/engine.rb +2 -3
  9. data/lib/onebox/engine/amazon_onebox.rb +5 -3
  10. data/lib/onebox/engine/douban_onebox.rb +1 -1
  11. data/lib/onebox/engine/github_blob_onebox.rb +68 -70
  12. data/lib/onebox/engine/github_issue_onebox.rb +16 -17
  13. data/lib/onebox/engine/google_maps_onebox.rb +2 -2
  14. data/lib/onebox/engine/google_play_app_onebox.rb +2 -3
  15. data/lib/onebox/engine/html.rb +1 -1
  16. data/lib/onebox/engine/pdf_onebox.rb +0 -1
  17. data/lib/onebox/engine/pubmed_onebox.rb +15 -15
  18. data/lib/onebox/engine/stack_exchange_onebox.rb +2 -2
  19. data/lib/onebox/engine/standard_embed.rb +1 -1
  20. data/lib/onebox/engine/twitch_clips_onebox.rb +1 -1
  21. data/lib/onebox/engine/twitch_video_onebox.rb +2 -1
  22. data/lib/onebox/engine/twitter_status_onebox.rb +4 -4
  23. data/lib/onebox/engine/wechat_mp_onebox.rb +4 -4
  24. data/lib/onebox/engine/whitelisted_generic_onebox.rb +1 -1
  25. data/lib/onebox/engine/wikipedia_onebox.rb +7 -7
  26. data/lib/onebox/engine/youtube_onebox.rb +1 -1
  27. data/lib/onebox/file_type_finder.rb +2 -2
  28. data/lib/onebox/helpers.rb +14 -14
  29. data/lib/onebox/sanitize_config.rb +1 -1
  30. data/lib/onebox/version.rb +1 -1
  31. data/onebox.gemspec +4 -0
  32. data/spec/lib/onebox/engine/amazon_onebox_spec.rb +0 -1
  33. data/spec/lib/onebox/engine/google_maps_onebox_spec.rb +1 -1
  34. data/spec/lib/onebox/engine/pdf_onebox_spec.rb +2 -2
  35. data/spec/lib/onebox/engine/pubmed_onebox_spec.rb +0 -1
  36. data/spec/lib/onebox/engine/stack_exchange_onebox_spec.rb +3 -3
  37. data/spec/lib/onebox/engine/twitter_status_onebox_spec.rb +1 -1
  38. data/spec/lib/onebox/engine/wechat_mp_onebox_spec.rb +3 -3
  39. data/spec/lib/onebox/helpers_spec.rb +8 -8
  40. data/spec/lib/onebox/layout_spec.rb +2 -2
  41. data/templates/stackexchange.mustache +1 -1
  42. data/templates/twitterstatus.mustache +1 -1
  43. metadata +4 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1d2051c2eb978bd88a44dfc32babf9c2d321016c
4
- data.tar.gz: adfe2fa3bb20664fde2228ef9536149d6a569fad
3
+ metadata.gz: 584d1054d0ca1dd735a214cebe2b08427bdf3d1a
4
+ data.tar.gz: 5b070e05e93e822320f5450a70cc993d8f7bc9e3
5
5
  SHA512:
6
- metadata.gz: 67d4c9de5c5fc3dce490916a598601d14adbb94fafdb200e7f0e282fa1a01b8046c38f884e98dd6f9396d7ad687b364d00013ce7e001c1cb9a3169e5b6fa41d6
7
- data.tar.gz: 83f5831a4460bb2a8ae3fb0e002b3b323bc38022a9b184bd7f0a50afee9e09c2e116f267122383ef36f2d694654e4f1885699d3ddac105bbc3d43a12e2b67fb4
6
+ metadata.gz: 9b7537379a2d5119196364a192d211dc308f7656f4e782bce43f39a73af582a57d96a368bd3056dc6d5ab56d4960d107c9073bfe0a35dc0125801a8a00769a97
7
+ data.tar.gz: af5cc488f634add8fa6af284068035f30f14c7d85f0983744cc6617e6b238f2ce9b4c8c91d424da73e6aa33cd8dcd30191857eaef9e260b1b9ab8b6a1ec1e10b
data/.rubocop.yml CHANGED
@@ -1,30 +1,112 @@
1
1
  AllCops:
2
- # Include gemspec and Rakefile
2
+ TargetRubyVersion: 2.2
3
+ DisabledByDefault: true
3
4
  Includes:
4
5
  - '**/*.gemspec'
5
6
  - '**/Rakefile'
6
7
  Excludes: []
7
8
 
8
- # Prefer ' strings when you don't need string interpolation or special symbols.
9
- StringLiterals:
10
- Enabled: false
11
9
 
12
- LineLength:
10
+ # Prefer &&/|| over and/or.
11
+ Style/AndOr:
13
12
  Enabled: true
14
- Max: 180
15
13
 
16
- # Avoid methods longer than 10 lines of code
17
- MethodLength:
14
+ # Do not use braces for hash literals when they are the last argument of a
15
+ # method call.
16
+ Style/BracesAroundHashParameters:
18
17
  Enabled: true
19
- CountComments: false # count full line comments?
20
- Max: 10
21
18
 
22
- # Document classes and non-namespace modules.
23
- Documentation:
24
- Enabled: false
19
+ # Align `when` with `case`.
20
+ Layout/CaseIndentation:
21
+ Enabled: true
25
22
 
26
- CaseEquality:
27
- Enabled: false
23
+ # Align comments with method definitions.
24
+ Layout/CommentIndentation:
25
+ Enabled: true
26
+
27
+ # No extra empty lines.
28
+ Layout/EmptyLines:
29
+ Enabled: true
30
+
31
+ # Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
32
+ Style/HashSyntax:
33
+ Enabled: true
34
+
35
+ # Two spaces, no tabs (for indentation).
36
+ Layout/IndentationWidth:
37
+ Enabled: true
38
+
39
+ Layout/SpaceAfterColon:
40
+ Enabled: true
41
+
42
+ Layout/SpaceAfterComma:
43
+ Enabled: true
44
+
45
+ Layout/SpaceAroundEqualsInParameterDefault:
46
+ Enabled: true
47
+
48
+ Layout/SpaceAroundKeyword:
49
+ Enabled: true
50
+
51
+ Layout/SpaceAroundOperators:
52
+ Enabled: true
53
+
54
+ Layout/SpaceBeforeFirstArg:
55
+ Enabled: true
56
+
57
+ # Defining a method with parameters needs parentheses.
58
+ Style/MethodDefParentheses:
59
+ Enabled: true
60
+
61
+ # Use `foo {}` not `foo{}`.
62
+ Layout/SpaceBeforeBlockBraces:
63
+ Enabled: true
64
+
65
+ # Use `foo { bar }` not `foo {bar}`.
66
+ Layout/SpaceInsideBlockBraces:
67
+ Enabled: true
68
+
69
+ # Use `{ a: 1 }` not `{a:1}`.
70
+ Layout/SpaceInsideHashLiteralBraces:
71
+ Enabled: true
72
+
73
+ Layout/SpaceInsideParens:
74
+ Enabled: true
75
+
76
+ # Detect hard tabs, no hard tabs.
77
+ Layout/Tab:
78
+ Enabled: true
79
+
80
+ # Blank lines should not have any spaces.
81
+ Layout/TrailingBlankLines:
82
+ Enabled: true
83
+
84
+ # No trailing whitespace.
85
+ Layout/TrailingWhitespace:
86
+ Enabled: true
87
+
88
+ Lint/Debugger:
89
+ Enabled: true
90
+
91
+ Lint/BlockAlignment:
92
+ Enabled: true
93
+
94
+ # Align `end` with the matching keyword or starting expression except for
95
+ # assignments, where it should be aligned with the LHS.
96
+ Lint/EndAlignment:
97
+ Enabled: true
98
+ EnforcedStyleAlignWith: variable
99
+
100
+ # Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
101
+ Lint/RequireParentheses:
102
+ Enabled: true
103
+
104
+ Layout/MultilineMethodCallIndentation:
105
+ Enabled: true
106
+ EnforcedStyle: indented
107
+
108
+ Layout/AlignHash:
109
+ Enabled: true
28
110
 
29
- ClassVars:
111
+ Bundler/OrderedGems:
30
112
  Enabled: false
data/.travis.yml CHANGED
@@ -1,7 +1,11 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.3.1
3
+ - 2.2
4
+ - 2.3
5
+ - 2.4
4
6
  notifications:
5
7
  email:
6
8
  on_success: change
7
9
  on_failure: change
10
+ script:
11
+ - bundle exec rubocop
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 1.8.23
2
+
3
+ * added public message about ruby support (2.2 and above)
4
+ * mark all avatars being returned as onebox-avatar
5
+ * twitter returns larger avatars for retina
6
+
1
7
  ## 1.6.6
2
8
 
3
9
  * SECURITY: normalize url for audio/video oneboxes
data/Guardfile CHANGED
@@ -1,8 +1,6 @@
1
1
  guard :rspec, cmd: 'bundle exec rspec' do
2
2
  watch(%r{^spec/.+_spec\.rb$})
3
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
- watch('spec/spec_helper.rb') { "spec" }
5
-
6
- watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
7
6
  end
8
-
data/README.md CHANGED
@@ -71,6 +71,13 @@ preview = Onebox.preview(url)
71
71
  "#{preview}" == preview.to_s #=> true
72
72
  ```
73
73
 
74
+ Ruby Support
75
+ ------------
76
+
77
+ The onebox library is supported on all "officially" supported versions of Ruby.
78
+
79
+ This means you must be on Ruby 2.2 or above for it to work.
80
+
74
81
  Development Preview Interface
75
82
  -----------------------------
76
83
 
data/Rakefile CHANGED
@@ -20,7 +20,7 @@ YARD::Rake::YardocTask.new do |config|
20
20
  end
21
21
 
22
22
  desc "Default: run tests and generate docs"
23
- task :default => [ :spec, :yard ]
23
+ task default: [ :spec, :yard ]
24
24
 
25
25
  task :server do
26
26
  require 'onebox/web'
data/lib/onebox/engine.rb CHANGED
@@ -26,7 +26,6 @@ module Onebox
26
26
  @options
27
27
  end
28
28
 
29
-
30
29
  def initialize(link, cache = nil, timeout = nil)
31
30
  @options = DEFAULT
32
31
  class_name = self.class.name.split("::").last.to_s
@@ -82,13 +81,13 @@ module Onebox
82
81
  end
83
82
 
84
83
  def link
85
- @url.gsub(/['\"&<>]/, {
84
+ @url.gsub(/['\"&<>]/,
86
85
  "'" => '&#39;',
87
86
  '&' => '&amp;',
88
87
  '"' => '&quot;',
89
88
  '<' => '&lt;',
90
89
  '>' => '&gt;',
91
- })
90
+ )
92
91
  end
93
92
 
94
93
  def always_https?
@@ -23,7 +23,10 @@ module Onebox
23
23
  end
24
24
 
25
25
  def http_params
26
- {'User-Agent' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3'}
26
+ {
27
+ 'User-Agent' =>
28
+ 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3'
29
+ }
27
30
  end
28
31
 
29
32
  private
@@ -61,7 +64,6 @@ module Onebox
61
64
  result[:by_info] = raw.at("#by-line")
62
65
  result[:by_info] = Onebox::Helpers.clean(result[:by_info].inner_html) if result[:by_info]
63
66
 
64
-
65
67
  # get item price (Amazon markup is inconsistent, deal with it)
66
68
  result[:price] =
67
69
  if raw.css("#priceblock_ourprice .restOfPrice")[0] && raw.css("#priceblock_ourprice .restOfPrice")[0].inner_text
@@ -73,7 +75,7 @@ module Onebox
73
75
  end
74
76
 
75
77
  summary = raw.at("#productDescription")
76
- result[:description] = og[:description] || summary.inner_text
78
+ result[:description] = og[:description] || (summary && summary.inner_text)
77
79
  result
78
80
  end
79
81
  end
@@ -12,7 +12,7 @@ module Onebox
12
12
  def data
13
13
  {
14
14
  link: link,
15
- title: raw.css('title').text.gsub("\n",'').strip(),
15
+ title: raw.css('title').text.gsub("\n", '').strip(),
16
16
  image: raw.css('img[rel*="v:"]').first['src'],
17
17
  description: raw.css('meta[name=description]').first['content'],
18
18
  }
@@ -9,18 +9,17 @@ module Onebox
9
9
  EXPAND_NONE = 0b0
10
10
 
11
11
  DEFAULTS = {
12
- :EXPAND_ONE_LINER => EXPAND_AFTER|EXPAND_BEFORE, #set how to expand a one liner. user EXPAND_NONE to disable expand
13
- :LINES_BEFORE => 10,
14
- :LINES_AFTER => 10,
15
- :SHOW_LINE_NUMBER => true,
16
- :MAX_LINES => 20,
17
- :MAX_CHARS => 5000
12
+ EXPAND_ONE_LINER: EXPAND_AFTER | EXPAND_BEFORE, #set how to expand a one liner. user EXPAND_NONE to disable expand
13
+ LINES_BEFORE: 10,
14
+ LINES_AFTER: 10,
15
+ SHOW_LINE_NUMBER: true,
16
+ MAX_LINES: 20,
17
+ MAX_CHARS: 5000
18
18
  }
19
19
 
20
20
  matches_regexp(/^https?:\/\/(www\.)?github\.com.*\/blob\//)
21
21
  always_https
22
22
 
23
-
24
23
  def initialize(link, cache = nil, timeout = nil)
25
24
  super link, cache , timeout
26
25
  #merge engine options from global Onebox.options interface
@@ -31,20 +30,20 @@ module Onebox
31
30
 
32
31
  # Define constant after merging options set in Onebox.options
33
32
  # We can define constant automatically.
34
- options.each_pair {|constant_name,value|
33
+ options.each_pair do |constant_name, value|
35
34
  constant_name_u = constant_name.to_s.upcase
36
- if constant_name_u == constant_name.to_s
37
- #define a constant if not already defined
38
- self.class.const_set constant_name_u.to_sym , options[constant_name_u.to_sym] unless self.class.const_defined? constant_name_u.to_sym
39
- end
40
- }
35
+ if constant_name_u == constant_name.to_s
36
+ #define a constant if not already defined
37
+ self.class.const_set constant_name_u.to_sym , options[constant_name_u.to_sym] unless self.class.const_defined? constant_name_u.to_sym
38
+ end
39
+ end
41
40
  end
42
41
 
43
42
  private
44
- @selected_lines_array = nil
43
+ @selected_lines_array = nil
45
44
  @selected_one_liner = 0
46
- def calc_range(m,contents_lines_size)
47
- #author Lidlanca 09/15/2014
45
+
46
+ def calc_range(m, contents_lines_size)
48
47
  truncated = false
49
48
  from = /\d+/.match(m[:from]) #get numeric should only match a positive interger
50
49
  to = /\d+/.match(m[:to]) #get numeric should only match a positive interger
@@ -66,7 +65,7 @@ module Onebox
66
65
  #we can technically return here
67
66
  end
68
67
 
69
- from, to = [from,to].sort #enforce valid range. [from < to]
68
+ from, to = [from, to].sort #enforce valid range. [from < to]
70
69
  from = 1 if from > contents_lines_size #if "from" out of TOP bound set to 1st line
71
70
  to = contents_lines_size if to > contents_lines_size #if "to" is out of TOP bound set to last line.
72
71
 
@@ -88,30 +87,31 @@ module Onebox
88
87
  end
89
88
  end
90
89
 
91
- if to-from > MAX_LINES && !one_liner #if exceed the MAX_LINES limit correct unless range was produced by one_liner which it expand setting will allow exceeding the line limit
90
+ if to - from > MAX_LINES && !one_liner #if exceed the MAX_LINES limit correct unless range was produced by one_liner which it expand setting will allow exceeding the line limit
92
91
  truncated = true
93
- to = from + MAX_LINES-1
92
+ to = from + MAX_LINES - 1
94
93
  end
95
94
 
96
- {:from => from, #calculated from
97
- :from_minus_one => from-1, #used for getting currect ol>li numbering with css used in template
98
- :to => to, #calculated to
99
- :one_liner => one_liner, #boolean if a one-liner
100
- :selected_one_liner => @selected_one_liner, #if a one liner is provided we create a reference for it.
101
- :range_provided => range_provided, #boolean if range provided
102
- :truncated => truncated}
95
+ {
96
+ from: from, #calculated from
97
+ from_minus_one: from - 1, #used for getting currect ol>li numbering with css used in template
98
+ to: to, #calculated to
99
+ one_liner: one_liner, #boolean if a one-liner
100
+ selected_one_liner: @selected_one_liner, #if a one liner is provided we create a reference for it.
101
+ range_provided: range_provided, #boolean if range provided
102
+ truncated: truncated
103
+ }
103
104
  end
104
105
 
105
106
  #minimize/compact leading indentation while preserving overall indentation
106
- def removeLeadingIndentation str
107
- #author Lidlanca 2014
108
- min_space=100
107
+ def removeLeadingIndentation(str)
108
+ min_space = 100
109
109
  a_lines = str.lines
110
- a_lines.each {|l|
110
+ a_lines.each do |l|
111
111
  l = l.chomp("\n") # remove new line
112
- m = l.match /^[ ]*/ # find leading spaces 0 or more
113
- unless m.nil? || l.size==m[0].size || m[0].size==0 # no match | only spaces in line | empty line
114
- m_str_length = m[0].size
112
+ m = l.match(/^[ ]*/) # find leading spaces 0 or more
113
+ unless m.nil? || l.size == m[0].size || m[0].size == 0 # no match | only spaces in line | empty line
114
+ m_str_length = m[0].size
115
115
  if m_str_length <= 1 # minimum space is 1 or nothing we can break we found our minimum
116
116
  min_space = m_str_length
117
117
  break #stop iteration
@@ -122,32 +122,29 @@ module Onebox
122
122
  else
123
123
  next # SKIP no match or line is only spaces
124
124
  end
125
- }
126
- a_lines.each {|l|
125
+ end
126
+ a_lines.each do |l|
127
127
  re = Regexp.new "^[ ]{#{min_space}}" #match the minimum spaces of the line
128
128
  l.gsub!(re, "")
129
- }
129
+ end
130
130
  a_lines.join
131
131
  end
132
132
 
133
- def line_number_helper(lines,start,selected)
134
- #author Lidlanca 09/15/2014
133
+ def line_number_helper(lines, start, selected)
135
134
  lines = removeLeadingIndentation(lines.join).lines # A little ineffeicent we could modify removeLeadingIndentation to accept array and return array, but for now it is only working with a string
136
- hash_builder =[]
135
+ hash_builder = []
137
136
  output_builder = []
138
- lines.map.with_index { |line,i|
139
- lnum = (i.to_i+start)
140
- hash_builder.push({:line_number => lnum, :data=> line.gsub("\n",""), :selected=> (selected==lnum)? true: false} )
137
+ lines.map.with_index { |line, i|
138
+ lnum = (i.to_i + start)
139
+ hash_builder.push(line_number: lnum, data: line.gsub("\n", ""), selected: (selected == lnum) ? true : false)
141
140
  output_builder.push "#{lnum}: #{line}"
142
141
  }
143
- {:output=>output_builder.join(), :array=>hash_builder}
142
+ { output: output_builder.join(), array: hash_builder }
144
143
  end
145
144
 
146
-
147
145
  def raw
148
- options_id = self.class.name.split("::").last.to_s #get class name without module namespace
149
-
150
146
  return @raw if @raw
147
+
151
148
  m = @url.match(/github\.com\/(?<user>[^\/]+)\/(?<repo>[^\/]+)\/blob\/(?<sha1>[^\/]+)\/(?<file>[^#]+)(#(L(?<from>[^-]*)(-L(?<to>.*))?))?/mi)
152
149
 
153
150
  if m
@@ -161,26 +158,25 @@ module Onebox
161
158
  contents_lines = contents.lines #get contents lines
162
159
  contents_lines_size = contents_lines.size #get number of lines
163
160
 
164
- cr = calc_range(m,contents_lines_size) #calculate the range of lines for output
165
- selected_one_liner = cr[:selected_one_liner] #if url is a one-liner calc_range will return it
166
- # puts "SELECTED LINE" + cr[:selected_one_liner].to_s
167
- from = cr[:from]
168
- to = cr[:to]
169
- @truncated = cr[:truncated]
170
- range_provided = cr[:range_provided]
171
- one_liner = cr[:one_liner]
172
- @cr_results = cr
161
+ cr = calc_range(m, contents_lines_size) #calculate the range of lines for output
162
+ selected_one_liner = cr[:selected_one_liner] #if url is a one-liner calc_range will return it
163
+ from = cr[:from]
164
+ to = cr[:to]
165
+ @truncated = cr[:truncated]
166
+ range_provided = cr[:range_provided]
167
+ @cr_results = cr
168
+
173
169
  if range_provided #if a range provided (single line or more)
174
170
  if SHOW_LINE_NUMBER
175
- lines_result = line_number_helper(contents_lines[from-1..to-1], from, selected_one_liner) #print code with prefix line numbers in case range provided
171
+ lines_result = line_number_helper(contents_lines[(from - 1)..(to - 1)], from, selected_one_liner) #print code with prefix line numbers in case range provided
176
172
  contents = lines_result[:output]
177
173
  @selected_lines_array = lines_result[:array]
178
174
  else
179
- contents = contents_lines[from-1..to-1].join()
175
+ contents = contents_lines[(from - 1)..(to - 1)].join()
180
176
  end
181
177
 
182
178
  else
183
- contents = contents_lines[from-1..to-1].join()
179
+ contents = contents_lines[(from - 1)..(to - 1)].join()
184
180
  end
185
181
 
186
182
  if contents.length > MAX_CHARS #truncate content chars to limits
@@ -193,18 +189,20 @@ module Onebox
193
189
  end
194
190
 
195
191
  def data
196
- @data ||= {title: link.sub(/^https?\:\/\/github\.com\//, ''),
197
- link: link,
198
- # IMPORTANT NOTE: All of the other class variables are populated
199
- # as *side effects* of the `raw` method! They must all appear
200
- # AFTER the call to `raw`! Don't get bitten by this like I did!
201
- content: raw,
202
- lang: "lang-#{@lang}",
203
- lines: @selected_lines_array ,
204
- has_lines: !@selected_lines_array.nil?,
205
- selected_one_liner: @selected_one_liner,
206
- cr_results:@cr_results,
207
- truncated: @truncated}
192
+ @data ||= {
193
+ title: link.sub(/^https?\:\/\/github\.com\//, ''),
194
+ link: link,
195
+ # IMPORTANT NOTE: All of the other class variables are populated
196
+ # as *side effects* of the `raw` method! They must all appear
197
+ # AFTER the call to `raw`! Don't get bitten by this like I did!
198
+ content: raw,
199
+ lang: "lang-#{@lang}",
200
+ lines: @selected_lines_array ,
201
+ has_lines: !@selected_lines_array.nil?,
202
+ selected_one_liner: @selected_one_liner,
203
+ cr_results: @cr_results,
204
+ truncated: @truncated
205
+ }
208
206
  end
209
207
 
210
208
  end
@@ -16,33 +16,32 @@ module Onebox
16
16
  private
17
17
 
18
18
  def match
19
- @match ||= @url.match(/^http(?:s)?:\/\/(?:www\.)?(?:(?:\w)+\.)?github\.com\/(?<org>.+)\/(?<repo>.+)\/(?<type>issues)\/(?<item_id>[\d]+)/)
19
+ @match ||= @url.match(/^http(?:s)?:\/\/(?:www\.)?(?:(?:\w)+\.)?github\.com\/(?<org>.+)\/(?<repo>.+)\/(?<type>issues)\/(?<item_id>[\d]+)/)
20
20
  end
21
21
 
22
22
  def data
23
23
 
24
- @raw ||= ::MultiJson.load(open(url,"Accept"=>"application/vnd.github.v3.text+json",:read_timeout=>timeout )) #custom Accept header so we can get body as text.
25
- body_text= @raw["body_text"]
24
+ @raw ||= ::MultiJson.load(open(url, "Accept" => "application/vnd.github.v3.text+json", read_timeout: timeout)) #custom Accept header so we can get body as text.
25
+ body_text = @raw["body_text"]
26
26
 
27
-
28
- content_words = body_text.gsub("\n\n","\n").gsub("\n","<br>").split(" ") #one pass of removing double newline, then we change \n to <br> and later on we revert it back to \n this is a workaround to avoid losing newlines after we join it back.
27
+ content_words = body_text.gsub("\n\n", "\n").gsub("\n", "<br>").split(" ") #one pass of removing double newline, then we change \n to <br> and later on we revert it back to \n this is a workaround to avoid losing newlines after we join it back.
29
28
  max_words = 20
30
29
  short_content = content_words[0..max_words].join(" ")
31
30
  short_content << "..." if content_words.length > max_words
32
31
 
33
32
  ulink = URI(link)
34
- status_color = {"open"=>"#6cc644","closed"=>"#bd2c00","merged"=>"#6e5494"}
35
- result = { link: @url,
36
- title: "Issue: " + @raw["title"],
37
- content: short_content.gsub("<br>","\n"),
38
- labels: @raw["labels"],
39
- user: @raw['user'],
40
- created_at: @raw['created_at'].split("T")[0], #get only date for now
41
- closed_at: (@raw['closed_at'].nil? ? "" : @raw['closed_at'].split("T")[0]),
42
- closed_by: @raw['closed_by'],
43
- avatar: "https://avatars1.githubusercontent.com/u/#{@raw['user']['id']}?v=2&s=96",
44
- domain: "#{ulink.host}/#{ulink.path.split('/')[1]}/#{ulink.path.split('/')[2]}",
45
- }
33
+ {
34
+ link: @url,
35
+ title: "Issue: " + @raw["title"],
36
+ content: short_content.gsub("<br>", "\n"),
37
+ labels: @raw["labels"],
38
+ user: @raw['user'],
39
+ created_at: @raw['created_at'].split("T")[0], #get only date for now
40
+ closed_at: (@raw['closed_at'].nil? ? "" : @raw['closed_at'].split("T")[0]),
41
+ closed_by: @raw['closed_by'],
42
+ avatar: "https://avatars1.githubusercontent.com/u/#{@raw['user']['id']}?v=2&s=96",
43
+ domain: "#{ulink.host}/#{ulink.path.split('/')[1]}/#{ulink.path.split('/')[2]}",
44
+ }
46
45
  end
47
46
  end
48
47
  end
@@ -6,7 +6,7 @@ module Onebox
6
6
  class << self
7
7
  def ===(other)
8
8
  if other.kind_of? URI
9
- @@matchers && @@matchers.any? {|m| other.to_s =~ m[:regexp] }
9
+ @@matchers && @@matchers.any? { |m| other.to_s =~ m[:regexp] }
10
10
  else
11
11
  super
12
12
  end
@@ -15,7 +15,7 @@ module Onebox
15
15
  private
16
16
 
17
17
  def matches_regexp(key, regexp)
18
- (@@matchers ||= []) << {key: key, regexp: regexp}
18
+ (@@matchers ||= []) << { key: key, regexp: regexp }
19
19
  end
20
20
  end
21
21
 
@@ -9,7 +9,6 @@ module Onebox
9
9
  MAX_DESCRIPTION_CHARS: 500
10
10
  }
11
11
 
12
-
13
12
  matches_regexp Regexp.new("^https?://play\\.(?:(?:\\w)+\\.)?(google)\\.com(?:/)?/store/apps/")
14
13
  always_https
15
14
 
@@ -24,8 +23,8 @@ module Onebox
24
23
  description: raw.css(".text-body div").inner_text[0..DEFAULTS[:MAX_DESCRIPTION_CHARS]].chop + "...",
25
24
  price: raw.css(".price.buy meta[itemprop=price]").first["content"]
26
25
  }
27
- if result[:price] == "0" then
28
- result[:price] = "Free"
26
+ if result[:price] == "0"
27
+ result[:price] = "Free"
29
28
  end
30
29
  result
31
30
  end
@@ -9,7 +9,7 @@ module Onebox
9
9
  end
10
10
 
11
11
  def raw
12
- @raw ||= Nokogiri::HTML(open(url, {read_timeout: timeout}.merge(http_params)).read)
12
+ @raw ||= Nokogiri::HTML(open(url, { read_timeout: timeout }.merge(http_params)).read)
13
13
  end
14
14
 
15
15
  def html?
@@ -10,7 +10,6 @@ module Onebox
10
10
  private
11
11
 
12
12
  def data
13
- html_entities = HTMLEntities.new
14
13
  pdf_info = get_pdf_info
15
14
  raise "Unable to read pdf file: #{@url}" if pdf_info.nil?
16
15
 
@@ -15,9 +15,9 @@ module Onebox
15
15
  end
16
16
 
17
17
  def authors_of_xml(xml)
18
- initials = xml.css("Initials").map{|x| x.content}
19
- last_names = xml.css("LastName").map{|x| x.content}
20
- author_list = (initials.zip(last_names)).map{|i,l| i + " " + l}
18
+ initials = xml.css("Initials").map { |x| x.content }
19
+ last_names = xml.css("LastName").map { |x| x.content }
20
+ author_list = (initials.zip(last_names)).map { |i, l| i + " " + l }
21
21
  if author_list.length > 1 then
22
22
  author_list[-2] = author_list[-2] + " and " + author_list[-1]
23
23
  author_list.pop
@@ -26,22 +26,22 @@ module Onebox
26
26
  end
27
27
 
28
28
  def date_of_xml(xml)
29
- date_arr = (xml.css("PubDate").children).map{|x| x.content}
30
- date_arr = date_arr.select{|s| !s.match(/^\s+$/)}
31
- date_arr = (date_arr.map{|s| s.split}).flatten
29
+ date_arr = (xml.css("PubDate").children).map { |x| x.content }
30
+ date_arr = date_arr.select { |s| !s.match(/^\s+$/) }
31
+ date_arr = (date_arr.map { |s| s.split }).flatten
32
32
  date_arr.sort.reverse.join(" ") # Reverse sort so month before year.
33
33
  end
34
34
 
35
35
  def data
36
- xml = get_xml()
37
- {
38
- title: xml.css("ArticleTitle").text,
39
- authors: authors_of_xml(xml),
40
- journal: xml.css("Title").text,
41
- abstract: xml.css("AbstractText").text,
42
- date: date_of_xml(xml),
43
- link: @url,
44
- pmid: match[:pmid]
36
+ xml = get_xml()
37
+ {
38
+ title: xml.css("ArticleTitle").text,
39
+ authors: authors_of_xml(xml),
40
+ journal: xml.css("Title").text,
41
+ abstract: xml.css("AbstractText").text,
42
+ date: date_of_xml(xml),
43
+ link: @url,
44
+ pmid: match[:pmid]
45
45
  }
46
46
  end
47
47
 
@@ -7,10 +7,10 @@ module Onebox
7
7
 
8
8
  def self.domains
9
9
  %w(stackexchange.com stackoverflow.com superuser.com serverfault.com askubuntu.com stackapps.com mathoverflow.net)
10
- .map { |domain| Regexp.escape(domain) }
10
+ .map { |domain| Regexp.escape(domain) }
11
11
  end
12
12
 
13
- matches_regexp /^https?:\/\/(?:(?:(?<subsubdomain>\w*)\.)?(?<subdomain>\w*)\.)?(?<domain>#{domains.join('|')})\/((?:questions|q)\/(?<question_id>\d*)(\/.*\/(?<answer_id1>\d*))?|(a\/(?<answer_id2>\d*)))/
13
+ matches_regexp(/^https?:\/\/(?:(?:(?<subsubdomain>\w*)\.)?(?<subdomain>\w*)\.)?(?<domain>#{domains.join('|')})\/((?:questions|q)\/(?<question_id>\d*)(\/.*\/(?<answer_id1>\d*))?|(a\/(?<answer_id2>\d*)))/)
14
14
 
15
15
  def always_https?
16
16
  uri.host.split('.').length <= 3
@@ -119,7 +119,7 @@ module Onebox
119
119
  html_doc.css('meta').each do |m|
120
120
  if (m["property"] && m["property"][/^twitter:(.+)$/i]) || (m["name"] && m["name"][/^twitter:(.+)$/i])
121
121
  value = (m["content"] || m["value"]).to_s
122
- twitter[$1.tr('-:','_').to_sym] ||= value unless Onebox::Helpers::blank?(value)
122
+ twitter[$1.tr('-:' , '_').to_sym] ||= value unless Onebox::Helpers::blank?(value)
123
123
  end
124
124
  end
125
125
 
@@ -3,7 +3,7 @@ require_relative '../mixins/twitch_onebox'
3
3
  class Onebox::Engine::TwitchClipsOnebox
4
4
 
5
5
  def self.twitch_regexp
6
- /^https?:\/\/clips\.twitch\.tv\/([a-zA-Z0-9_]+\/?[^#\?\/]+)/
6
+ /^https?:\/\/clips\.twitch\.tv\/([a-zA-Z0-9_]+\/?[^#\?\/]+)/
7
7
  end
8
8
  include Onebox::Mixins::TwitchOnebox
9
9
 
@@ -3,8 +3,9 @@ require_relative '../mixins/twitch_onebox'
3
3
  class Onebox::Engine::TwitchVideoOnebox
4
4
 
5
5
  def self.twitch_regexp
6
- /^https?:\/\/(?:www\.)?twitch\.tv\/videos\/([0-9]+)/
6
+ /^https?:\/\/(?:www\.)?twitch\.tv\/videos\/([0-9]+)/
7
7
  end
8
+
8
9
  include Onebox::Mixins::TwitchOnebox
9
10
 
10
11
  def query_params
@@ -5,7 +5,7 @@ module Onebox
5
5
  include LayoutSupport
6
6
  include HTML
7
7
 
8
- matches_regexp /^https?:\/\/(mobile\.|www\.)?twitter\.com\/.+?\/status(es)?\/\d+(\/(video|photo)\/\d?+)?+\/?$/
8
+ matches_regexp(/^https?:\/\/(mobile\.|www\.)?twitter\.com\/.+?\/status(es)?\/\d+(\/(video|photo)\/\d?+)?+\/?$/)
9
9
  always_https
10
10
 
11
11
  private
@@ -84,9 +84,9 @@ module Onebox
84
84
 
85
85
  def avatar
86
86
  if twitter_api_credentials_present?
87
- access(:user, :profile_image_url_https)
88
- else
89
- twitter_data[:image].gsub!('400x400', 'normal') if twitter_data[:image]
87
+ access(:user, :profile_image_url_https).sub('normal', '400x400')
88
+ elsif twitter_data[:image]
89
+ twitter_data[:image]
90
90
  end
91
91
  end
92
92
 
@@ -22,19 +22,19 @@ module Onebox
22
22
  private
23
23
 
24
24
  def extract_script_value(var_name)
25
- if (script_elem = raw.css("script").select{|script| script.inner_text.include? "var #{var_name} = "}) && script_elem.any?
25
+ if (script_elem = raw.css("script").select { |script| script.inner_text.include? "var #{var_name} = " }) && script_elem.any?
26
26
  e = Nokogiri::HTML(script_elem[0].inner_text.match(/var\s+#{Regexp.quote(var_name)}\s+=\s+"(.*?)";/)[1])
27
- return CGI::unescapeHTML(e.text.scan(/(?:\\x([a-f0-9]{2}))|(.)/i).map { |x| x[0] ? [x[0].to_i(16)].pack('U'): x[1] }.join)
27
+ return CGI::unescapeHTML(e.text.scan(/(?:\\x([a-f0-9]{2}))|(.)/i).map { |x| x[0] ? [x[0].to_i(16)].pack('U') : x[1] }.join)
28
28
  end
29
29
  end
30
-
30
+
31
31
  # TODO need to handle hotlink protection from wechat
32
32
  def image
33
33
  if banner_image = extract_script_value("msg_cdn_url")
34
34
  return banner_image
35
35
  end
36
36
 
37
- if (main_image = raw.css("img").select{|img| not img['class']}) && main_image.any?
37
+ if (main_image = raw.css("img").select { |img| not img['class'] }) && main_image.any?
38
38
  attributes = main_image.first.attributes
39
39
 
40
40
  return attributes["data-src"].to_s if attributes["data-src"]
@@ -165,7 +165,7 @@ module Onebox
165
165
  end
166
166
 
167
167
  def self.host_matches(uri, list)
168
- !!list.find {|h| %r((^|\.)#{Regexp.escape(h)}$).match(uri.host) }
168
+ !!list.find { |h| %r((^|\.)#{Regexp.escape(h)}$).match(uri.host) }
169
169
  end
170
170
 
171
171
  def self.probable_discourse(uri)
@@ -17,8 +17,8 @@ module Onebox
17
17
  # Detect section Hash in the url and retrive the related paragraphs. if no hash provided the first few paragraphs will be used
18
18
  # Author Lidlanca
19
19
  # Date 9/8/2014
20
- if ( m_url_hash = @url.match /#([^\/?]+)/ ) #extract url hash
21
- m_url_hash_name= m_url_hash[1]
20
+ if (m_url_hash = @url.match(/#([^\/?]+)/)) #extract url hash
21
+ m_url_hash_name = m_url_hash[1]
22
22
  end
23
23
 
24
24
  unless m_url_hash.nil?
@@ -35,7 +35,7 @@ module Onebox
35
35
  # div tag is commonly used as an assets wraper in an article section. often as the first element holding an image.
36
36
  # ul support will imporve the output generated for a section with a list as the main content (for example: an Author Bibliography, A musician Discography, etc)
37
37
  first_p_found = nil
38
- while ( ((next_sibling = cur_element.next_sibling).name =~ /p|text|div|ul/) || first_p_found.nil? ) do #from section header get the next sibling until it is a breaker tag
38
+ while (((next_sibling = cur_element.next_sibling).name =~ /p|text|div|ul/) || first_p_found.nil?) do #from section header get the next sibling until it is a breaker tag
39
39
  cur_element = next_sibling
40
40
  if (cur_element.name == "p" || cur_element.name == "ul") #we treat a list as we detect a p to avoid showing
41
41
  first_p_found = true
@@ -53,11 +53,11 @@ module Onebox
53
53
  break if cnt >= paras.size
54
54
  text << " " unless cnt == 0
55
55
 
56
- if paras[cnt].name =="ul" #Handle UL tag. Generate a textual ordered list (1.item | 2.item | 3.item). Unfourtently no newline allowed in output
57
- li_index=1
56
+ if paras[cnt].name == "ul" #Handle UL tag. Generate a textual ordered list (1.item | 2.item | 3.item). Unfourtently no newline allowed in output
57
+ li_index = 1
58
58
  list_items = []
59
- paras[cnt].children.css("li").each {|li| list_items.push "#{li_index}." + li.inner_text ; li_index+=1}
60
- paragraph = (list_items.join " |\n ")[0..Onebox::LayoutSupport.max_text]
59
+ paras[cnt].children.css("li").each { |li| list_items.push "#{li_index}." + li.inner_text ; li_index += 1 }
60
+ paragraph = (list_items.join " |\n ")[0..Onebox::LayoutSupport.max_text]
61
61
  else
62
62
  paragraph = paras[cnt].inner_text[0..Onebox::LayoutSupport.max_text]
63
63
  end
@@ -105,7 +105,7 @@ module Onebox
105
105
  end
106
106
 
107
107
  def embed_params
108
- p = {'feature' => 'oembed', 'wmode' => 'opaque'}
108
+ p = { 'feature' => 'oembed', 'wmode' => 'opaque' }
109
109
 
110
110
  p['list'] = list_id if list_id
111
111
 
@@ -52,14 +52,14 @@ module Onebox
52
52
  # First check against the known lists of "special" files and extensions.
53
53
  return @extensionless_files[lower_name] if @extensionless_files.has_key?(lower_name)
54
54
 
55
- @long_file_types.each { |extension,type|
55
+ @long_file_types.each { |extension, type|
56
56
  return type if lower_name.end_with?(extension)
57
57
  }
58
58
 
59
59
  # Otherwise, just split on the last ".",
60
60
  # but add one so we don't return the "." itself.
61
61
  dot_spot = lower_name.rindex(".")
62
- return lower_name[(dot_spot+1)..-1] if dot_spot
62
+ return lower_name[(dot_spot + 1)..-1] if dot_spot
63
63
 
64
64
  # If we couldn't figure it out from the name,
65
65
  # let the highlighter figure it out from the content.
@@ -6,12 +6,12 @@ module Onebox
6
6
  def self.symbolize_keys(hash)
7
7
  return {} if hash.nil?
8
8
 
9
- hash.inject({}){|result, (key, value)|
9
+ hash.inject({}) do |result, (key, value)|
10
10
  new_key = key.is_a?(String) ? key.to_sym : key
11
11
  new_value = value.is_a?(Hash) ? symbolize_keys(value) : value
12
12
  result[new_key] = new_value
13
13
  result
14
- }
14
+ end
15
15
  end
16
16
 
17
17
  def self.clean(html)
@@ -26,7 +26,7 @@ module Onebox
26
26
  doc.css('meta').each do |m|
27
27
  if (m["property"] && m["property"][/^og:(.+)$/i]) || (m["name"] && m["name"][/^og:(.+)$/i])
28
28
  value = (m["content"] || m["value"]).to_s
29
- og[$1.tr('-:','_').to_sym] ||= value unless Onebox::Helpers::blank?(value)
29
+ og[$1.tr('-:', '_').to_sym] ||= value unless Onebox::Helpers::blank?(value)
30
30
  end
31
31
  end
32
32
 
@@ -39,7 +39,7 @@ module Onebox
39
39
  og
40
40
  end
41
41
 
42
- def self.fetch_response(location, limit=nil, domain=nil, headers=nil)
42
+ def self.fetch_response(location, limit = nil, domain = nil, headers = nil)
43
43
 
44
44
  limit ||= 5
45
45
  limit = Onebox.options.redirect_limit if limit > Onebox.options.redirect_limit
@@ -123,18 +123,18 @@ module Onebox
123
123
  conv = [ 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB' ];
124
124
  scale = 1024;
125
125
 
126
- ndx=1
127
- if( size < 2*(scale**ndx) ) then
128
- return "#{(size)} #{conv[ndx-1]}"
126
+ ndx = 1
127
+ if (size < 2 * (scale**ndx)) then
128
+ return "#{(size)} #{conv[ndx - 1]}"
129
129
  end
130
- size=size.to_f
131
- [2,3,4,5,6,7].each do |i|
132
- if (size < 2*(scale**i)) then
133
- return "#{'%.2f' % (size/(scale**(i-1)))} #{conv[i-1]}"
130
+ size = size.to_f
131
+ [2, 3, 4, 5, 6, 7].each do |i|
132
+ if (size < 2 * (scale**i)) then
133
+ return "#{'%.2f' % (size / (scale**(i - 1)))} #{conv[i - 1]}"
134
134
  end
135
135
  end
136
- ndx=7
137
- return "#{'%.2f' % (size/(scale**(ndx-1)))} #{conv[ndx-1]}"
136
+ ndx = 7
137
+ return "#{'%.2f' % (size / (scale**(ndx - 1)))} #{conv[ndx - 1]}"
138
138
  end
139
139
 
140
140
  def self.click_to_scroll_div(width = 690, height = 400)
@@ -150,7 +150,7 @@ module Onebox
150
150
  end
151
151
 
152
152
  def self.truncate(string, length = 50)
153
- string.size > length ? string[0...(string.rindex(" ", length)||length)] + "..." : string
153
+ string.size > length ? string[0...(string.rindex(" ", length) || length)] + "..." : string
154
154
  end
155
155
 
156
156
  def self.title_attr(meta)
@@ -30,7 +30,7 @@ class Sanitize
30
30
  a_tag = env[:node]
31
31
  a_tag['href'] ||= '#'
32
32
  if a_tag['href'] =~ %r{^(?:[a-z]+:)?//}
33
- a_tag['rel'] = 'nofollow noopener'
33
+ a_tag['rel'] = 'nofollow noopener'
34
34
  else
35
35
  a_tag.remove_attribute('target')
36
36
  end
@@ -1,3 +1,3 @@
1
1
  module Onebox
2
- VERSION = "1.8.22"
2
+ VERSION = "1.8.23"
3
3
  end
data/onebox.gemspec CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen-string-literal: true
2
+
1
3
  # coding: utf-8
2
4
  lib = File.expand_path('../lib', __FILE__)
3
5
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
@@ -40,4 +42,6 @@ Gem::Specification.new do |spec|
40
42
  spec.add_development_dependency 'sinatra-contrib', '~> 1.4'
41
43
  spec.add_development_dependency 'haml', '~> 4.0'
42
44
  spec.add_development_dependency 'listen', '~> 2.10.0'
45
+
46
+ spec.required_ruby_version = '>=2.2.0'
43
47
  end
@@ -2,7 +2,6 @@ require "spec_helper"
2
2
 
3
3
  describe Onebox::Engine::AmazonOnebox do
4
4
 
5
-
6
5
  context "regular amazon page" do
7
6
  before do
8
7
  @link = "https://www.amazon.com/Knit-Noro-Accessories-Colorful-Little/dp/193609620X"
@@ -56,7 +56,7 @@ describe Onebox::Engine::GoogleMapsOnebox do
56
56
  end
57
57
 
58
58
  let(:data) { Onebox::Helpers.symbolize_keys(subject.send(:data)) }
59
- let(:link) {|example| URLS[example.metadata[:urltype] || :short][:test] }
59
+ let(:link) { |example| URLS[example.metadata[:urltype] || :short][:test] }
60
60
 
61
61
  include_context "an engine", urltype: :short
62
62
 
@@ -8,8 +8,8 @@ describe Onebox::Engine::PdfOnebox do
8
8
  let(:no_filesize_html) { described_class.new(no_content_length_link).to_html }
9
9
 
10
10
  before do
11
- FakeWeb.register_uri(:head, link, :content_length => "335562")
12
- FakeWeb.register_uri(:head, no_content_length_link, :content_length => nil)
11
+ FakeWeb.register_uri(:head, link, content_length: "335562")
12
+ FakeWeb.register_uri(:head, no_content_length_link, content_length: nil)
13
13
  end
14
14
 
15
15
  describe "#to_html" do
@@ -76,4 +76,3 @@ describe Onebox::Engine::PubmedOnebox do
76
76
  end
77
77
  end
78
78
  end
79
-
@@ -39,7 +39,7 @@ describe Onebox::Engine::StackExchangeOnebox do
39
39
 
40
40
  {
41
41
  'long URL' => 'http://stackoverflow.com/questions/17992553/concept-behind-these-four-lines-of-tricky-c-code',
42
- 'short URL'=> 'http://stackoverflow.com/q/17992553'
42
+ 'short URL' => 'http://stackoverflow.com/q/17992553'
43
43
  }.each do |name, url|
44
44
  describe "question with #{name}" do
45
45
  before(:all) do
@@ -68,7 +68,7 @@ describe Onebox::Engine::StackExchangeOnebox do
68
68
 
69
69
  {
70
70
  'long URL' => 'http://stackoverflow.com/questions/17992553/concept-behind-these-four-lines-of-tricky-c-code/17992906#17992906',
71
- 'short URL'=> 'http://stackoverflow.com/a/17992906'
71
+ 'short URL' => 'http://stackoverflow.com/a/17992906'
72
72
  }.each do |name, url|
73
73
  describe "answer with #{name}" do
74
74
  before(:all) do
@@ -94,4 +94,4 @@ describe Onebox::Engine::StackExchangeOnebox do
94
94
  end
95
95
  end
96
96
  end
97
- end
97
+ end
@@ -28,7 +28,7 @@ describe Onebox::Engine::TwitterStatusOnebox do
28
28
  end
29
29
 
30
30
  it "includes user avatar" do
31
- expect(html).to include("732349210264133632/RTNgZLrm_normal.jpg")
31
+ expect(html).to include("732349210264133632/RTNgZLrm_400x400.jpg")
32
32
  end
33
33
  end
34
34
 
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
 
3
3
  describe Onebox::Engine::WechatMpOnebox do
4
4
 
5
- let(:link) {"https://mp.weixin.qq.com/s?__biz=MjM5NjM4MDAxMg==&mid=2655075181&idx=1&sn=7c58f17de2c687f4763f17359ecc6e72&chksm=bd5fb76e8a283e7856cae30a74e905a18d9511e81c047b6e12390889de15976fb2c297b04106#rd"}
5
+ let(:link) { "https://mp.weixin.qq.com/s?__biz=MjM5NjM4MDAxMg==&mid=2655075181&idx=1&sn=7c58f17de2c687f4763f17359ecc6e72&chksm=bd5fb76e8a283e7856cae30a74e905a18d9511e81c047b6e12390889de15976fb2c297b04106#rd" }
6
6
  let(:html) { described_class.new(link).to_html }
7
7
 
8
8
  describe "#to_html" do
@@ -13,11 +13,11 @@ describe Onebox::Engine::WechatMpOnebox do
13
13
  it "has the article's title" do
14
14
  expect(html).to include("不是月光宝盒,但也能回到过去")
15
15
  end
16
-
16
+
17
17
  it "has the article's description" do
18
18
  expect(html).to include("你知道吗?从今天起,公众号后台编辑文章时可以……")
19
19
  end
20
-
20
+
21
21
  it "has the article's author" do
22
22
  expect(html).to include("微信派")
23
23
  end
@@ -8,21 +8,21 @@ RSpec.describe Onebox::Helpers do
8
8
  it { expect(described_class.blank?(["test", "testing"])).to be(false) }
9
9
  it { expect(described_class.blank?([])).to be(true) }
10
10
  it { expect(described_class.blank?({})).to be(true) }
11
- it { expect(described_class.blank?({a: 'test'})).to be(false) }
12
11
  it { expect(described_class.blank?(nil)).to be(true) }
13
12
  it { expect(described_class.blank?(true)).to be(false) }
14
13
  it { expect(described_class.blank?(false)).to be(true) }
14
+ it { expect(described_class.blank?(a: 'test')).to be(false) }
15
15
  end
16
16
 
17
17
  describe ".truncate" do
18
18
  let(:test_string) { "Chops off on spaces" }
19
19
  it { expect(described_class.truncate(test_string)).to eq(test_string) }
20
- it { expect(described_class.truncate(test_string,5)).to eq("Chops...") }
21
- it { expect(described_class.truncate(test_string,7)).to eq("Chops...") }
22
- it { expect(described_class.truncate(test_string,9)).to eq("Chops off...") }
23
- it { expect(described_class.truncate(test_string,10)).to eq("Chops off...") }
24
- it { expect(described_class.truncate(test_string,100)).to eq("Chops off on spaces") }
25
- it { expect(described_class.truncate(" #{test_string} ",6)).to eq(" Chops...") }
20
+ it { expect(described_class.truncate(test_string, 5)).to eq("Chops...") }
21
+ it { expect(described_class.truncate(test_string, 7)).to eq("Chops...") }
22
+ it { expect(described_class.truncate(test_string, 9)).to eq("Chops off...") }
23
+ it { expect(described_class.truncate(test_string, 10)).to eq("Chops off...") }
24
+ it { expect(described_class.truncate(test_string, 100)).to eq("Chops off on spaces") }
25
+ it { expect(described_class.truncate(" #{test_string} ", 6)).to eq(" Chops...") }
26
26
  end
27
27
 
28
28
  describe "fetch_response" do
@@ -44,7 +44,7 @@ RSpec.describe Onebox::Helpers do
44
44
 
45
45
  describe "user_agent" do
46
46
  before do
47
- fake("http://example.com/some-resource", :body => 'test')
47
+ fake("http://example.com/some-resource", body: 'test')
48
48
  end
49
49
 
50
50
  context "default" do
@@ -16,7 +16,7 @@ describe Onebox::Layout do
16
16
 
17
17
  context "when template exists in directory_b" do
18
18
  before(:each) do
19
- allow_any_instance_of(described_class).to receive(:template?) { |_,path| path == "directory_b" }
19
+ allow_any_instance_of(described_class).to receive(:template?) { |_, path| path == "directory_b" }
20
20
  end
21
21
 
22
22
  it "returns directory_b" do
@@ -26,7 +26,7 @@ describe Onebox::Layout do
26
26
 
27
27
  context "when template exists in directory_a" do
28
28
  before(:each) do
29
- allow_any_instance_of(described_class).to receive(:template?) { |_,path| path == "directory_a" }
29
+ allow_any_instance_of(described_class).to receive(:template?) { |_, path| path == "directory_a" }
30
30
  end
31
31
 
32
32
  it "returns directory_a" do
@@ -1,6 +1,6 @@
1
1
  {{#owner.profile_image}}
2
2
  <a href="{{owner.link}}" target="_blank">
3
- <img alt="{{owner.display_name}}" src="{{owner.profile_image}}" class="thumbnail">
3
+ <img alt="{{owner.display_name}}" src="{{owner.profile_image}}" class="thumbnail onebox-avatar">
4
4
  </a>
5
5
  {{/owner.profile_image}}
6
6
  <h4>
@@ -1,4 +1,4 @@
1
- {{#avatar}}<img src="{{avatar}}" class="thumbnail">{{/avatar}}
1
+ {{#avatar}}<img src="{{avatar}}" class="thumbnail onebox-avatar">{{/avatar}}
2
2
  <h4>
3
3
  <a href='{{link}}' target='_blank'>
4
4
  {{title}}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onebox
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.22
4
+ version: 1.8.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joanna Zeta
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-11-03 00:00:00.000000000 Z
13
+ date: 2017-11-08 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: multi_json
@@ -516,7 +516,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
516
516
  requirements:
517
517
  - - ">="
518
518
  - !ruby/object:Gem::Version
519
- version: '0'
519
+ version: 2.2.0
520
520
  required_rubygems_version: !ruby/object:Gem::Requirement
521
521
  requirements:
522
522
  - - ">="
@@ -611,3 +611,4 @@ test_files:
611
611
  - spec/lib/onebox_spec.rb
612
612
  - spec/spec_helper.rb
613
613
  - spec/support/html_spec_helper.rb
614
+ has_rdoc: