ongaku_ryoho_server 0.3.6 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7de0168f5720bba9e90009b42988c9dbb9d1cc2a
4
+ data.tar.gz: 1985ef84ad0aa83a0d690961ec0cd41897397ff9
5
+ SHA512:
6
+ metadata.gz: 1dd31f2434a4d21c01b604bbf988a1f8885e25d515216d3df7426ec8a423c3c32592b2f9fe1cc13619029ababf8b1c12db63e27c3690672d24b447cda52c554b
7
+ data.tar.gz: a983c63d1281ea398f47cadc4be5f6283dd6e573514f4d0b35c49aa5198db8b0230ca5372d38f65db09b739803e07de2807a6380823b304ef1457fb1f60ea2cd
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.0.0-p195
data/README.md CHANGED
@@ -1,12 +1,13 @@
1
1
  # Ongaku Ryoho Server
2
2
 
3
- A little Sinatra web server (with Puma) wrapped in a gem specifically for the Ongaku Ryoho client.
3
+ A little web server (with Puma) wrapped in a gem specifically for the Ongaku Ryoho client.
4
4
 
5
5
  ## How to use
6
6
 
7
7
  ### Requirements
8
8
 
9
- `Ruby 1.8.7 (or higher)`
9
+ - taglib
10
+ - ruby 1.8.7 (or higher)
10
11
 
11
12
  ### Installation
12
13
 
