diff --git a/lib/desktop.rb b/lib/desktop.rb index fa0af10..427b3a6 100644 --- a/lib/desktop.rb +++ b/lib/desktop.rb @@ -1,5 +1,6 @@ require 'desktop/cli' require 'desktop/local_image' -require 'desktop/osx' require 'desktop/version' require 'desktop/web_image' + +require 'desktop/osx/osx' diff --git a/lib/desktop/osx/database.rb b/lib/desktop/osx/database.rb new file mode 100644 index 0000000..80fdf54 --- /dev/null +++ b/lib/desktop/osx/database.rb @@ -0,0 +1,42 @@ +require 'sqlite3' + +module Desktop + class OSX + class Database + attr_reader :connection + + def initialize(connection = nil) + @connection = connection || default_connection + end + + def clear_desktop_image + clear_data if data? + end + + def close + connection.close + end + + private + + def data? + connection.execute( + "SELECT name FROM sqlite_master WHERE type='table' AND name='data'" + ).any? + end + + def clear_data + connection.execute 'DELETE FROM data' + connection.execute 'VACUUM data' + end + + def default_connection + SQLite3::Database.new path + end + + def path + File.expand_path '~/Library/Application Support/Dock/desktoppicture.db' + end + end + end +end diff --git a/lib/desktop/osx.rb b/lib/desktop/osx/osx.rb similarity index 86% rename from lib/desktop/osx.rb rename to lib/desktop/osx/osx.rb index b9598ba..cd4116a 100644 --- a/lib/desktop/osx.rb +++ b/lib/desktop/osx/osx.rb @@ -1,4 +1,4 @@ -require 'sqlite3' +require 'desktop/osx/database' module Desktop class OSX @@ -58,9 +58,8 @@ def write_default_desktop(image) end def clear_custom_desktop_image - db = SQLite3::Database.new(desktop_image_db_path) - db.execute 'DELETE FROM data' - db.execute 'VACUUM data' + db = Database.new + db.clear_desktop_image db.close end @@ -71,9 +70,5 @@ def reload_desktop def default_desktop_image_path '/System/Library/CoreServices/DefaultDesktop.jpg' end - - def desktop_image_db_path - File.expand_path '~/Library/Application Support/Dock/desktoppicture.db' - end end end diff --git a/test/desktop/osx/database_test.rb b/test/desktop/osx/database_test.rb new file mode 100644 index 0000000..ec5d475 --- /dev/null +++ b/test/desktop/osx/database_test.rb @@ -0,0 +1,38 @@ +require 'test_helper' +require 'desktop/osx/database' + +module Desktop + describe OSX::Database do + def with_connection + connection = SQLite3::Database.new ':memory:' + yield connection + ensure + connection.close + end + + describe '#clear_desktop_image' do + it 'clears contents of data table' do + with_connection do |connection| + connection.execute("CREATE TABLE data (FileName STRING)") + connection.execute("INSERT INTO data VALUES ('mydesktop.png')") + + refute_empty connection.execute("SELECT * FROM data") + + OSX::Database.new(connection).clear_desktop_image + + assert_empty connection.execute("SELECT * FROM data") + end + end + + it 'does not blow up if data table does not exist' do + with_connection do |connection| + assert_empty connection.execute( + "SELECT name FROM sqlite_master WHERE type='table' AND name='data'" + ) + + OSX::Database.new(connection).clear_desktop_image + end + end + end + end +end diff --git a/test/desktop/osx_test.rb b/test/desktop/osx/osx_test.rb similarity index 97% rename from test/desktop/osx_test.rb rename to test/desktop/osx/osx_test.rb index afe9a79..ff069c1 100644 --- a/test/desktop/osx_test.rb +++ b/test/desktop/osx/osx_test.rb @@ -1,5 +1,5 @@ require 'test_helper' -require 'desktop/osx' +require 'desktop/osx/osx' require 'desktop/local_image' module Desktop