nickludlam-ruby-mythtv 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -0
- data/Rakefile +27 -18
- data/Todo.txt +7 -6
- metadata +27 -20
- data/lib/ruby-mythtv.rb +0 -52
- data/test/test_backend.rb +0 -63
- data/test/test_db.rb +0 -134
- data/test/test_helper.rb +0 -3
data/History.txt
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
== 0.3.0 (2009-02-18)
|
2
|
+
|
3
|
+
* Replaced old database code with one based on ActiveRecord, which is now a dependency
|
4
|
+
* Changed test code
|
5
|
+
|
1
6
|
== 0.2.0 (2008-09-29)
|
2
7
|
|
3
8
|
* Bumped to version 0.2 as we now support proper editing of recording schedules, and speaking multiple versions of the database schema
|
data/Rakefile
CHANGED
@@ -1,32 +1,37 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
Gem::manage_gems
|
3
2
|
require 'rake/gempackagetask'
|
4
3
|
require 'rake/testtask'
|
5
4
|
|
6
5
|
spec = Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version =
|
6
|
+
s.name = 'ruby-mythtv'
|
7
|
+
s.version = '0.3.0'
|
9
8
|
|
10
9
|
s.specification_version = 2 if s.respond_to? :specification_version=
|
11
10
|
|
12
|
-
s.required_rubygems_version = Gem::Requirement.new(
|
13
|
-
s.
|
14
|
-
s.
|
15
|
-
s.
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
|
12
|
+
s.date = %q{2009-02-18}
|
13
|
+
s.description = %q{Ruby implementation of the MythTV communication protocol, and interface to the MythTV database}
|
14
|
+
s.authors = [ 'Nick Ludlam' ]
|
16
15
|
s.email = %q{nick@recoil.org}
|
17
|
-
s.extra_rdoc_files = [
|
18
|
-
s.files = [
|
16
|
+
s.extra_rdoc_files = [ 'History.txt', 'License.txt', 'README.txt', 'Todo.txt' ]
|
17
|
+
s.files = [ 'History.txt', 'License.txt', 'README.txt', 'Rakefile', 'Todo.txt' ] + Dir["lib/*.rb"] + Dir["lib/mythtv/*.rb"] + Dir["test/*.rb"]
|
19
18
|
s.has_rdoc = true
|
20
19
|
s.homepage = %q{http://github.com/nickludlam/ruby-mythtv/}
|
21
|
-
s.rdoc_options = [
|
22
|
-
s.require_paths = [
|
20
|
+
s.rdoc_options = ['--main', 'README.txt']
|
21
|
+
s.require_paths = ['lib']
|
23
22
|
s.rubyforge_project = %q{ruby-mythtv}
|
24
|
-
s.rubygems_version = %q{0.
|
23
|
+
s.rubygems_version = %q{0.3.0}
|
24
|
+
|
25
|
+
s.add_dependency('mysql')
|
26
|
+
s.add_dependency('activerecord')
|
27
|
+
s.add_dependency('composite_primary_keys')
|
28
|
+
|
25
29
|
s.summary = %q{Ruby implementation of the MythTV backend protocol}
|
26
|
-
s.test_files = ["test
|
30
|
+
s.test_files = Dir["test/*.rb"]
|
27
31
|
end
|
28
32
|
|
29
33
|
Rake::GemPackageTask.new(spec) do |pkg|
|
34
|
+
pkg.need_zip = true
|
30
35
|
pkg.need_tar = true
|
31
36
|
end
|
32
37
|
|
@@ -35,18 +40,22 @@ task :build => "pkg/#{spec.name}-#{spec.version}.gem" do
|
|
35
40
|
end
|
36
41
|
|
37
42
|
desc "Run basic unit tests"
|
38
|
-
Rake::TestTask.new("
|
43
|
+
Rake::TestTask.new("test") do |t|
|
39
44
|
t.pattern = ENV["TESTFILES"] || ['test/test_backend.rb', 'test/test_db.rb']
|
40
45
|
t.verbose = true
|
41
46
|
t.warning = true
|
42
47
|
end
|
43
48
|
|
44
|
-
|
45
|
-
|
46
|
-
Rake::TestTask.new('test_db') do |t|
|
49
|
+
Rake::TestTask.new('test:db') do |t|
|
47
50
|
t.pattern = ['test/test_db.rb']
|
48
51
|
t.verbose = true
|
49
52
|
end
|
53
|
+
|
54
|
+
Rake::TestTask.new('test:backend') do |t|
|
55
|
+
t.pattern = ['test/test_backend.rb']
|
56
|
+
t.verbose = true
|
57
|
+
end
|
58
|
+
|
50
59
|
|
51
60
|
desc "Run unit tests as default"
|
52
|
-
task :default => :
|
61
|
+
task :default => :test
|
data/Todo.txt
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
== Todo
|
2
|
+
|
3
|
+
* Implement the Recorder class, and associated functions (see existing MythTV Python module)
|
4
|
+
* Look at how we obtain the channel icon by streaming a backend file (see existing MythTV Perl module)
|
5
|
+
* Support Ruby 1.9
|
6
|
+
* Support seeking with the MythTV::Backend#stream() method
|
7
|
+
* Make use of the ENUMS placed in RecordingSchedule to help with validation of various columns
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nickludlam-ruby-mythtv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Ludlam
|
@@ -9,11 +9,12 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-02-18 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: mysql
|
17
|
+
type: :runtime
|
17
18
|
version_requirement:
|
18
19
|
version_requirements: !ruby/object:Gem::Requirement
|
19
20
|
requirements:
|
@@ -21,7 +22,27 @@ dependencies:
|
|
21
22
|
- !ruby/object:Gem::Version
|
22
23
|
version: "0"
|
23
24
|
version:
|
24
|
-
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: activerecord
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: composite_primary_keys
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
description: Ruby implementation of the MythTV communication protocol, and interface to the MythTV database
|
25
46
|
email: nick@recoil.org
|
26
47
|
executables: []
|
27
48
|
|
@@ -31,24 +52,12 @@ extra_rdoc_files:
|
|
31
52
|
- History.txt
|
32
53
|
- License.txt
|
33
54
|
- README.txt
|
55
|
+
- Todo.txt
|
34
56
|
files:
|
35
57
|
- History.txt
|
36
58
|
- License.txt
|
37
59
|
- README.txt
|
38
60
|
- Rakefile
|
39
|
-
- lib/ruby-mythtv.rb
|
40
|
-
- mythtv/backend.rb
|
41
|
-
- mythtv/channel.rb
|
42
|
-
- mythtv/database.rb
|
43
|
-
- mythtv/program.rb
|
44
|
-
- mythtv/protocol.rb
|
45
|
-
- mythtv/recording.rb
|
46
|
-
- mythtv/recording_schedule.rb
|
47
|
-
- mythtv/utils.rb
|
48
|
-
- test/test_backend.rb
|
49
|
-
- test/test_db.rb
|
50
|
-
- test/test_helper.rb
|
51
|
-
- test_stream.rb
|
52
61
|
- Todo.txt
|
53
62
|
has_rdoc: true
|
54
63
|
homepage: http://github.com/nickludlam/ruby-mythtv/
|
@@ -77,7 +86,5 @@ rubygems_version: 1.2.0
|
|
77
86
|
signing_key:
|
78
87
|
specification_version: 2
|
79
88
|
summary: Ruby implementation of the MythTV backend protocol
|
80
|
-
test_files:
|
81
|
-
|
82
|
-
- test/test_backend.rb
|
83
|
-
- test/test_db.rb
|
89
|
+
test_files: []
|
90
|
+
|
data/lib/ruby-mythtv.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
# The MIT License
|
2
|
-
#
|
3
|
-
# Copyright (c) 2008 Nick Ludlam
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
22
|
-
|
23
|
-
module MythTV
|
24
|
-
VERSION = '0.2.0'
|
25
|
-
|
26
|
-
def self.connect(options)
|
27
|
-
backend = connect_backend(options)
|
28
|
-
database = connect_database(options)
|
29
|
-
|
30
|
-
[backend, database]
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.connect_backend(options)
|
34
|
-
Backend.new(options)
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.connect_database(options)
|
38
|
-
Database.new(options)
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
$:.unshift(File.dirname(__FILE__))
|
44
|
-
|
45
|
-
require 'mythtv/channel.rb'
|
46
|
-
require 'mythtv/program.rb'
|
47
|
-
require 'mythtv/protocol.rb'
|
48
|
-
require 'mythtv/recording.rb'
|
49
|
-
require 'mythtv/recording_schedule.rb'
|
50
|
-
require 'mythtv/utils.rb'
|
51
|
-
require 'mythtv/database.rb'
|
52
|
-
require 'mythtv/backend.rb'
|
data/test/test_backend.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
-
|
3
|
-
class TestBackend < Test::Unit::TestCase
|
4
|
-
def setup
|
5
|
-
abort("\n\tERROR: You must set the environment variable MYTHTV_BACKEND to the name of your MythTV backend server\n\n") unless ENV['MYTHTV_BACKEND']
|
6
|
-
@backend = MythTV.connect_backend(:host => ENV['MYTHTV_BACKEND'])
|
7
|
-
end
|
8
|
-
|
9
|
-
def teardown
|
10
|
-
@backend.close
|
11
|
-
end
|
12
|
-
|
13
|
-
# Assuming the system is up for more than 0 seconds!
|
14
|
-
def test_connection
|
15
|
-
uptime = @backend.query_uptime
|
16
|
-
assert uptime > 0
|
17
|
-
end
|
18
|
-
|
19
|
-
# Assuming there is at least one recording on the test server
|
20
|
-
def test_get_recordings
|
21
|
-
recordings = @backend.query_recordings
|
22
|
-
assert recordings.length > 0
|
23
|
-
assert_kind_of MythTV::Recording, recordings[0]
|
24
|
-
end
|
25
|
-
|
26
|
-
# Assuming there is at least one scheduled recording on the test server
|
27
|
-
def test_get_scheduled
|
28
|
-
scheduled = @backend.query_scheduled
|
29
|
-
assert scheduled.length > 0
|
30
|
-
assert_kind_of MythTV::Recording, scheduled[0]
|
31
|
-
end
|
32
|
-
|
33
|
-
# Test the generation of a preview image
|
34
|
-
def test_make_preview_image
|
35
|
-
recordings = @backend.query_recordings
|
36
|
-
|
37
|
-
recording = recordings[0]
|
38
|
-
test_image = @backend.preview_image(recording, :secs_in => 1)
|
39
|
-
assert test_image.length > 0
|
40
|
-
|
41
|
-
# Define an array of the decimal values of the PNG magic number
|
42
|
-
png_sig = [137, 80, 78, 71, 13, 10, 26, 10]
|
43
|
-
test_image_sig = (0..7).collect { |i| test_image[i] }
|
44
|
-
|
45
|
-
assert_equal test_image_sig, png_sig
|
46
|
-
end
|
47
|
-
|
48
|
-
# def test_process_guide_xml
|
49
|
-
# guide_data = @backend.get_program_guide
|
50
|
-
#
|
51
|
-
# channels = MythTV::Backend.process_guide_xml(guide_data)
|
52
|
-
# end
|
53
|
-
|
54
|
-
# Don't run this by default as it takes a while. Possibly limit to 100kB?
|
55
|
-
#def test_download
|
56
|
-
# recordings = @backend.query_recordings
|
57
|
-
#
|
58
|
-
# recording = recordings[-2]
|
59
|
-
# @backend.download(recording)
|
60
|
-
#end
|
61
|
-
|
62
|
-
|
63
|
-
end
|
data/test/test_db.rb
DELETED
@@ -1,134 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
-
|
3
|
-
class TestDatabase < Test::Unit::TestCase
|
4
|
-
def setup
|
5
|
-
abort("\n\tmyERROR: You must set the environment variable MYTHTV_DB to the name of your MythTV database server\n\n") unless ENV['MYTHTV_DB']
|
6
|
-
abort("\n\tmyERROR: You must set the environment variable MYTHTV_PW to the name of your MythTV database server\n\n") unless ENV['MYTHTV_PW']
|
7
|
-
@db = MythTV.connect_database(:host => ENV['MYTHTV_DB'],
|
8
|
-
:database_password => ENV['MYTHTV_PW'],
|
9
|
-
:log_level => Logger::DEBUG)
|
10
|
-
end
|
11
|
-
|
12
|
-
def teardown
|
13
|
-
@db.close
|
14
|
-
end
|
15
|
-
|
16
|
-
# Check the DBSchemaVer key in the settings table as our first check
|
17
|
-
# It should always be present
|
18
|
-
def test_get_setting
|
19
|
-
schema_version = @db.get_setting('DBSchemaVer')
|
20
|
-
assert schema_version.to_i > 0
|
21
|
-
end
|
22
|
-
|
23
|
-
# Check the DBSchemaVer, once queried, is in the setting cache
|
24
|
-
def test_get_setting_cache
|
25
|
-
schema_version = @db.get_setting('DBSchemaVer')
|
26
|
-
assert @db.setting_cache['DBSchemaVer_'].to_i > 0
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_list_channels
|
30
|
-
channels = @db.list_channels
|
31
|
-
|
32
|
-
assert_kind_of Array, channels
|
33
|
-
assert channels.length > 0
|
34
|
-
assert_kind_of MythTV::Channel, channels[0]
|
35
|
-
assert channels[0].chanid > 0
|
36
|
-
end
|
37
|
-
|
38
|
-
# Test we can pull back a single channel when
|
39
|
-
# specifying a :chanid
|
40
|
-
def test_list_single_chanid
|
41
|
-
first_channel_list = @db.list_channels
|
42
|
-
wanted_chanid = first_channel_list[0].chanid
|
43
|
-
|
44
|
-
second_channel_list = @db.list_channels(:chanid => wanted_chanid)
|
45
|
-
assert_equal 1, second_channel_list.length
|
46
|
-
|
47
|
-
channel = second_channel_list[0]
|
48
|
-
assert_kind_of MythTV::Channel, channel
|
49
|
-
assert_equal channel.chanid, wanted_chanid
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_list_multiple_chanids
|
53
|
-
first_channel_list = @db.list_channels
|
54
|
-
first_five = first_channel_list.slice(0..4)
|
55
|
-
wanted_chanids = first_five.map { |x| x.chanid }
|
56
|
-
|
57
|
-
second_channel_list = @db.list_channels(:chanid => wanted_chanids)
|
58
|
-
assert_equal 5, second_channel_list.length
|
59
|
-
second_channel_list
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_list_programs
|
63
|
-
programs = @db.list_programs(:limit => 10)
|
64
|
-
|
65
|
-
assert_equal 10, programs.length
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_list_programs_with_search
|
69
|
-
programs = @db.list_programs(:conditions => ['title LIKE ?', "%"],
|
70
|
-
:limit => 5)
|
71
|
-
assert programs.length > 0
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_list_programs_with_starttime_range
|
75
|
-
# Programs in the next two hours
|
76
|
-
programs = @db.list_programs(:conditions => ['starttime BETWEEN ? AND ?', Time.now, Time.now + 7200],
|
77
|
-
:limit => 1)
|
78
|
-
|
79
|
-
assert_equal 1, programs.length
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_program_links_to_channel
|
83
|
-
programs = @db.list_programs(:conditions => ['title LIKE ?', "%"], :limit => 1)
|
84
|
-
program_channel = programs[0].channel
|
85
|
-
assert_kind_of MythTV::Channel, program_channel
|
86
|
-
end
|
87
|
-
|
88
|
-
def test_new_schedule
|
89
|
-
# Get list of schedules for later reference
|
90
|
-
num_schedules = @db.list_recording_schedules
|
91
|
-
programs = @db.list_programs(:conditions => ['starttime BETWEEN ? AND ?', Time.now + 3600, Time.now + 7200],
|
92
|
-
:limit => 1)
|
93
|
-
|
94
|
-
# Convert our first program selected into a recording schedule
|
95
|
-
new_schedule = MythTV::RecordingSchedule.new(programs[0], @db)
|
96
|
-
new_schedule.save
|
97
|
-
|
98
|
-
# Get new list
|
99
|
-
new_num_schedules = @db.list_recording_schedules
|
100
|
-
# Assert that we now have one more schedule
|
101
|
-
assert_equal num_schedules.length + 1, new_num_schedules.length
|
102
|
-
|
103
|
-
assert new_schedule.recordid > 0
|
104
|
-
|
105
|
-
destroy_result = new_schedule.destroy()
|
106
|
-
assert destroy_result
|
107
|
-
end
|
108
|
-
|
109
|
-
def test_new_and_modify_schedule
|
110
|
-
# Get list of schedules for later reference
|
111
|
-
num_schedules = @db.list_recording_schedules
|
112
|
-
programs = @db.list_programs(:conditions => ['starttime BETWEEN ? AND ?', Time.now + 3600, Time.now + 7200],
|
113
|
-
:limit => 1)
|
114
|
-
|
115
|
-
# Convert our first program selected into a recording schedule
|
116
|
-
new_schedule = MythTV::RecordingSchedule.new(programs[0], @db)
|
117
|
-
new_schedule.save
|
118
|
-
|
119
|
-
new_schedule.type = 4
|
120
|
-
new_schedule.save
|
121
|
-
|
122
|
-
test_query = @db.list_recording_schedules(:conditions => ['recordid = ?', new_schedule.recordid])
|
123
|
-
assert_equal 1, test_query.length
|
124
|
-
|
125
|
-
test_retrieval = test_query[0]
|
126
|
-
|
127
|
-
assert_equal 4, test_retrieval.type
|
128
|
-
|
129
|
-
destroy_result = new_schedule.destroy()
|
130
|
-
assert destroy_result
|
131
|
-
end
|
132
|
-
|
133
|
-
end
|
134
|
-
|
data/test/test_helper.rb
DELETED