cinch-toolbox 0.0.5 → 1.0.0

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.
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ nguage: ruby
2
+ rvm:
3
+ - ruby-head
4
+ - 1.9.2
5
+ - 1.9.3
data/README.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Cinch Toolbox
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/cinch-toolbox.png)](http://badge.fury.io/rb/cinch-dicebag)
4
+ [![Dependency Status](https://gemnasium.com/bhaberer/cinch-toolbox.png)](https://gemnasium.com/bhaberer/cinch-dicebag)
5
+ [![Build Status](https://travis-ci.org/bhaberer/cinch-toolbox.png?branch=master)](https://travis-ci.org/bhaberer/cinch-dicebag)
6
+ [![Coverage Status](https://coveralls.io/repos/bhaberer/cinch-toolbox/badge.png?branch=master)](https://coveralls.io/r/bhaberer/cinch-dicebag?branch=master)
7
+ [![Code Climate](https://codeclimate.com/github/bhaberer/cinch-toolbox.png)](https://codeclimate.com/github/bhaberer/cinch-dicebag)
8
+
3
9
  This is just a gem required fro many of my plugins, it facilitates a variety of mundane operations.
4
10
 
5
11
  * URL Shortening / Expansion.
@@ -35,3 +41,12 @@ Or install it yourself as:
35
41
  3. Commit your changes (`git commit -am 'Add some feature'`)
36
42
  4. Push to the branch (`git push origin my-new-feature`)
37
43
  5. Create new Pull Request
44
+
45
+ ## Changelog
46
+
47
+ * 1.0.0
48
+ * Added tests!
49
+ * Added docs!
50
+ * Cleaned up code in `Toolbox.get_html_element` to be more error resistant
51
+ * Cleaned up code in `Toolbox.time_format` to be more concise.
52
+
data/Rakefile CHANGED
@@ -1 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
@@ -17,6 +17,11 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
19
 
20
- gem.add_dependency('nokogiri', '1.5.9')
21
- gem.add_dependency('patron', '0.4.18')
20
+ gem.add_development_dependency 'rake'
21
+ gem.add_development_dependency 'rspec'
22
+ gem.add_development_dependency 'coveralls'
23
+ gem.add_development_dependency 'fakeweb', '~> 1.3'
24
+
25
+ gem.add_dependency 'nokogiri', '~> 1.5.9'
26
+ gem.add_dependency 'patron', '~> 0.4.18'
22
27
  end
data/lib/cinch-toolbox.rb CHANGED
@@ -6,19 +6,29 @@ require 'nokogiri'
6
6
 
7
7
  module Cinch
8
8
  module Toolbox
9
+
9
10
  # Get an element of the supplied website
10
- def Toolbox.get_html_element(url, selector, mode = 'css')
11
+ # @param [String] url The url to access.
12
+ # @param [String] selector The the selector to try an acquire on the page.
13
+ # @param [String] mode (:css) Set his to css or xpath based on the type of selector.
14
+ # @return [String] The content ofg the Element or Nil if the element could not be found.
15
+ def Toolbox.get_html_element(url, selector, mode = :css)
11
16
  # Make sure the URL is legit
12
17
  url = URI::extract(url, ["http", "https"]).first
13
-
14
- case mode
15
- when 'css'
16
- return Nokogiri::HTML(open(url)).css(selector).first.content
17
- when 'xpath'
18
- return Nokogiri::HTML(open(url)).xpath(selector).first
18
+ url = Nokogiri::HTML(open(url))
19
+ if url.send(mode.to_sym, selector).empty?
20
+ return nil
21
+ else
22
+ return url.send(mode.to_sym, selector).first.content
19
23
  end
24
+ rescue SocketError, RuntimeError
25
+ # Rescue for any kind of network sillyness
26
+ return nil
20
27
  end
21
28
 
29
+ # Get the title of a given web page.
30
+ # @param [String] url The url of the page you want the title from.
31
+ # @return [String] Either contents of the title element or a notion for an image.
22
32
  def Toolbox.get_page_title(url)
23
33
  # Make sure the URL is legit
24
34
  url = URI::extract(url, ["http", "https"]).first
@@ -26,63 +36,60 @@ module Cinch
26
36
  # If the link is to an image, extract the filename.
27
37
  if url.match(/\.jpg|jpeg|gif|png$/)
28
38
  # unless it's from reddit, then change the url to the gallery to get the image's caption.
29
- if imgur_id = url.match(/https?:\/\/i\.imgur\.com.*\/([A-Za-z0-9]+)\.(jpg|jpeg|png|gif)/)[1]
39
+ if imgur_id = url[/https?:\/\/i\.imgur\.com.*\/([A-Za-z0-9]+)\.(jpg|jpeg|png|gif)/, 1]
30
40
  url = "http://imgur.com/#{imgur_id}"
31
41
  else
32
- site = url.match(/\.([^\.]+\.[^\/]+)/)
42
+ site = url.match(/([^\.]+\.[^\/]+)/)
33
43
  return site.nil? ? "Image [#{url}]!!!" : "Image from #{site[1]}"
34
44
  end
35
45
  end
36
46
 
37
47
  # Grab the element, return nothing if the site doesn't have a title.
38
- page = Nokogiri::HTML(open(url)).css('title')
39
- return page.first.content.strip.gsub(/\s+/, ' ') unless page.empty?
40
- end
41
-
42
- # Expand a previously shortened URL via the configured shortener
43
- def Toolbox.expand(url)
44
- shortener.get("forward.php?format=simple&shorturl=#{url}").body
48
+ title = Toolbox.get_html_element(url, 'title')
49
+ return title.strip.gsub(/\s+/, ' ') unless title.nil?
45
50
  end
46
51
 
47
52
  # Shorten a URL via the configured shortener
53
+ # @param [String] url The url of the page you want to shorten.
54
+ # @return [String] The shortened url.
48
55
  def Toolbox.shorten(url)
49
56
  return url if url.length < 45
50
57
  return shortener.get("create.php?format=simple&url=#{url}").body
51
58
  end
52
59
 
60
+ # Expand a previously shortened URL via the configured shortener
61
+ # @param [String] url A previously shortened url.
62
+ # @return [String] The expanded url.
63
+ def Toolbox.expand(url)
64
+ shortener.get("forward.php?format=simple&shorturl=#{url}").body
65
+ end
66
+
53
67
  # Truncate a given block of text, used for making sure the bot doesn't flood.
68
+ # @param [String] text The block of text to check.
69
+ # @param [Fixnum] length (250) length to which to constrain the block of text.
54
70
  def Toolbox.truncate(text, length = 250)
55
- text = text.gsub(/\n/, ' · ')
71
+ text = text.gsub(/\n/, ' ')
56
72
  if text.length > length
57
- text = text[0,length - 1] + '...'
73
+ text = text[0, (length - 3)] + '...'
58
74
  end
59
75
  return text
60
76
  end
61
77
 
62
78
  # Used to render a period of time in a uniform string.
63
79
  # There is probably a much better way to do this, so FIXME
80
+ # @param [Fixnum] secs Number of seconds to render into a string.
64
81
  def Toolbox.time_format(secs)
65
- data = time_parse(secs)
66
- string = ''
67
-
68
- string << "#{data[:days]}d " unless data[:days].zero? && string == ''
69
- string << "#{data[:hours]}h " unless data[:hours].zero? && string == ''
70
- string << "#{data[:mins]}m " unless data[:mins].zero? && string == ''
71
- string << "#{data[:secs]}s"
72
-
73
- return string
74
- end
75
-
76
- def Toolbox.time_parse(secs)
77
- days = secs / 86400
78
- hours = (secs % 86400) / 3600
79
- mins = (secs % 3600) / 60
80
- secs = secs % 60
81
-
82
- return { :days => days.floor,
83
- :hours => hours.floor,
84
- :mins => mins.floor,
85
- :secs => secs.floor }
82
+ data = { :days => (secs / 86400).floor,
83
+ :hours => ((secs % 86400) / 3600).floor,
84
+ :mins => ((secs % 3600) / 60).floor,
85
+ :secs => (secs % 60).floor }
86
+ string = []
87
+ data.keys.map do |period|
88
+ if period == :secs || !(data[period].zero? && string.empty?)
89
+ string << "#{data[period]}#{period.slice(0)}"
90
+ end
91
+ end
92
+ return string.join(' ')
86
93
  end
87
94
 
88
95
  private
@@ -1,5 +1,5 @@
1
1
  module Cinch
2
2
  module Toolbox
3
- VERSION = "0.0.5"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
@@ -0,0 +1,117 @@
1
+ require 'spec_helper'
2
+ require 'fakeweb'
3
+
4
+ describe Cinch::Toolbox do
5
+
6
+ describe 'the get_html_element method' do
7
+ before(:all) do
8
+ FakeWeb.register_uri( :get, "http://example.com/",
9
+ :body => "<div id='a1' class='top'>
10
+ <div class='foo'>Bar</div>
11
+ <div id='foo1'>Baz</div>
12
+ </div>")
13
+ end
14
+
15
+ it 'should return a string with contents of a css selector of a web page' do
16
+ Cinch::Toolbox.get_html_element('http://example.com/', '.foo', :css).
17
+ should == 'Bar'
18
+ end
19
+
20
+ it 'should return a string with contents of a xpath selector of a web page' do
21
+ Cinch::Toolbox.get_html_element('http://example.com/', "//div/div[1]", :xpath).
22
+ should == 'Bar'
23
+ end
24
+
25
+ it 'should return nil if the css element does not exist' do
26
+ Cinch::Toolbox.get_html_element('http://example.com/', '.foo2', :css).
27
+ should be_nil
28
+ end
29
+
30
+ it 'should return nil if the xpath element does not exist' do
31
+ Cinch::Toolbox.get_html_element('http://example.com/', "//div/div[3]", :xpath).
32
+ should be_nil
33
+ end
34
+
35
+ it 'should return nil if there is a problem finding the site' do
36
+ Cinch::Toolbox.get_html_element('http://baddurl.com/', '.foo2', :css).
37
+ should be_nil
38
+ end
39
+
40
+ it 'should return the page title if there is a http => https trasition' do
41
+ Cinch::Toolbox.get_html_element('http://github.com/bhaberer/', 'title', :css).
42
+ should include 'bhaberer (Brian Haberer)'
43
+ end
44
+
45
+ it 'should return nil if there is a https => http trasition' do
46
+ Cinch::Toolbox.get_html_element('https://www.amazon.com/', 'title', :css).
47
+ should be_nil
48
+ end
49
+ end
50
+
51
+ describe 'the get_page_title method' do
52
+ before(:all) do
53
+ end
54
+
55
+ it 'should return a page title for a given url' do
56
+ FakeWeb.register_uri( :get, "http://example.com/", :body => "<title>Page Title</table>")
57
+ Cinch::Toolbox.get_page_title("http://example.com/").
58
+ should == 'Page Title'
59
+ end
60
+
61
+ it 'should return Nil if a page is lacking a title' do
62
+ FakeWeb.register_uri( :get, "http://example.com/", :body => "<body>Page Title</body>")
63
+ Cinch::Toolbox.get_page_title("http://example.com/").
64
+ should be_nil
65
+ end
66
+
67
+ it 'should return an image title if a page is a supported image type' do
68
+ [:jpg, :jpeg, :gif, :png].each do |image|
69
+ Cinch::Toolbox.get_page_title("http://example.com/image.#{image}").
70
+ should == "Image from http://example.com"
71
+ end
72
+ end
73
+
74
+ it 'should return Nil if a page is lacking a title' do
75
+ Cinch::Toolbox.get_page_title("http://i.imgur.com/oMndYK7.jpg").
76
+ should == "Anybody with a cat will relate. - Imgur"
77
+ end
78
+ end
79
+
80
+ describe 'url shortening and expanding' do
81
+ it 'should shorten long urls' do
82
+ Cinch::Toolbox.shorten('http://en.wikipedia.org/wiki/Llanfairpwllgwyngyllgogerychwyrndrobwllllan').
83
+ should == "http://is.gd/PaUTII"
84
+ end
85
+
86
+ it 'should not shorten urls that are already short enough (< 45 cha)' do
87
+ Cinch::Toolbox.shorten('http://en.wikipedia.org/').
88
+ should == 'http://en.wikipedia.org/'
89
+ end
90
+
91
+ it 'should be able to expand shortened links' do
92
+ url = 'http://en.wikipedia.org/wiki/Llanfairpwllgwyngyll'
93
+ Cinch::Toolbox.expand(Cinch::Toolbox.shorten(url)).should == url
94
+ end
95
+ end
96
+
97
+ describe 'truncate method' do
98
+ it 'should truncate text past the limit' do
99
+ foo = String.new
100
+ 1000.times { foo << 'a' }
101
+ Cinch::Toolbox.truncate(foo).length.should == 250
102
+ end
103
+
104
+ it 'should not truncate text within limit' do
105
+ foo = String.new
106
+ 1000.times { foo << 'a' }
107
+ Cinch::Toolbox.truncate(foo, 100).length.should == 100
108
+ end
109
+ end
110
+
111
+ describe 'time parseing' do
112
+ it 'should parse seconds into a user friendly string' do
113
+ Cinch::Toolbox.time_format(126).
114
+ should == '2m 6s'
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,4 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+ require 'cinch-toolbox'
4
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cinch-toolbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,14 +9,78 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-19 00:00:00.000000000 Z
12
+ date: 2013-06-09 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: coveralls
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: fakeweb
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '1.3'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '1.3'
14
78
  - !ruby/object:Gem::Dependency
15
79
  name: nokogiri
16
80
  requirement: !ruby/object:Gem::Requirement
17
81
  none: false
18
82
  requirements:
19
- - - '='
83
+ - - ~>
20
84
  - !ruby/object:Gem::Version
21
85
  version: 1.5.9
22
86
  type: :runtime
@@ -24,7 +88,7 @@ dependencies:
24
88
  version_requirements: !ruby/object:Gem::Requirement
25
89
  none: false
26
90
  requirements:
27
- - - '='
91
+ - - ~>
28
92
  - !ruby/object:Gem::Version
29
93
  version: 1.5.9
30
94
  - !ruby/object:Gem::Dependency
@@ -32,7 +96,7 @@ dependencies:
32
96
  requirement: !ruby/object:Gem::Requirement
33
97
  none: false
34
98
  requirements:
35
- - - '='
99
+ - - ~>
36
100
  - !ruby/object:Gem::Version
37
101
  version: 0.4.18
38
102
  type: :runtime
@@ -40,7 +104,7 @@ dependencies:
40
104
  version_requirements: !ruby/object:Gem::Requirement
41
105
  none: false
42
106
  requirements:
43
- - - '='
107
+ - - ~>
44
108
  - !ruby/object:Gem::Version
45
109
  version: 0.4.18
46
110
  description: A gem of various methods used in many of my plugins. If you need the
@@ -52,6 +116,7 @@ extensions: []
52
116
  extra_rdoc_files: []
53
117
  files:
54
118
  - .gitignore
119
+ - .travis.yml
55
120
  - Gemfile
56
121
  - LICENSE.txt
57
122
  - README.md
@@ -59,6 +124,8 @@ files:
59
124
  - cinch-toolbox.gemspec
60
125
  - lib/cinch-toolbox.rb
61
126
  - lib/cinch-toolbox/version.rb
127
+ - spec/cinch-toolbox_spec.rb
128
+ - spec/spec_helper.rb
62
129
  homepage: https://github.com/bhaberer/cinch-toolbox
63
130
  licenses: []
64
131
  post_install_message:
@@ -83,4 +150,7 @@ rubygems_version: 1.8.24
83
150
  signing_key:
84
151
  specification_version: 3
85
152
  summary: Common methods used in Cinch Plugins.
86
- test_files: []
153
+ test_files:
154
+ - spec/cinch-toolbox_spec.rb
155
+ - spec/spec_helper.rb
156
+ has_rdoc: