wurfl_device 0.1.9 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
4
+
5
+ require 'optparse'
6
+ require 'daemons'
7
+ require 'wurfl_device'
8
+ require 'msgpack/rpc'
9
+
10
+ $rpc_host = '0.0.0.0'
11
+ $rpc_port = 8090
12
+ $state_dir = File.join(ENV['HOME'], '/var/run')
13
+ $log_dir = File.join(ENV['HOME'], '/log')
14
+
15
+ args = OptionParser.new do |opts|
16
+ opts.on("-o", "--host=HOST", "listen on HOST (default: #{$rpc_host})") do |t|
17
+ $rpc_host = t
18
+ end
19
+ opts.on("-p", "--port=PORT", "set port to PORT (default: #{$rpc_port})") do |t|
20
+ $rpc_port = t
21
+ end
22
+ opts.on("-d", "--data=DIR", "set data dir to DIR (default: #{$state_dir})") do |t|
23
+ $state_dir = t
24
+ end
25
+ opts.on("-l", "--log=DIR", "set log dir to DIR (default: #{$log_dir})") do |t|
26
+ $log_dir = t
27
+ end
28
+ end
29
+
30
+ args.parse
31
+
32
+ daemon_options = {
33
+ :backtrace => true,
34
+ :log_output => true,
35
+ :multiple => false,
36
+ :monitor => false,
37
+ }
38
+
39
+ class Daemons::Controller
40
+ def setup_options
41
+ @options[:dir] = $state_dir
42
+ @options[:log_dir] = $log_dir
43
+ end
44
+ end
45
+
46
+ Daemons.run_proc(File.basename($0), daemon_options) do
47
+ server = MessagePack::RPC::Server.new
48
+ server.listen($rpc_host, $rpc_port, WurflDevice::RpcServer.new)
49
+ server.run
50
+ end
data/lib/wurfl_device.rb CHANGED
@@ -22,6 +22,7 @@ module WurflDevice
22
22
  autoload :UserAgent, 'wurfl_device/user_agent'
23
23
  autoload :UserAgentMatcher, 'wurfl_device/user_agent_matcher'
24
24
  autoload :XmlLoader, 'wurfl_device/xml_loader'
25
+ autoload :RpcServer, 'wurfl_device/rpc_server'
25
26
 
26
27
  class WurflDeviceError < StandardError
27
28
  def self.status_code(code = nil)
@@ -28,70 +28,6 @@ module WurflDevice
28
28
  super
29
29
  end
30
30
 
31
- desc "webservice [start|stop|restart|status]", "start a wurfl_device server"
32
- method_option "base-dir", :type => :string, :banner => "set base directory for data files", :aliases => "-d", :default => WurflDevice::Settings::BASE_DIR
33
- method_option :host, :type => :string, :banner => "set webservice host", :aliases => "-h", :default => WurflDevice::Settings::WEBSERVICE_HOST
34
- method_option :port, :type => :numeric, :banner => "set webservice port", :aliases => "-p", :default => WurflDevice::Settings::WEBSERVICE_PORT
35
- method_option :worker, :type => :numeric, :banner => "set worker count", :aliases => "-w", :default => WurflDevice::Settings::WEBSERVICE_WORKER
36
- method_option :socket, :type => :string, :banner => "use unix domain socket", :aliases => "-s", :default => File.join(WurflDevice::Settings::BASE_DIR, WurflDevice::Settings::WEBSERVICE_SOCKET)
37
- method_option :socket_only, :type => :boolean, :banner => "start as unix domain socket listener only", :aliases => "-t", :default => false
38
- def webservice(action=nil)
39
- opts = options.dup
40
-
41
- action ||= 'status'
42
-
43
- pid_file = File.join(WurflDevice::Settings::BASE_DIR, WurflDevice::Settings::WEBSERVICE_PID)
44
- base_dir = opts['base-dir']
45
-
46
- FileUtils.mkdir_p(base_dir) unless File.directory?(base_dir)
47
- FileUtils.cd(File.expand_path('../../', File.dirname(__FILE__)))
48
- if action == 'start'
49
- unless File.exists?(pid_file)
50
- WurflDevice.ui.info "starting webservice..."
51
- WurflDevice.ui.info "listening at #{opts.socket}"
52
-
53
- unicorn_bin = %x[which unicorn].strip
54
- args = [
55
- unicorn_bin,
56
- '-E',
57
- 'production',
58
- '-D',
59
- '-c',
60
- File.expand_path('../../config/unicorn.conf.rb', File.dirname(__FILE__)),
61
- ]
62
-
63
- unless opts.socket_only?
64
- WurflDevice.ui.info "listening at #{opts.host}:#{opts.port}"
65
- args << '-o'
66
- args << opts.host
67
- args << '-p'
68
- args << opts.port
69
- end
70
-
71
- ENV['WURFLDEVICE_WORKER'] = opts.worker.to_s
72
- ENV['WURFLDEVICE_SOCKET'] = opts.socket.to_s
73
-
74
- exec args.join(' ')
75
- end
76
- elsif action == 'stop'
77
- if File.exists?(pid_file)
78
- WurflDevice.ui.info "stopping webservice..."
79
- File.open(pid_file, 'r') do |f|
80
- pid = f.gets.to_i
81
- exec 'kill', '-QUIT', pid.to_s
82
- end
83
- end
84
- FileUtils.rm_f(pid_file)
85
- elsif action == 'restart'
86
- webservice('stop')
87
- sleep(0.3)
88
- webservice('start')
89
- else
90
- #status
91
- end
92
- end
93
- map %w(server) => :webservice
94
-
95
31
  desc "dump DEVICE_ID|USER_AGENT", "display capabilities DEVICE_ID|USER_AGENT"
