rivendell-db 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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