@@ -34,4 +35,7 @@ or create a [launch agent](https://gist.github.com/4106353) (tested on OSX Mount
34
35
  --update update the cached collection
35
36
 
36
37
  + all the other puma cli options
38
+ -> https://github.com/puma/puma/blob/v2.0.1/lib/puma/cli.rb#L185
39
+
40
+ -d daemonize
37
41
  ```
data/Rakefile CHANGED
@@ -1,2 +1,9 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
+ require "rake/testtask"
4
+
5
+ task :default => :test
6
+
7
+ Rake::TestTask.new do |t|
8
+ t.pattern = "spec/**/*_spec.rb"
9
+ end
data/history.txt CHANGED
@@ -1,3 +1,16 @@
1
+ === 0.5.0 / 2013-07-02
2
+
3
+ * tests
4
+ * refactored code
5
+
6
+
7
+ === 0.4.0 / 2013-07-01
8
+
9
+ * jsonp support
10
+ * replace json gem with oj
11
+ * update other dependencies
12
+
13
+
1
14
  === 0.3.5 / 2013-03-15
2
15
 
3
16
  * refactor 'check_files' method
@@ -1,5 +1,3 @@
1
- require "sinatra/base"
2
-
3
1
  module OngakuRyohoServer
4
2
  #
5
3
  # { Application }
@@ -16,24 +14,44 @@ module OngakuRyohoServer
16
14
 
17
15
  # root
18
16
  get "/" do
19
- content_type :json
17
+ callback = params[:callback]
18
+ json = OngakuRyohoServer::List.get
19
+
20
+ if callback and !callback.empty?
21
+ content_type :js
22
+ response = "#{callback}(#{json})"
23
+ else
24
+ content_type :json
25
+ response = json
26
+ end
20
27
 
21
- OngakuRyohoServer::List.get
28
+ response
22
29
  end
23
30
 
24
31
 
25
32
  # compare filelists
26
33
  post "/check" do
27
- content_type :json
34
+ callback = params[:callback]
35
+ file_list = params[:file_list]
36
+ other_file_list = params[:other_file_list]
37
+
38
+ missing_and_new = OngakuRyohoServer::Process.check_files(file_list, other_file_list)
39
+ json = Oj.dump(missing_and_new)
40
+
41
+ if callback and !callback.empty?
42
+ content_type :js
43
+ response = "#{callback}(#{json})"
44
+ else
45
+ content_type :json
46
+ response = json
47
+ end
28
48
 
29
- collection = params[:file_list]
30
- OngakuRyohoServer::Process.check_files(collection).to_json
49
+ response
31
50
  end
32
51
 
33
52
 
34
53
  # music file
35
54
  get %r{.(#{FILE_FORMATS.join("|")})$}i do
36
- require "uri"
37
55
  requested_item = URI.unescape(request.path_info[1..-1])
38
56
  File.exists?(requested_item) ? send_file(requested_item) : 404
39
57
  end
@@ -17,7 +17,6 @@ module OngakuRyohoServer
17
17
  # => Creates a digest from the path of the current directory
18
18
  #
19
19
  def self.get_digest
20
- require "digest/sha1"
21
20
  digested_path = Digest::SHA1.hexdigest(Dir.pwd)
22
21
  end
23
22
 
@@ -54,7 +53,7 @@ module OngakuRyohoServer
54
53
  def self.save
55
54
  path = self.config_file_path
56
55
  file_list = OngakuRyohoServer::Process.directory
57
- collection = OngakuRyohoServer::Process.files(file_list).to_json
56
+ collection = Oj.dump(OngakuRyohoServer::Process.files(file_list))
58
57
 
59
58
  # make path
60
59
  FileUtils.mkpath(CONFIG_PATH)
@@ -1,6 +1,3 @@
1
- require "taglib"
2
- require "json"
3
-
4
1
  module OngakuRyohoServer
5
2
  #
6
3
  # { Process }
@@ -29,27 +26,38 @@ module OngakuRyohoServer
29
26
  #
30
27
  # Check files
31
28
  #
32
- # => compares a given file list to the file list from the current directory
29
+ # => compares a given file list to another file list.
30
+ # fallback is file list from the current directory.
33
31
  # show which files are missing and scan the ones that are new
34
32
  #
35
33
  # [params]
36
- # file_list
34
+ # file_list : array of hashes with a :location key
35
+ # other_file_list
37
36
  #
38
37
  # [output]
39
38
  # object containing missing_files and new_tracks array
40
39
  #
41
- def self.check_files(file_list)
42
- file_list = begin JSON.parse(file_list) rescue [] end
43
- file_list_from_current_directory = JSON.parse(OngakuRyohoServer::List.get)
44
- file_list_from_current_directory.map! { |obj| obj["location"] }
40
+ def self.check_files(file_list, other_file_list=nil)
41
+ file_list = Oj.load(file_list || "[]")
42
+
43
+ # other file list
44
+ if other_file_list
45
+ other_file_list = Oj.load(other_file_list)
46
+ else
47
+ other_file_list = Oj.load(OngakuRyohoServer::List.get)
48
+ other_file_list.map! { |obj| obj[:location] }
49
+ end
45
50
 
46
- missing_files = file_list - file_list_from_current_directory
47
- new_files = file_list_from_current_directory - file_list
51
+ # determine which files are missing and which are new
52
+ missing_files = file_list - other_file_list
53
+ new_files = other_file_list - file_list
48
54
 
55
+ # process new files
49
56
  new_tracks = OngakuRyohoServer::Process.files(
50
57
  new_files, { :last_modified => Time.now }
51
58
  )
52
59
 
60
+ # return missing and new tracks
53
61
  return {
54
62
  :missing_files => missing_files,
55
63
  :new_tracks => new_tracks
@@ -1,3 +1,11 @@
1
+ require "rubygems"
2
+ require "taglib"
3
+ require "oj"
4
+ require "sinatra/base"
5
+
6
+ require "uri"
7
+ require "digest/sha1"
8
+
1
9
  require "ongaku_ryoho_server/process"
2
10
  require "ongaku_ryoho_server/list"
3
11
  require "ongaku_ryoho_server/application"
@@ -1,26 +1,28 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  Gem::Specification.new do |s|
4
- s.name = "ongaku_ryoho_server"
5
- s.version = "0.3.6"
4
+ s.name = "ongaku_ryoho_server"
5
+ s.version = "0.5.0"
6
6
 
7
- s.authors = ["Steven Vandevelde"]
8
- s.email = ["icid.asset@gmail.com"]
9
- s.description = "Serves music to Ongaku Ryoho clients"
10
- s.summary = "Serves music to Ongaku Ryoho clients"
11
- s.homepage = "https://github.com/icidasset/ongaku_ryoho_server"
7
+ s.authors = ["Steven Vandevelde"]
8
+ s.email = ["icid.asset@gmail.com"]
9
+ s.description = "Serves music to Ongaku Ryoho clients"
10
+ s.summary = "Serves music to Ongaku Ryoho clients"
11
+ s.homepage = "https://github.com/icidasset/ongaku_ryoho_server"
12
12
 
13
- s.files = `git ls-files`.split($\)
14
- s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
15
- s.test_files = s.files.grep(%r{^(test|spec|features)/})
13
+ s.files = `git ls-files`.split($\)
14
+ s.test_files = s.files.grep(%r{^spec/})
15
+ s.executables = ["ongaku_ryoho_server"]
16
16
 
17
17
  s.require_paths = ["lib"]
18
18
  s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
19
19
 
20
- s.add_dependency "json", "~> 1.7.7"
21
- s.add_dependency "taglib-ruby", "~> 0.5.2"
22
- s.add_dependency "sinatra", "~> 1.4.2"
23
- s.add_dependency "puma", "~> 1.6.3"
20
+ s.add_runtime_dependency "oj", "~> 2.0.14"
21
+ s.add_runtime_dependency "taglib-ruby", "~> 0.6.0"
22
+ s.add_runtime_dependency "sinatra", "~> 1.4.2"
23
+ s.add_runtime_dependency "puma", "~> 2.0.1"
24
24
 
25
- s.add_development_dependency "rake"
25
+ s.add_development_dependency "rake", "~> 10.0.4"
26
+ s.add_development_dependency "rack-test", "~> 0.6.2"
27
+ s.add_development_dependency "minitest", "~> 5.0.3"
26
28
  end
@@ -0,0 +1,121 @@
1
+ require File.expand_path("../spec_helper.rb", __FILE__)
2
+
3
+ describe "Application" do
4
+
5
+ #
6
+ # Index (GET)
7
+ #
8
+ describe "GET /" do
9
+ before do
10
+ OngakuRyohoServer::List.save
11
+ end
12
+
13
+ it "should return json" do
14
+ get "/"
15
+ last_response.must_be :ok?
16
+ last_response.content_type.must_equal "application/json;charset=utf-8"
17
+ end
18
+
19
+ it "should return jsonp" do
20
+ get "/", :callback => "test"
21
+ last_response.must_be :ok?
22
+ last_response.content_type.must_equal "application/javascript;charset=utf-8"
23
+ end
24
+
25
+ it "should have 3 items" do
26
+ get "/"
27
+ json = Oj.load(last_response.body)
28
+ json.length.must_equal 3
29
+ end
30
+
31
+ it "should have an item with the necessary keys" do
32
+ get "/"
33
+
34
+ json = Oj.load(last_response.body)
35
+ first_item = json.first
36
+
37
+ first_item.has_key?(:title).must_equal true
38
+ first_item.has_key?(:artist).must_equal true
39
+ first_item.has_key?(:album).must_equal true
40
+ first_item.has_key?(:year).must_equal true
41
+ first_item.has_key?(:track).must_equal true
42
+ first_item.has_key?(:genre).must_equal true
43
+ end
44
+ end
45
+
46
+
47
+ #
48
+ # Check (POST)
49
+ #
50
+ describe "POST /check" do
51
+ before do
52
+ OngakuRyohoServer::List.save
53
+ end
54
+
55
+ it "should have 2 parent keys" do
56
+ post "/check"
57
+ json = Oj.load(last_response.body)
58
+ json[:missing_files].must_be_kind_of Array
59
+ json[:new_tracks].must_be_kind_of Array
60
+ end
61
+
62
+ it "should have 3 new tracks when given empty file list" do
63
+ post "/check", :file_list => Oj.dump([])
64
+ json = Oj.load(last_response.body)
65
+ json[:new_tracks].length.must_equal 3
66
+ end
67
+
68
+ it "should have 0 new tracks when given same file list" do
69
+ file_list = [
70
+ { :location => "spec/data/a.mp3" },
71
+ { :location => "spec/data/b.mp3" },
72
+ { :location => "spec/data/c.mp3" }
73
+ ]
74
+
75
+ post "/check", :file_list => Oj.dump(file_list)
76
+ json = Oj.load(last_response.body)
77
+ json[:new_tracks].length.must_equal 3
78
+ end
79
+
80
+ it "should have 3 missing files" do
81
+ file_list = [
82
+ { :location => "spec/data/a.mp3" },
83
+ { :location => "spec/data/b.mp3" },
84
+ { :location => "spec/data/c.mp3" }
85
+ ]
86
+
87
+ post "/check",
88
+ :file_list => Oj.dump(file_list),
89
+ :other_file_list => Oj.dump([])
90
+
91
+ json = Oj.load(last_response.body)
92
+ json[:missing_files].length.must_equal 3
93
+ end
94
+ end
95
+
96
+
97
+ #
98
+ # Files (GET)
99
+ #
100
+ describe "GET /*.ALLOWED_FILE_FORMAT" do
101
+ it "should be able to load a.mp3" do
102
+ get "/spec/data/a.mp3"
103
+ last_response.status.must_equal 200
104
+ last_response.content_type.must_equal "audio/mpeg"
105
+ end
106
+
107
+ it "should return a 404 if the file doesn't exist" do
108
+ get "/spec/data/does_not_exist.mp3"
109
+ last_response.status.must_equal 404
110
+ end
111
+ end
112
+
113
+
114
+ describe "GET /*.DISALLOWED_FILE_FORMAT" do
115
+ it "should return a 403" do
116
+ get "/forbidden.tar.gz"
117
+ last_response.status.must_equal 403
118
+ end
119
+ end
120
+
121
+ end
data/spec/data/a.mp3 ADDED
Binary file
data/spec/data/b.mp3 ADDED
Binary file
data/spec/data/c.mp3 ADDED
Binary file
@@ -0,0 +1,14 @@
1
+ ENV["RACK_ENV"] = "test"
2
+
3
+ require File.expand_path("../../lib/ongaku_ryoho_server", __FILE__)
4
+ require "minitest/autorun"
5
+ require "rack/test"
6
+
7
+
8
+ class MiniTest::Spec
9
+ include Rack::Test::Methods
10
+
11
+ def app
12
+ OngakuRyohoServer::Application
13
+ end
14
+ end
metadata CHANGED
@@ -1,52 +1,46 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ongaku_ryoho_server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
5
- prerelease:
4
+ version: 0.5.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Steven Vandevelde
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-04-13 00:00:00.000000000 Z
11
+ date: 2013-06-02 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- name: json
14
+ name: oj
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
21
- version: 1.7.7
19
+ version: 2.0.14
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
- version: 1.7.7
26
+ version: 2.0.14
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: taglib-ruby
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
37
- version: 0.5.2
33
+ version: 0.6.0
38
34
  type: :runtime
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.5.2
40
+ version: 0.6.0
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: sinatra
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :runtime
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
@@ -62,35 +55,59 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: puma
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
69
- version: 1.6.3
61
+ version: 2.0.1
70
62
  type: :runtime
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
- version: 1.6.3
68
+ version: 2.0.1
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rake
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 10.0.4
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 10.0.4
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack-test
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
84
88
  - !ruby/object:Gem::Version
85
- version: '0'
89
+ version: 0.6.2
86
90
  type: :development
87
91
  prerelease: false
88
92
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
93
  requirements:
91
- - - ! '>='
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 0.6.2
97
+ - !ruby/object:Gem::Dependency
98
+ name: minitest
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 5.0.3
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
92
109
  - !ruby/object:Gem::Version
93
- version: '0'
110
+ version: 5.0.3
94
111
  description: Serves music to Ongaku Ryoho clients
95
112
  email:
96
113
  - icid.asset@gmail.com
@@ -100,6 +117,7 @@ extensions: []
100
117
  extra_rdoc_files: []
101
118
  files:
102
119
  - .gitignore
120
+ - .ruby-version
103
121
  - Gemfile
104
122
  - LICENSE
105
123
  - README.md
@@ -112,31 +130,37 @@ files:
112
130
  - lib/ongaku_ryoho_server/list.rb
113
131
  - lib/ongaku_ryoho_server/process.rb
114
132
  - ongaku_ryoho_server.gemspec
133
+ - spec/application_spec.rb
134
+ - spec/data/a.mp3
135
+ - spec/data/b.mp3
136
+ - spec/data/c.mp3
137
+ - spec/spec_helper.rb
115
138
  homepage: https://github.com/icidasset/ongaku_ryoho_server
116
139
  licenses: []
140
+ metadata: {}
117
141
  post_install_message:
118
142
  rdoc_options: []
119
143
  require_paths:
120
144
  - lib
121
145
  required_ruby_version: !ruby/object:Gem::Requirement
122
- none: false
123
146
  requirements:
124
- - - ! '>='
147
+ - - '>='
125
148
  - !ruby/object:Gem::Version
126
149
  version: 1.8.7
127
150
  required_rubygems_version: !ruby/object:Gem::Requirement
128
- none: false
129
151
  requirements:
130
- - - ! '>='
152
+ - - '>='
131
153
  - !ruby/object:Gem::Version
132
154
  version: '0'
133
- segments:
134
- - 0
135
- hash: 1922673208521641221
136
155
  requirements: []
137
156
  rubyforge_project:
138
- rubygems_version: 1.8.23
157
+ rubygems_version: 2.0.2
139
158
  signing_key:
140
- specification_version: 3
159
+ specification_version: 4
141
160
  summary: Serves music to Ongaku Ryoho clients
142
- test_files: []
161
+ test_files:
162
+ - spec/application_spec.rb
163
+ - spec/data/a.mp3
164
+ - spec/data/b.mp3
165
+ - spec/data/c.mp3
166
+ - spec/spec_helper.rb