96
32
  method_option :json, :type => :boolean, :banner => "show the dump in json format", :aliases => "-j"
97
33
  method_option :yaml, :type => :boolean, :banner => "show the dump in yaml format", :aliases => "-y"
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+ module WurflDevice
3
+ class RpcServer
4
+ def capabilities_from_id(device_id)
5
+ capabilities = WurflDevice.capabilities_from_id(device_id)
6
+ yield(capabilities)
7
+ end
8
+
9
+ def capabilities_from_user_agent(user_agent)
10
+ capabilities = WurflDevice.capabilities_from_user_agent(user_agent)
11
+ yield(capabilities)
12
+ end
13
+
14
+ def capability_from_user_agent(capability, user_agent)
15
+ capabilities = WurflDevice.capability_from_user_agent(capability, user_agent)
16
+ yield(capabilities)
17
+ end
18
+ end
19
+ end
@@ -3,13 +3,6 @@ require 'etc'
3
3
 
4
4
  module WurflDevice
5
5
  class Settings
6
- WEBSERVICE_HOST = '127.0.0.1'
7
- WEBSERVICE_PORT = 8090
8
- WEBSERVICE_PID = 'webservice.pid'
9
- WEBSERVICE_LOG = 'webservice.log'
10
- WEBSERVICE_SOCKET = 'webservice.sock'
11
- WEBSERVICE_WORKER = 10
12
-
13
6
  BASE_DIR = File.join(File.expand_path('~'), '.wurfl_device')
14
7
 
15
8
  DB_INDEX = "7".freeze
@@ -19,6 +12,10 @@ module WurflDevice
19
12
 
20
13
  WORST_MATCH = 7
21
14
 
