ongaku_ryoho_server 0.3.6 → 0.5.0

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.
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