rivendell-db 0.0.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,50 @@
1
+ require "rivendell/db/version"
2
+
3
+ require 'dm-core'
4
+ require 'dm-mysql-adapter'
5
+ require 'dm-serializer'
6
+ require 'dm-types'
7
+ require 'dm-validations'
8
+
9
+ module Rivendell
10
+ # DataMapper::Logger.new(STDOUT, :debug)
11
+ # DataMapper::Model.raise_on_save_failure = true
12
+
13
+ module DB
14
+
15
+ def self.mysql_conf
16
+ @mysql_conf ||= IniFile.load("/etc/rd.conf")['mySQL'] if File.exists?("/etc/rc.conf")
17
+ end
18
+
19
+ def self.default_url
20
+ if mysql_conf
21
+ # If we can, pull the config from Rivendell's own configuration.
22
+ "mysql://#{mysql_conf['Loginname']}:#{mysql_conf['Password']}@#{mysql_conf['Hostname']}/#{mysql_conf['Database']}"
23
+ else
24
+ 'mysql://rduser:letmein@localhost/Rivendell'
25
+ end
26
+ end
27
+
28
+ def self.establish_connection(url = default_url)
29
+ # Rivendell's default for most setups
30
+ DataMapper.setup :default, url
31
+
32
+ DataMapper.repository(:default).adapter.field_naming_convention =
33
+ DataMapper::NamingConventions::Field::Underscored
34
+
35
+ true
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+ # require 'rivendell/log_item'
42
+ # require 'rivendell/log'
43
+ require 'rivendell/db/cut'
44
+ require 'rivendell/db/cart'
45
+ require 'rivendell/db/dropbox'
46
+ require 'rivendell/db/group'
47
+ # require 'rivendell/task'
48
+ # require 'rivendell/tools'
49
+
50
+ DataMapper.finalize
@@ -0,0 +1,34 @@
1
+ class Rivendell::DB::Cart
2
+ include DataMapper::Resource
3
+ storage_names[:default] = 'CART'
4
+
5
+ property :number, Integer, :key => true
6
+ property :type, Integer, :default => 1, :required => true
7
+ property :group_name, String, :length => 10, :required => true
8
+ property :title, String, :required => true
9
+ property :artist, String
10
+ property :album, String
11
+ property :year, Date
12
+
13
+ property :average_length, Integer
14
+
15
+ belongs_to :group, :child_key => [ :group_name ], :parent_key => [ :name ]
16
+ has n, :cuts, :child_key => [ :cart_number ], :parent_key => [ :number ]
17
+
18
+ before :valid?, :use_free_number
19
+
20
+ def use_free_number(context = :default)
21
+ self.number = group.free_cart_number if group
22
+ end
23
+
24
+ def self.duplicated(*fields)
25
+ sql_fields = fields.join(", ")
26
+ query = "select GROUP_CONCAT(NUMBER) as numbers, #{sql_fields} from CART group by #{sql_fields} having count(NUMBER) > 1;"
27
+
28
+ repository(:default).adapter.select(query).map do |duplicated_group|
29
+ field_values = fields.inject({}) { |map, field| map[field] = duplicated_group.send(field); map }
30
+ numbers = duplicated_group.numbers.split(",").map(&:to_i)
31
+ { :numbers => numbers, :fields => field_values }
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,9 @@
1
+ class Rivendell::DB::Cut
2
+ include DataMapper::Resource
3
+ storage_names[:default] = 'CUTS'
4
+
5
+ property :cut_name, String, :key => true
6
+ property :last_play_datetime, Time
7
+
8
+ belongs_to :cart, :child_key => [ :cart_number ], :parent_key => [ :number ]
9
+ end
@@ -0,0 +1,37 @@
1
+ class Rivendell::DB::Dropbox
2
+ include DataMapper::Resource
3
+ storage_names[:default] = 'DROPBOXES'
4
+
5
+ property :id, Serial, :key => true
6
+ property :station_name, String, :length => 64, :required => true
7
+ property :group_name, String, :length => 10, :required => true
8
+ property :path, String, :length => 255, :required => true
9
+ property :log_path, String, :length => 255
10
+
11
+ property :normalization_level, Integer, :default => -1300
12
+ property :autotrim_level, Integer, :default => -3000
13
+
14
+ property :single_cart, Enum['N','Y'], :default => 'N'
15
+ property :to_cart, Integer
16
+ property :use_cartchunk_id, Enum['N','Y'], :default => 'N'
17
+ property :title_from_cartchunk_id, Enum['N','Y'], :default => 'N'
18
+
19
+ property :delete_cuts, Enum['N','Y'], :default => 'N'
20
+ property :delete_source, Enum['N','Y'], :default => 'Y'
21
+
22
+ property :metadata_pattern, String, :length => 64
23
+
24
+ property :startdate_offset, Integer, :default => 0
25
+ property :enddate_offset, Integer, :default => 0
26
+
27
+ property :fix_broken_formats, Enum['N','Y'], :default => 'N'
28
+
29
+ property :import_create_dates, Enum['N','Y'], :default => 'N'
30
+ property :create_startdate_offset, Integer, :default => 0
31
+ property :create_enddate_offset, Integer, :default => 0
32
+
33
+ belongs_to :group, :child_key => [ :group_name ], :parent_key => [ :name ]
34
+
35
+ belongs_to :cart, :child_key => [ :to_cart ], :parent_key => [ :number ]
36
+
37
+ end
@@ -0,0 +1,45 @@
1
+ class Rivendell::DB::Group
2
+ include DataMapper::Resource
3
+ storage_names[:default] = 'GROUPS'
4
+
5
+ property :name, String, :key => true
6
+ property :description, String, :length => 255
7
+ property :default_cart_type, Integer, :default => 1, :required => true
8
+ property :default_title, String, :default => "Imported from %f.%e"
9
+
10
+ property :default_low_cart, Integer, :default => 0
11
+ property :default_high_cart, Integer, :default => 0
12
+ property :enforce_cart_range, Enum['N','Y'], :default => 'N'
13
+
14
+ property :cut_shelflife, Integer, :default => -1
15
+
16
+ property :report_tfc, Enum['N','Y'], :default => 'Y'
17
+ property :report_mus, Enum['N','Y'], :default => 'Y'
18
+
19
+ property :enable_now_next, Enum['N','Y'], :default => 'N'
20
+
21
+ property :color, String, :length => 7
22
+
23
+ has n, :carts, :child_key => [ :group_name ], :parent_key => [ :name ]
24
+
25
+ def default_cart_range
26
+ default_low_cart..default_high_cart
27
+ end
28
+
29
+ def default_cart_range=(range)
30
+ self.default_low_cart = range.begin
31
+ self.default_high_cart = range.end
32
+ end
33
+
34
+ def cart_numbers
35
+ carts.all(:fields => [:number], :order => [ :number ]).map(&:number)
36
+ end
37
+
38
+ def free_cart_number
39
+ # FIXME
40
+ ((default_cart_range).to_a - cart_numbers).first
41
+ end
42
+
43
+ has n, :dropboxes, :child_key => [ :group_name ], :parent_key => [ :name ]
44
+
45
+ end
@@ -0,0 +1,5 @@
1
+ module Rivendell
2
+ module DB
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rivendell/db/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "rivendell-db"
8
+ gem.version = Rivendell::DB::VERSION
9
+ gem.authors = ["Alban Peignier", "Florent Peyraud"]
10
+ gem.email = ["alban@tryphon.eu", "florent@tryphon.eu"]
11
+ gem.description = %q{Rivendell database mapping}
12
+ gem.summary = %q{Access to Rivendell database}
13
+ gem.homepage = "http://projects.tryphon.eu/projects/rivendell-db"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_runtime_dependency 'dm-core'
21
+ gem.add_runtime_dependency 'dm-mysql-adapter'
22
+ gem.add_runtime_dependency 'dm-serializer'
23
+ gem.add_runtime_dependency 'dm-types'
24
+ gem.add_runtime_dependency 'dm-validations'
25
+
26
+ gem.add_development_dependency "simplecov"
27
+ gem.add_development_dependency "rspec"
28
+ gem.add_development_dependency "guard"
29
+ gem.add_development_dependency "guard-rspec"
30
+ gem.add_development_dependency "rake"
31
+ gem.add_development_dependency "dm-transactions"
32
+ gem.add_development_dependency "rdoc"
33
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rivendell::DB::Cart do
4
+
5
+ let(:group) { Rivendell::DB::Group.create :name => "Dummy", :default_cart_range => 1..10 }
6
+
7
+ describe ".duplicated!" do
8
+
9
+ it "should return Carts " do
10
+ original = group.carts.create :title => "Example 1", :artist => "First Artist"
11
+ group.carts.create :title => "Example 2", :artist => "First Artist"
12
+ group.carts.create :title => "Example 1", :artist => "Second Artist"
13
+ duplicate = group.carts.create :title => "Example 1", :artist => "First Artist"
14
+
15
+ Rivendell::DB::Cart.duplicated(:title, :artist).should == [{
16
+ :numbers => [original, duplicate].map(&:number),
17
+ :fields => { :title => original.title, :artist => original.artist }
18
+ }]
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rivendell::DB::Group do
4
+
5
+ describe "#free_cart_number" do
6
+
7
+ it "should return the first unused cart number" do
8
+ group = Rivendell::DB::Group.create :name => "Dummy", :default_cart_range => 1..3
9
+ group.carts.create :title => "Dummy", :number => 1
10
+ group.free_cart_number.should == 2
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,16 @@
1
+ require 'rubygems'
2
+
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+
11
+ require 'simplecov'
12
+ SimpleCov.start
13
+
14
+ require 'rivendell/db'
15
+
16
+ Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f}
@@ -0,0 +1,18 @@
1
+ require 'dm-transactions'
2
+
3
+ # TODO make test DB configurable (Rakefile uses same parameters)
4
+ Rivendell::DB.establish_connection 'mysql://rduser:letmein@localhost/rivendell_test'
5
+
6
+ RSpec.configure do |config|
7
+ config.before(:each) do
8
+ repository(:default) do
9
+ transaction = DataMapper::Transaction.new(repository)
10
+ transaction.begin
11
+ repository.adapter.push_transaction(transaction)
12
+ end
13
+ end
14
+
15
+ config.after(:each) do
16
+ repository(:default).adapter.pop_transaction.rollback
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ namespace :db do
2
+
3
+ def mysql_execute(database, command)
4
+ system "echo \"#{command}\" | sudo -H mysql #{database}"
5
+ end
6
+
7
+ def mysql_load(database, file)
8
+ system "sudo -H mysql #{database} < #{file}"
9
+ end
10
+
11
+ def mysql_admin(*args)
12
+ system "sudo -H mysqladmin #{args.join(' ')}"
13
+ end
14
+
15
+ namespace :test do
16
+ task :prepare => 'db:test:load'
17
+
18
+ task :load => 'db:test:purge' do
19
+ mysql_admin :create, 'rivendell_test'
20
+ mysql_load 'rivendell_test', 'db/schema.sql'
21
+ mysql_execute :mysql, "GRANT ALL PRIVILEGES ON rivendell_test.* TO 'rduser'@'localhost' IDENTIFIED BY 'letmein';"
22
+ puts 'Database "rivendell_test" created'
23
+ end
24
+
25
+ task :purge do
26
+ mysql_admin :drop, '--force rivendell_test'
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ begin
2
+ require 'rdoc/task'
3
+ rescue LoadError
4
+ require 'rdoc/rdoc'
5
+ require 'rake/rdoctask'
6
+ RDoc::Task = Rake::RDocTask
7
+ end
8
+
9
+ Rake::RDocTask.new do |rdoc|
10
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
11
+
12
+ rdoc.rdoc_dir = 'rdoc'
13
+ rdoc.title = "rivendellrb #{version}"
14
+ rdoc.rdoc_files.include('README*')
15
+ rdoc.rdoc_files.include('lib/**/*.rb')
16
+ end
@@ -0,0 +1,2 @@
1
+ require 'rspec/core/rake_task'
2
+ RSpec::Core::RakeTask.new('spec')
metadata ADDED
@@ -0,0 +1,259 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rivendell-db
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Alban Peignier
14
+ - Florent Peyraud
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2013-03-16 00:00:00 Z
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ prerelease: false
23
+ version_requirements: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ requirement: *id001
33
+ type: :runtime
34
+ name: dm-core
35
+ - !ruby/object:Gem::Dependency
36
+ prerelease: false
37
+ version_requirements: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ requirement: *id002
47
+ type: :runtime
48
+ name: dm-mysql-adapter
49
+ - !ruby/object:Gem::Dependency
50
+ prerelease: false
51
+ version_requirements: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ requirement: *id003
61
+ type: :runtime
62
+ name: dm-serializer
63
+ - !ruby/object:Gem::Dependency
64
+ prerelease: false
65
+ version_requirements: &id004 !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ requirement: *id004
75
+ type: :runtime
76
+ name: dm-types
77
+ - !ruby/object:Gem::Dependency
78
+ prerelease: false
79
+ version_requirements: &id005 !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ requirement: *id005
89
+ type: :runtime
90
+ name: dm-validations
91
+ - !ruby/object:Gem::Dependency
92
+ prerelease: false
93
+ version_requirements: &id006 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ hash: 3
99
+ segments:
100
+ - 0
101
+ version: "0"
102
+ requirement: *id006
103
+ type: :development
104
+ name: simplecov
105
+ - !ruby/object:Gem::Dependency
106
+ prerelease: false
107
+ version_requirements: &id007 !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ hash: 3
113
+ segments:
114
+ - 0
115
+ version: "0"
116
+ requirement: *id007
117
+ type: :development
118
+ name: rspec
119
+ - !ruby/object:Gem::Dependency
120
+ prerelease: false
121
+ version_requirements: &id008 !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ hash: 3
127
+ segments:
128
+ - 0
129
+ version: "0"
130
+ requirement: *id008
131
+ type: :development
132
+ name: guard
133
+ - !ruby/object:Gem::Dependency
134
+ prerelease: false
135
+ version_requirements: &id009 !ruby/object:Gem::Requirement
136
+ none: false
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ hash: 3
141
+ segments:
142
+ - 0
143
+ version: "0"
144
+ requirement: *id009
145
+ type: :development
146
+ name: guard-rspec
147
+ - !ruby/object:Gem::Dependency
148
+ prerelease: false
149
+ version_requirements: &id010 !ruby/object:Gem::Requirement
150
+ none: false
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ hash: 3
155
+ segments:
156
+ - 0
157
+ version: "0"
158
+ requirement: *id010
159
+ type: :development
160
+ name: rake
161
+ - !ruby/object:Gem::Dependency
162
+ prerelease: false
163
+ version_requirements: &id011 !ruby/object:Gem::Requirement
164
+ none: false
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ hash: 3
169
+ segments:
170
+ - 0
171
+ version: "0"
172
+ requirement: *id011
173
+ type: :development
174
+ name: dm-transactions
175
+ - !ruby/object:Gem::Dependency
176
+ prerelease: false
177
+ version_requirements: &id012 !ruby/object:Gem::Requirement
178
+ none: false
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ hash: 3
183
+ segments:
184
+ - 0
185
+ version: "0"
186
+ requirement: *id012
187
+ type: :development
188
+ name: rdoc
189
+ description: Rivendell database mapping
190
+ email:
191
+ - alban@tryphon.eu
192
+ - florent@tryphon.eu
193
+ executables: []
194
+
195
+ extensions: []
196
+
197
+ extra_rdoc_files: []
198
+
199
+ files:
200
+ - .gitignore
201
+ - COPYING
202
+ - COPYRIGHT
203
+ - Gemfile
204
+ - Guardfile
205
+ - README.md
206
+ - Rakefile
207
+ - db/schema.sql
208
+ - lib/rivendell/db.rb
209
+ - lib/rivendell/db/cart.rb
210
+ - lib/rivendell/db/cut.rb
211
+ - lib/rivendell/db/dropbox.rb
212
+ - lib/rivendell/db/group.rb
213
+ - lib/rivendell/db/version.rb
214
+ - rivendell-db.gemspec
215
+ - spec/rivendell/db/cart_spec.rb
216
+ - spec/rivendell/db/group_spec.rb
217
+ - spec/spec_helper.rb
218
+ - spec/support/db.rb
219
+ - tasks/db.rake
220
+ - tasks/rdoc.rake
221
+ - tasks/rspec.rake
222
+ homepage: http://projects.tryphon.eu/projects/rivendell-db
223
+ licenses: []
224
+
225
+ post_install_message:
226
+ rdoc_options: []
227
+
228
+ require_paths:
229
+ - lib
230
+ required_ruby_version: !ruby/object:Gem::Requirement
231
+ none: false
232
+ requirements:
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ hash: 3
236
+ segments:
237
+ - 0
238
+ version: "0"
239
+ required_rubygems_version: !ruby/object:Gem::Requirement
240
+ none: false
241
+ requirements:
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ hash: 3
245
+ segments:
246
+ - 0
247
+ version: "0"
248
+ requirements: []
249
+
250
+ rubyforge_project:
251
+ rubygems_version: 1.8.24
252
+ signing_key:
253
+ specification_version: 3
254
+ summary: Access to Rivendell database
255
+ test_files:
256
+ - spec/rivendell/db/cart_spec.rb
257
+ - spec/rivendell/db/group_spec.rb
258
+ - spec/spec_helper.rb
259
+ - spec/support/db.rb