libnotify 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 82a615e051a8e0dba67bdf342658f77916da91a5
4
+ data.tar.gz: 12fb683c69feb30e8566205c011a88ec18769f11
5
+ SHA512:
6
+ metadata.gz: d5d6f9d9ce4d443b8a213f7836b5ef95f48d3f5c53ea41995b812d317a881a495418748d7697e2fc2ab46849c0a037a1269d74883a162d501758f54164e2e59d
7
+ data.tar.gz: 08c63a7b19b8cd9e000b7106f6c7d64326c837bc2719d65a85968409c98634ab87457ca27cbbfeb759c934648fde4fe6ca9aac56d7e413020752e2415c6ae975
@@ -0,0 +1 @@
1
+ 2.0.0
@@ -0,0 +1,2 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - ree
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - jruby-19mode
7
+ #- rbx-19mode
8
+ before_install:
9
+ - "sudo apt-get install libnotify4"
@@ -1,5 +1,7 @@
1
1
  = Libnotify
2
2
 
3
+ {<img src="https://travis-ci.org/splattael/libnotify.png?branch=master" alt="Build Status" />}[https://travis-ci.org/splattael/libnotify] {<img src="https://badge.fury.io/rb/libnotify.png" alt="Gem Version" />}[http://badge.fury.io/rb/libnotify] {<img src="https://codeclimate.com/github/splattael/libnotify.png" />}[https://codeclimate.com/github/splattael/libnotify]
4
+
3
5
  Ruby bindings for libnotify using FFI.
4
6
 
5
7
  Gem[https://rubygems.org/gems/libnotify] |
@@ -64,6 +66,16 @@ You'll need libnotify. On Debian just type:
64
66
  bundle install
65
67
  rake
66
68
 
69
+ === Code coverage
70
+
71
+ COVERAGE=1 rake
72
+
73
+ == Caveats
74
+
75
+ * +timeout+ and +append+ options might not work on Ubuntu.
76
+ See GH #21 for details.
77
+ https://github.com/splattael/libnotify/issues/21#issuecomment-19114127
78
+
67
79
  == Authors
68
80
 
69
81
  * Peter Suschlik (https://github.com/splattael)
data/Rakefile CHANGED
@@ -11,7 +11,7 @@ desc 'Default: run unit tests.'
11
11
  task :default => :test
12
12
 
13
13
  Rake::TestTask.new(:test) do |test|
14
- test.test_files = FileList.new('test/test_*.rb')
14
+ test.test_files = FileList.new('test/**/*_test.rb')
15
15
  test.libs << 'test'
16
16
  test.verbose = true
17
17
  end
@@ -1,4 +1,5 @@
1
1
  require 'libnotify/ffi'
2
+ require 'libnotify/icon_finder'
2
3
 
3
4
  module Libnotify
4
5
  # API for Libnotify
@@ -20,23 +21,6 @@ module Libnotify
20
21
  "/usr/share/icons/gnome/*/emotes"
21
22
  ]
22
23
 
23
- # TODO refactor & test!
24
- ICON_REGEX = /(\d+)x\d/
25
- ICON_SORTER = proc do |a, b|
26
- ma = a.scan ICON_REGEX
27
- mb = b.scan ICON_REGEX
28
-
29
- if ma.first && mb.first
30
- mb.first.first.to_i <=> ma.first.first.to_i
31
- elsif ma.first && !mb.first
32
- 1
33
- elsif !ma.first && ma.first
34
- -1
35
- else
36
- a <=> b
37
- end
38
- end
39
-
40
24
  # Creates a notification object.
41
25
  #
42
26
  # @see Libnotify.new
@@ -100,7 +84,6 @@ module Libnotify
100
84
  def timeout=(timeout)
101
85
  @timeout = case timeout
102
86
  when Float
103
- timeout /= 10 if RUBY_VERSION == "1.8.6" # Strange workaround?
104
87
  (timeout * 1000).to_i
105
88
  when Fixnum
106
89
  if timeout >= 100 # assume miliseconds
@@ -117,16 +100,15 @@ module Libnotify
117
100
 
118
101
  # Sets icon path.
119
102
  #
120
- # Path can be absolute, relative (will be resolved) or an symbol.
103
+ # Path can be absolute, relative (will be resolved) or a symbol.
121
104
  #
122
105
  # @todo document and refactor
123
106
  def icon_path=(path)
124
107
  case path
125
- when /^\// # absolute
108
+ when %r{^/} # absolute
126
109
  @icon_path = path
127
110
  when String
128
- list = self.class.icon_dirs.map { |d| Dir[File.join(d, path)] }.flatten.sort(&ICON_SORTER)
129
- @icon_path = list.detect { |full_path| File.exist?(full_path) } || path
111
+ @icon_path = icon_for(path)
130
112
  when Symbol
131
113
  self.icon_path = "#{path}.png"
132
114
  else
@@ -142,5 +124,10 @@ module Libnotify
142
124
  new(options, &block).show!
143
125
  end
144
126
 
127
+ private
128
+
129
+ def icon_for(name)
130
+ IconFinder.new(self.class.icon_dirs).icon_path(name) || name
131
+ end
145
132
  end
146
133
  end
@@ -0,0 +1,42 @@
1
+ module Libnotify
2
+ class IconFinder
3
+ def initialize(dirs)
4
+ @dirs = dirs
5
+ end
6
+
7
+ def icon_path(name)
8
+ list = @dirs.map do |dir|
9
+ glob = File.join(dir, name)
10
+ Dir[glob].map { |fullpath| Icon.new(fullpath) }
11
+ end
12
+ if found = list.flatten.sort.first
13
+ found.to_s
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ class Icon
20
+ attr_reader :fullpath
21
+
22
+ def initialize(fullpath)
23
+ @fullpath = fullpath
24
+ end
25
+
26
+ ICON_REGEX = /(\d+)x\d+/
27
+ def resolution
28
+ @resolution ||= @fullpath[ICON_REGEX, 1].to_i
29
+ end
30
+
31
+ def to_s
32
+ fullpath
33
+ end
34
+
35
+ def <=>(other)
36
+ result = other.resolution <=> self.resolution
37
+ result = self.fullpath <=> other.fullpath if result == 0
38
+ result
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,4 +1,4 @@
1
- SUPPORTED_RUBIES = %w[ree 1.9.2 1.9.3 jruby rbx]
1
+ SUPPORTED_RUBIES = %w[ree 1.9.3 2.0.0 jruby rbx]
2
2
  GEMSPEC = Bundler::GemHelper.new(Dir.pwd).gemspec
3
3
 
4
4
  def with_ruby(ruby, command)
@@ -15,7 +15,7 @@ end
15
15
  namespace :rubies do
16
16
  desc "Run tests for following supported platforms #{SUPPORTED_RUBIES.join ", "}"
17
17
  task :test do
18
- command = "(bundle check || bundle install) && bundle exec rake"
18
+ command = "rm -f Gemfile.lock && bundle install && bundle exec rake"
19
19
  SUPPORTED_RUBIES.each { |ruby| with_ruby(ruby, command) }
20
20
  end
21
21
  end
@@ -1,3 +1,3 @@
1
1
  module Libnotify
2
- VERSION = "0.8.0"
2
+ VERSION = "0.8.1"
3
3
  end
@@ -17,7 +17,8 @@ Gem::Specification.new do |s|
17
17
 
18
18
  s.add_runtime_dependency 'ffi', '>= 1.0.11'
19
19
 
20
- s.add_development_dependency 'yard', '>= 0.8.2'
21
- s.add_development_dependency 'minitest', '>= 3.1.0'
22
- s.add_development_dependency 'minitest-libnotify', '>= 0.2.2'
20
+ s.add_development_dependency 'yard', '~> 0.8.6.1'
21
+ s.add_development_dependency 'minitest', '~> 4.7.4'
22
+ s.add_development_dependency 'minitest-libnotify', '~> 0.2.2'
23
+ s.add_development_dependency 'simplecov'
23
24
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,5 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
+ require 'simplecov' if ENV['COVERAGE'] == '1'
4
+
3
5
  require 'minitest/autorun'
4
6
  require 'minitest/libnotify'
5
7
 
@@ -24,6 +26,10 @@ module LibnotifyAssertions
24
26
  assert_equal expected, got, message
25
27
  end
26
28
  end
29
+
30
+ def fixture_file(path)
31
+ File.expand_path(File.join(File.dirname(__FILE__), "fixtures", path))
32
+ end
27
33
  end
28
34
 
29
35
  class LibnotifyTestCase < MiniTest::Spec
@@ -32,6 +38,8 @@ class LibnotifyTestCase < MiniTest::Spec
32
38
  class << self
33
39
  alias :test :it
34
40
  alias :context :describe
41
+ alias :setup :before
42
+ alias :teardown :after
35
43
  end
36
44
 
37
45
  def libnotify(options={}, &block)
@@ -0,0 +1,14 @@
1
+ require 'helper'
2
+
3
+ class IntegrationTest < LibnotifyTestCase
4
+ test "display notification" do
5
+ libnotify = Libnotify::API.new(:timeout => 0.5, :icon_path => :"emblem-favorite", :append => true)
6
+
7
+ [ :low, :normal, :critical ].each do |urgency|
8
+ libnotify.summary = "#{RUBY_VERSION} at #{RUBY_PLATFORM}"
9
+ libnotify.body = [ urgency, defined?(RUBY_DESCRIPTION) ? RUBY_DESCRIPTION : '?' ].join(" ")
10
+ libnotify.urgency = urgency
11
+ libnotify.show!
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,57 @@
1
+ require 'helper'
2
+
3
+ class LibnotifyAPITest < LibnotifyTestCase
4
+ test "instance default values" do
5
+ assert_equal " ", libnotify.summary
6
+ assert_equal " ", libnotify.body
7
+ assert_equal :normal, libnotify.urgency
8
+ assert_nil libnotify.timeout
9
+ assert_nil libnotify.icon_path
10
+ assert libnotify.append
11
+ refute libnotify.transient
12
+ end
13
+
14
+ test "instance with options and block" do
15
+ libnotify(:summary => "hello", :body => "body", :invalid_option => 23) do |n|
16
+ n.body = "overwritten"
17
+ n.icon_path = "/path/to/icon"
18
+ n.append = false
19
+ n.transient = true
20
+ end
21
+
22
+ assert_equal "hello", libnotify.summary
23
+ assert_equal "overwritten", libnotify.body
24
+ assert_equal "/path/to/icon", libnotify.icon_path
25
+ refute libnotify.append
26
+ assert libnotify.transient
27
+ end
28
+
29
+ test "timeout=" do
30
+ assert_timeout 2500, 2.5, "with float"
31
+ assert_timeout 100, 100, "with fixnum ms"
32
+ assert_timeout 101, 101, "with fixnum ms"
33
+ assert_timeout 1000, 1, "with fixnum seconds"
34
+ assert_timeout 99000, 99, "with fixnum seconds"
35
+ assert_timeout nil, nil, "with nil"
36
+ assert_timeout nil, false, "with false"
37
+ assert_timeout 2, :"2 s", "with to_s.to_i"
38
+ end
39
+
40
+ test "icon_path=" do
41
+ Libnotify::API.icon_dirs << File.expand_path("../../..", __FILE__)
42
+ assert_icon_path "/some/path/image.jpg", "/some/path/image.jpg", "with absolute path"
43
+ assert_icon_path "some-invalid-path.jpg", "some-invalid-path.jpg", "with non-existant relative path"
44
+ assert_icon_path %r{^/.*/libnotify.png}, "libnotify.png", "with relative path"
45
+ assert_icon_path %r{^/.*/libnotify.png}, :"libnotify", "with symbol"
46
+ end
47
+
48
+ test "update" do
49
+ libnotify(:summary => "hello", :body => "world").show!
50
+ libnotify.update(:summary => "hell") do |n|
51
+ n.body = "yeah"
52
+ end
53
+ assert_equal "hell", libnotify.summary
54
+ assert_equal "yeah", libnotify.body
55
+ libnotify.close
56
+ end
57
+ end
@@ -0,0 +1,41 @@
1
+ require 'helper'
2
+
3
+ require 'fileutils'
4
+
5
+ class LibnotifyIconFinderTest < LibnotifyTestCase
6
+ test "find icon with highest resolution" do
7
+ dir = fixture_file("/icons/*")
8
+ assert_icon_path [ dir ], "/icons/128x128/happy.jpg", "happy.jpg"
9
+ end
10
+
11
+ test "search all provided dirs" do
12
+ dirs = [ fixture_file("/icons/*"), fixture_file("/emoticons/*") ]
13
+
14
+ assert_icon_path dirs, "/emoticons/128x128/happy.jpg", "happy.jpg"
15
+ end
16
+
17
+ test "does not find unknown icons" do
18
+ dir = fixture_file("/icons/*")
19
+ refute icon_finder([ dir ]).icon_path("unknown.jpg")
20
+ end
21
+
22
+ test "does not find known icon in unknown dirs" do
23
+ dir = fixture_file("/unknown/*")
24
+ refute icon_finder([ dir ]).icon_path("happy.jpg")
25
+ end
26
+
27
+ test "find icon alphabetically w/o resolution" do
28
+ dir = fixture_file("/images/*")
29
+ assert_icon_path [ dir ], "/images/another/happy.jpg", "happy.jpg"
30
+ end
31
+
32
+ private
33
+
34
+ def icon_finder(*dirs)
35
+ Libnotify::IconFinder.new(dirs)
36
+ end
37
+
38
+ def assert_icon_path(dirs, expected, name)
39
+ assert_equal fixture_file(expected), icon_finder(*dirs).icon_path(name)
40
+ end
41
+ end
@@ -0,0 +1,16 @@
1
+ require 'helper'
2
+
3
+ class LibnotifyTest < LibnotifyTestCase
4
+ test "responds to new" do
5
+ assert_respond_to Libnotify, :new
6
+ end
7
+
8
+ test "responds to show" do
9
+ assert_respond_to Libnotify, :show
10
+ end
11
+
12
+ test "has version" do
13
+ assert defined?(Libnotify::VERSION), "version is defined"
14
+ assert Libnotify::VERSION
15
+ end
16
+ end
metadata CHANGED
@@ -1,80 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libnotify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
5
- prerelease:
4
+ version: 0.8.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Peter Suschlik
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-10-02 00:00:00.000000000 Z
11
+ date: 2013-07-02 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: ffi
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: 1.0.11
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: 1.0.11
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: yard
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ~>
36
32
  - !ruby/object:Gem::Version
37
- version: 0.8.2
33
+ version: 0.8.6.1
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ~>
44
39
  - !ruby/object:Gem::Version
45
- version: 0.8.2
40
+ version: 0.8.6.1
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: minitest
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ~>
52
46
  - !ruby/object:Gem::Version
53
- version: 3.1.0
47
+ version: 4.7.4
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ~>
60
53
  - !ruby/object:Gem::Version
61
- version: 3.1.0
54
+ version: 4.7.4
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: minitest-libnotify
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ~>
68
60
  - !ruby/object:Gem::Version
69
61
  version: 0.2.2
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ~>
76
67
  - !ruby/object:Gem::Version
77
68
  version: 0.2.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
78
83
  description:
79
84
  email:
80
85
  - peter-libnotify@suschlik.de
@@ -83,7 +88,9 @@ extensions: []
83
88
  extra_rdoc_files: []
84
89
  files:
85
90
  - .gitignore
86
- - .rvmrc
91
+ - .ruby-version
92
+ - .simplecov
93
+ - .travis.yml
87
94
  - Gemfile
88
95
  - LICENSE
89
96
  - README.rdoc
@@ -91,41 +98,46 @@ files:
91
98
  - lib/libnotify.rb
92
99
  - lib/libnotify/api.rb
93
100
  - lib/libnotify/ffi.rb
101
+ - lib/libnotify/icon_finder.rb
94
102
  - lib/libnotify/tasks/rubies.rake
95
103
  - lib/libnotify/version.rb
96
104
  - libnotify.gemspec
97
105
  - libnotify.png
106
+ - test/fixtures/.keep
107
+ - test/fixtures/emoticons/128x128/happy.jpg
108
+ - test/fixtures/icons/128x128/happy.jpg
109
+ - test/fixtures/icons/16x16/happy.jpg
110
+ - test/fixtures/icons/32x32/happy.jpg
111
+ - test/fixtures/icons/other/happy.jpg
112
+ - test/fixtures/images/another/happy.jpg
113
+ - test/fixtures/images/other/happy.jpg
98
114
  - test/helper.rb
99
- - test/test_libnotify.rb
115
+ - test/integration_test.rb
116
+ - test/libnotify/api_test.rb
117
+ - test/libnotify/icon_finder_test.rb
118
+ - test/libnotify_test.rb
100
119
  homepage: http://rubygems.org/gems/libnotify
101
120
  licenses: []
121
+ metadata: {}
102
122
  post_install_message:
103
123
  rdoc_options: []
104
124
  require_paths:
105
125
  - lib
106
126
  required_ruby_version: !ruby/object:Gem::Requirement
107
- none: false
108
127
  requirements:
109
- - - ! '>='
128
+ - - '>='
110
129
  - !ruby/object:Gem::Version
111
130
  version: '0'
112
- segments:
113
- - 0
114
- hash: 3247068429593286265
115
131
  required_rubygems_version: !ruby/object:Gem::Requirement
116
- none: false
117
132
  requirements:
118
- - - ! '>='
133
+ - - '>='
119
134
  - !ruby/object:Gem::Version
120
135
  version: '0'
121
- segments:
122
- - 0
123
- hash: 3247068429593286265
124
136
  requirements: []
125
137
  rubyforge_project:
126
- rubygems_version: 1.8.24
138
+ rubygems_version: 2.0.3
127
139
  signing_key:
128
- specification_version: 3
140
+ specification_version: 4
129
141
  summary: Ruby bindings for libnotify using FFI
130
142
  test_files: []
131
143
  has_rdoc:
data/.rvmrc DELETED
@@ -1 +0,0 @@
1
- rvm @libnotify --create
@@ -1,87 +0,0 @@
1
- require 'helper'
2
-
3
- class TestLibnotify < LibnotifyTestCase
4
- context Libnotify do
5
- test "responds to new" do
6
- assert_respond_to Libnotify, :new
7
- end
8
-
9
- test "responds to show" do
10
- assert_respond_to Libnotify, :show
11
- end
12
-
13
- test "has version" do
14
- assert defined?(Libnotify::VERSION), "version is defined"
15
- assert Libnotify::VERSION
16
- end
17
- end
18
-
19
- context Libnotify::API do
20
- test "instance default values" do
21
- assert_equal " ", libnotify.summary
22
- assert_equal " ", libnotify.body
23
- assert_equal :normal, libnotify.urgency
24
- assert_nil libnotify.timeout
25
- assert_nil libnotify.icon_path
26
- assert libnotify.append
27
- refute libnotify.transient
28
- end
29
-
30
- test "instance with options and block" do
31
- libnotify(:summary => "hello", :body => "body", :invalid_option => 23) do |n|
32
- n.body = "overwritten"
33
- n.icon_path = "/path/to/icon"
34
- n.append = false
35
- n.transient = true
36
- end
37
-
38
- assert_equal "hello", libnotify.summary
39
- assert_equal "overwritten", libnotify.body
40
- assert_equal "/path/to/icon", libnotify.icon_path
41
- refute libnotify.append
42
- assert libnotify.transient
43
- end
44
-
45
- test "timeout=" do
46
- assert_timeout 2500, 2.5, "with float"
47
- assert_timeout 100, 100, "with fixnum ms"
48
- assert_timeout 101, 101, "with fixnum ms"
49
- assert_timeout 1000, 1, "with fixnum seconds"
50
- assert_timeout 99000, 99, "with fixnum seconds"
51
- assert_timeout nil, nil, "with nil"
52
- assert_timeout nil, false, "with false"
53
- assert_timeout 2, :"2 s", "with to_s.to_i"
54
- end
55
-
56
- test "icon_path=" do
57
- Libnotify::API.icon_dirs << File.expand_path("../..", __FILE__)
58
- assert_icon_path "/some/path/image.jpg", "/some/path/image.jpg", "with absolute path"
59
- assert_icon_path "some-invalid-path.jpg", "some-invalid-path.jpg", "with non-existant relative path"
60
- assert_icon_path %r{^/.*/libnotify.png}, "libnotify.png", "with relative path"
61
- assert_icon_path %r{^/.*/libnotify.png}, :"libnotify", "with symbol"
62
- end
63
-
64
- test "update" do
65
- libnotify(:summary => "hello", :body => "world").show!
66
- libnotify.update(:summary => "hell") do |n|
67
- n.body = "yeah"
68
- end
69
- assert_equal "hell", libnotify.summary
70
- assert_equal "yeah", libnotify.body
71
- libnotify.close
72
- end
73
- end
74
-
75
- context "integration" do
76
- test "works" do
77
- libnotify = Libnotify::API.new(:timeout => 0.5, :icon_path => :"emblem-favorite", :append => true)
78
-
79
- [ :low, :normal, :critical ].each do |urgency|
80
- libnotify.summary = "#{RUBY_VERSION} at #{RUBY_PLATFORM}"
81
- libnotify.body = [ urgency, defined?(RUBY_DESCRIPTION) ? RUBY_DESCRIPTION : '?' ].join(" ")
82
- libnotify.urgency = urgency
83
- libnotify.show!
84
- end
85
- end
86
- end
87
- end