15
+ def self.default_wurfl_xml_file
16
+ File.join(BASE_DIR, 'wurfl.xml')
17
+ end
18
+
22
19
  MOBILE_BROWSERS = [
23
20
  'cldc', 'symbian', 'midp', 'j2me', 'mobile', 'wireless', 'palm', 'phone', 'pocket pc', 'pocketpc', 'netfront',
24
21
  'bolt', 'iris', 'brew', 'openwave', 'windows ce', 'wap2.', 'android', 'opera mini', 'opera mobi', 'maemo', 'fennec',
@@ -28,10 +25,6 @@ module WurflDevice
28
25
  ROBOTS = [ 'bot', 'crawler', 'spider', 'novarra', 'transcoder', 'yahoo! searchmonkey', 'yahoo! slurp', 'feedfetcher-google', 'toolbar', 'mowser' ]
29
26
  DESKTOP_BROWSERS = [ 'slcc1', '.net clr', 'wow64', 'media center pc', 'funwebproducts', 'macintosh', 'aol 9.', 'america online browser', 'googletoolbar' ]
30
27
 
31
- def self.default_wurfl_xml_file
32
- File.join(BASE_DIR, 'wurfl.xml')
33
- end
34
-
35
28
  # TODO this entries should be autmatically generated (in case new entries in wurfl.xml)
36
29
 
37
30
  CAPABILITY_GROUPS = [
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  module WurflDevice
4
- VERSION = "0.1.9".freeze
4
+ VERSION = "0.1.10".freeze
5
5
  end
data/wurfl_device.gemspec CHANGED
@@ -16,13 +16,13 @@ Gem::Specification.new do |s|
16
16
 
17
17
  s.rubyforge_project = 'wurfl_device'
18
18
 
19
+ s.add_dependency 'msgpack-rpc'
20
+ s.add_dependency 'daemons'
19
21
  s.add_dependency 'hiredis'
20
22
  s.add_dependency 'redis'
21
23
  s.add_dependency 'thor'
22
24
  s.add_dependency 'ox'
23
25
  s.add_dependency 'text'
24
- s.add_dependency 'sinatra'
25
- s.add_dependency 'unicorn'
26
26
 
27
27
  s.add_development_dependency 'bundler', '>= 1.0.10'
28
28
  s.add_development_dependency 'rake', '>= 0.9.2'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wurfl_device
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.1.10
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-19 00:00:00.000000000 Z
12
+ date: 2011-11-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: hiredis
16
- requirement: &187020640 !ruby/object:Gem::Requirement
15
+ name: msgpack-rpc
16
+ requirement: &38015820 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *187020640
24
+ version_requirements: *38015820
25
25
  - !ruby/object:Gem::Dependency
26
- name: redis
27
- requirement: &187020000 !ruby/object:Gem::Requirement
26
+ name: daemons
27
+ requirement: &38015120 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *187020000
35
+ version_requirements: *38015120
36
36
  - !ruby/object:Gem::Dependency
37
- name: thor
38
- requirement: &187019440 !ruby/object:Gem::Requirement
37
+ name: hiredis
38
+ requirement: &38014260 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *187019440
46
+ version_requirements: *38014260
47
47
  - !ruby/object:Gem::Dependency
48
- name: ox
49
- requirement: &186910960 !ruby/object:Gem::Requirement
48
+ name: redis
49
+ requirement: &38013380 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *186910960
57
+ version_requirements: *38013380
58
58
  - !ruby/object:Gem::Dependency
59
- name: text
60
- requirement: &186910360 !ruby/object:Gem::Requirement
59
+ name: thor
60
+ requirement: &38011220 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *186910360
68
+ version_requirements: *38011220
69
69
  - !ruby/object:Gem::Dependency
70
- name: sinatra
71
- requirement: &186909800 !ruby/object:Gem::Requirement
70
+ name: ox
71
+ requirement: &38009440 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *186909800
79
+ version_requirements: *38009440
80
80
  - !ruby/object:Gem::Dependency
81
- name: unicorn
82
- requirement: &186909220 !ruby/object:Gem::Requirement
81
+ name: text
82
+ requirement: &38007400 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *186909220
90
+ version_requirements: *38007400
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: bundler
93
- requirement: &186908420 !ruby/object:Gem::Requirement
93
+ requirement: &38004280 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 1.0.10
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *186908420
101
+ version_requirements: *38004280
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rake
104
- requirement: &186905440 !ruby/object:Gem::Requirement
104
+ requirement: &37181180 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 0.9.2
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *186905440
112
+ version_requirements: *37181180
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: rspec-core
115
- requirement: &186904900 !ruby/object:Gem::Requirement
115
+ requirement: &37176540 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ~>
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '2.0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *186904900
123
+ version_requirements: *37176540
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: rspec-expectations
126
- requirement: &186904360 !ruby/object:Gem::Requirement
126
+ requirement: &37174980 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ~>
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '2.0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *186904360
134
+ version_requirements: *37174980
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: rr
137
- requirement: &186903420 !ruby/object:Gem::Requirement
137
+ requirement: &37173860 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ~>
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: '1.0'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *186903420
145
+ version_requirements: *37173860
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: simplecov
148
- requirement: &187328080 !ruby/object:Gem::Requirement
148
+ requirement: &37173180 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ~>
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: 0.5.3
154
154
  type: :development
155
155
  prerelease: false
156
- version_requirements: *187328080
156
+ version_requirements: *37173180
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: fakeredis
159
- requirement: &187326780 !ruby/object:Gem::Requirement
159
+ requirement: &37171500 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ~>
@@ -164,36 +164,36 @@ dependencies:
164
164
  version: 0.2.2
165
165
  type: :development
166
166
  prerelease: false
167
- version_requirements: *187326780
167
+ version_requirements: *37171500
168
168
  description: Ruby client library for mobile handset detection
169
169
  email:
170
170
  - ahutalla@gmail.com
171
171
  executables:
172
172
  - wurfldevice
173
+ - wurfldevice_rpc_server
173
174
  extensions: []
174
175
  extra_rdoc_files:
175
176
  - LICENSE
176
177
  - README.md
177
178
  files:
178
179
  - .gitignore
179
- - .rvmrc
180
180
  - Gemfile
181
181
  - LICENSE
182
182
  - README.md
183
183
  - Rakefile
184
184
  - bin/wurfldevice
185
+ - bin/wurfldevice_rpc_server
185
186
  - config.ru
186
- - config/unicorn.conf.rb
187
187
  - lib/wurfl_device.rb
188
188
  - lib/wurfl_device/cache.rb
189
189
  - lib/wurfl_device/capability.rb
190
190
  - lib/wurfl_device/cli.rb
191
+ - lib/wurfl_device/rpc_server.rb
191
192
  - lib/wurfl_device/settings.rb
192
193
  - lib/wurfl_device/ui.rb
193
194
  - lib/wurfl_device/user_agent.rb
194
195
  - lib/wurfl_device/user_agent_matcher.rb
195
196
  - lib/wurfl_device/version.rb
196
- - lib/wurfl_device/web_service.rb
197
197
  - lib/wurfl_device/xml_loader.rb
198
198
  - spec/cache/device_spec.rb
199
199
  - spec/cache/user_agents_spec.rb
data/.rvmrc DELETED
@@ -1,22 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- ruby_string="1.9"
4
- gemset_name="wurfl_device"
5
-
6
- if rvm list strings | grep -q "${ruby_string}" ; then
7
-
8
- ruby_string=$(rvm list strings | head -1)
9
-
10
- # Load or create the specified environment
11
- if [[ -d "${rvm_path:-$HOME/.rvm}/environments" && -s "${rvm_path:-$HOME/.rvm}/environments/${ruby_string}@${gemset_name}" ]] ; then
12
- \. "${rvm_path:-$HOME/.rvm}/environments/${ruby_string}@${gemset_name}"
13
- else
14
- rvm --create "${ruby_string}@${gemset_name}"
15
- fi
16
-
17
- else
18
-
19
- # Notify the user to install the desired interpreter before proceeding.
20
- echo "${ruby_string} was not found, please run 'rvm install ${ruby_string}' and then cd back into the project directory."
21
-
22
- fi
@@ -1,27 +0,0 @@
1
- $LOAD_PATH.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
2
-
3
- require 'wurfl_device'
4
- require 'raindrops'
5
-
6
- $stats ||= Raindrops::Middleware::Stats.new
7
-
8
- FileUtils.mkdir_p(WurflDevice::Settings::BASE_DIR) unless File.directory?(WurflDevice::Settings::BASE_DIR)
9
-
10
- app_env = ENV['RACK_ENV'] || 'production'
11
- app_root = ::File.expand_path('../..', __FILE__)
12
-
13
- app_timeout = 60
14
- app_workers = ENV['WURFLDEVICE_WORKER'].to_i || WurflDevice::Settings::WEBSERVICE_WORKER
15
- app_listen_socket = ENV['WURFLDEVICE_SOCKET'] || File.join(WurflDevice::Settings::BASE_DIR, WurflDevice::Settings::WEBSERVICE_SOCKET)
16
- app_pid_file = ENV['WURFLDEVICE_PIDFILE'] || File.join(WurflDevice::Settings::BASE_DIR, WurflDevice::Settings::WEBSERVICE_PID)
17
- app_log_file = ENV['WURFLDEVICE_LOGFILE'] || File.join(WurflDevice::Settings::BASE_DIR, WurflDevice::Settings::WEBSERVICE_LOG)
18
-
19
- timeout app_timeout
20
- working_directory app_root
21
- worker_processes (app_env != 'development' ? app_workers : 1)
22
- listen app_listen_socket, :backlog => 64
23
- pid app_pid_file
24
- stderr_path app_log_file
25
- stdout_path app_log_file
26
-
27
- preload_app false
@@ -1,31 +0,0 @@
1
- # encoding: utf-8
2
- require 'yaml'
3
- require 'json'
4
- require 'wurfl_device'
5
- require 'sinatra/base'
6
-
7
- module WurflDevice
8
- class WebService < Sinatra::Base
9
- get '/' do
10
- user_agent = request.env['HTTP_USER_AGENT']
11
- user_agent = WurflDevice::Settings::GENERIC if user_agent.nil? || user_agent.empty?
12
- capabilities = WurflDevice.capabilities_from_user_agent(user_agent)
13
- return capabilities.to_json if params.key?('json')
14
- return capabilities.to_yaml
15
- end
16
-
17
- get '/capability/:id' do
18
- user_agent = request.env['HTTP_USER_AGENT']
19
- user_agent = WurflDevice::Settings::GENERIC if user_agent.nil? || user_agent.empty?
20
- capability = WurflDevice.capability_from_user_agent(params[:id], user_agent)
21
- return capabilities.to_json if params.key?('json')
22
- return capabilities.to_yaml
23
- end
24
-
25
- get '/device/:id' do
26
- capabilities = WurflDevice.capabilities_from_id(params[:id])
27
- return capabilities.to_json if params.key?('json')
28
- return capabilities.to_yaml
29
- end
30
- end
31
- end