libnotify 0.8.0 → 0.8.1

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.
@@ -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