rbitter 0.0.8 → 0.1.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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +21 -21
  3. data/.rspec +2 -2
  4. data/.travis.yml +15 -9
  5. data/Gemfile +12 -11
  6. data/LICENSE.txt +22 -22
  7. data/README.md +23 -16
  8. data/Rakefile +8 -8
  9. data/XMLRPC.md +19 -19
  10. data/bin/rbitter +20 -6
  11. data/lib/rbitter/arcserver.rb +126 -97
  12. data/lib/rbitter/console.rb +93 -61
  13. data/lib/rbitter/default/config_json.rb +38 -37
  14. data/lib/rbitter/dlthread.rb +66 -66
  15. data/lib/rbitter/env.rb +62 -59
  16. data/lib/rbitter/libtwitter_connection_override.rb +45 -45
  17. data/lib/rbitter/records.rb +121 -109
  18. data/lib/rbitter/records_migrate/20150327_add_index.rb +11 -7
  19. data/lib/rbitter/records_migrate/20150504_add_replyto_column.rb +12 -0
  20. data/lib/rbitter/streaming.rb +104 -75
  21. data/lib/rbitter/version.rb +20 -3
  22. data/lib/rbitter/xmlrpc.rb +3 -3
  23. data/lib/rbitter/xmlrpcd/base.rb +24 -24
  24. data/lib/rbitter/xmlrpcd/rpchandles.rb +11 -11
  25. data/lib/rbitter/xmlrpcd/xmlrpc_auth_server.rb +82 -83
  26. data/lib/rbitter/xmlrpcd/xmlrpcd.rb +69 -63
  27. data/lib/rbitter.rb +86 -92
  28. data/rbitter.gemspec +42 -42
  29. data/spec/config/default.json +32 -32
  30. data/spec/rbitter/arcserver_spec.rb +30 -9
  31. data/spec/rbitter/console_spec.rb +9 -9
  32. data/spec/rbitter/default/config_json_spec.rb +3 -3
  33. data/spec/rbitter/dlthread_spec.rb +13 -9
  34. data/spec/rbitter/env_spec.rb +62 -56
  35. data/spec/rbitter/libtwitter_connection_override_spec.rb +8 -8
  36. data/spec/rbitter/records_spec.rb +13 -13
  37. data/spec/rbitter/streaming_spec.rb +9 -9
  38. data/spec/rbitter/version_spec.rb +8 -8
  39. data/spec/rbitter/xmlrpc_spec.rb +8 -8
  40. data/spec/rbitter/xmlrpcd/base_spec.rb +29 -29
  41. data/spec/rbitter/xmlrpcd/rpchandles_spec.rb +10 -10
  42. data/spec/rbitter/xmlrpcd/xmlrpc_auth_server_spec.rb +8 -8
  43. data/spec/rbitter/xmlrpcd/xmlrpcd_spec.rb +9 -9
  44. data/spec/rbitter_spec.rb +42 -46
  45. data/spec/spec_helper.rb +39 -36
  46. metadata +68 -41
  47. data/config.json.example +0 -30
@@ -1,84 +1,83 @@
1
- # encoding: utf-8
2
- #
3
-
4
- require "rbitter/xmlrpcd/rpchandles"
5
- require "rbitter/xmlrpcd/base"
6
- require "xmlrpc/server"
7
- require "webrick"
8
-
9
- module XMLRPC
10
- class HTTPAuthXMLRPCServer < XMLRPC::WEBrickServlet
11
- def extract_method(methodname, *args)
12
- for name, obj in @handler
13
- if obj.kind_of? Proc
14
- next unless methodname == name
15
- else
16
- next unless methodname =~ /^#{name}(.+)$/
17
- next unless obj.respond_to? $1
18
- return obj.method($1)
19
- end
20
- end
21
- nil
22
- end
23
-
24
- def service(request, response)
25
- # Taken from xmlrpc/server.rb
26
- if @valid_ip
27
- raise WEBrick::HTTPStatus::Forbidden unless @valid_ip.any? { |ip| request.peeraddr[3] =~ ip }
28
- end
29
-
30
- if request.request_method != "POST"
31
- raise WEBrick::HTTPStatus::MethodNotAllowed,
32
- "unsupported method `#{request.request_method}'."
33
- end
34
-
35
- if parse_content_type(request['Content-type']).first != "text/xml"
36
- raise WEBrick::HTTPStatus::BadRequest
37
- end
38
-
39
- length = (request['Content-length'] || 0).to_i
40
-
41
- raise WEBrick::HTTPStatus::LengthRequired unless length > 0
42
-
43
- data = request.body
44
-
45
- if data.nil? or data.bytesize != length
46
- raise WEBrick::HTTPStatus::BadRequest
47
- end
48
-
49
- # Originally, process(data) was here.
50
- # We need to check whether a method requires authorization.
51
- rpc_method_name, rpc_params = parser().parseMethodCall(data)
52
- rpc_method = extract_method(rpc_method_name)
53
-
54
- if RPCHandles.auth.nil?
55
- resp = handle(rpc_method_name, *rpc_params)
56
- else
57
- if rpc_method.owner.ancestors.include?(RPCHandles::BaseHandle::Auth)
58
- # Check cookie and check it's valid
59
- if request.cookies.size == 1 \
60
- and request.cookies[0].name == "auth_key" \
61
- and RPCHandles.auth.include?(request.cookies[0].value)
62
- resp = handle(rpc_method_name, *rpc_params)
63
- else
64
- # Permission required
65
- raise WEBrick::HTTPStatus::Forbidden
66
- end
67
- elsif rpc_method.owner.ancestors.include?(RPCHandles::BaseHandle::NoAuth)
68
- resp = handle(rpc_method_name, *rpc_params)
69
- else
70
- raise WEBrick::HTTPStatus::Forbidden
71
- end
72
- end
73
-
74
- if resp.nil? or resp.bytesize <= 0
75
- raise WEBrick::HTTPStatus::InternalServerError
76
- end
77
-
78
- response.status = 200
79
- response['Content-Length'] = resp.bytesize
80
- response['Content-Type'] = "text/xml; charset=utf-8"
81
- response.body = resp
82
- end
83
- end
1
+ # encoding: utf-8
2
+
3
+ require "rbitter/xmlrpcd/rpchandles"
4
+ require "rbitter/xmlrpcd/base"
5
+ require "xmlrpc/server"
6
+ require "webrick"
7
+
8
+ module XMLRPC
9
+ class HTTPAuthXMLRPCServer < XMLRPC::WEBrickServlet
10
+ def extract_method(methodname, *args)
11
+ for name, obj in @handler
12
+ if obj.kind_of? Proc
13
+ next unless methodname == name
14
+ else
15
+ next unless methodname =~ /^#{name}(.+)$/
16
+ next unless obj.respond_to? $1
17
+ return obj.method($1)
18
+ end
19
+ end
20
+ nil
21
+ end
22
+
23
+ def service(request, response)
24
+ # Taken from xmlrpc/server.rb
25
+ if @valid_ip
26
+ raise WEBrick::HTTPStatus::Forbidden unless @valid_ip.any? { |ip| request.peeraddr[3] =~ ip }
27
+ end
28
+
29
+ if request.request_method != "POST"
30
+ raise WEBrick::HTTPStatus::MethodNotAllowed,
31
+ "unsupported method `#{request.request_method}'."
32
+ end
33
+
34
+ if parse_content_type(request['Content-type']).first != "text/xml"
35
+ raise WEBrick::HTTPStatus::BadRequest
36
+ end
37
+
38
+ length = (request['Content-length'] || 0).to_i
39
+
40
+ raise WEBrick::HTTPStatus::LengthRequired unless length > 0
41
+
42
+ data = request.body
43
+
44
+ if data.nil? or data.bytesize != length
45
+ raise WEBrick::HTTPStatus::BadRequest
46
+ end
47
+
48
+ # Originally, process(data) was here.
49
+ # We need to check whether a method requires authorization.
50
+ rpc_method_name, rpc_params = parser().parseMethodCall(data)
51
+ rpc_method = extract_method(rpc_method_name)
52
+
53
+ if RPCHandles.auth.nil?
54
+ resp = handle(rpc_method_name, *rpc_params)
55
+ else
56
+ if rpc_method.owner.ancestors.include?(RPCHandles::BaseHandle::Auth)
57
+ # Check cookie and check it's valid
58
+ if request.cookies.size == 1 \
59
+ and request.cookies[0].name == "auth_key" \
60
+ and RPCHandles.auth.include?(request.cookies[0].value)
61
+ resp = handle(rpc_method_name, *rpc_params)
62
+ else
63
+ # Permission required
64
+ raise WEBrick::HTTPStatus::Forbidden
65
+ end
66
+ elsif rpc_method.owner.ancestors.include?(RPCHandles::BaseHandle::NoAuth)
67
+ resp = handle(rpc_method_name, *rpc_params)
68
+ else
69
+ raise WEBrick::HTTPStatus::Forbidden
70
+ end
71
+ end
72
+
73
+ if resp.nil? or resp.bytesize <= 0
74
+ raise WEBrick::HTTPStatus::InternalServerError
75
+ end
76
+
77
+ response.status = 200
78
+ response['Content-Length'] = resp.bytesize
79
+ response['Content-Type'] = "text/xml; charset=utf-8"
80
+ response.body = resp
81
+ end
82
+ end
84
83
  end
@@ -1,63 +1,69 @@
1
- # encoding: utf-8
2
-
3
- require "rbitter/xmlrpcd/rpchandles"
4
- require "rbitter/xmlrpcd/xmlrpc_auth_server"
5
- require "webrick"
6
-
7
- module Rbitter
8
- RPC_PREFIX="rbitter"
9
-
10
- class RPCServer
11
- def initialize bind_host, bind_port
12
- @server = WEBrick::HTTPServer.new(:Port => bind_port.to_i, :BindAddress => bind_host.to_s, :MaxClients => 4, :Logger => WEBrick::Log.new($stdout))
13
- @core = XMLRPC::HTTPAuthXMLRPCServer.new
14
- load_all_handles
15
- @core.set_default_handler { |name, *args|
16
- "NO_COMMAND: #{name} with args #{args.inspect}"
17
- }
18
- end
19
-
20
- def load_all_handles
21
- Rbitter.env["xmlrpc"]["handles"].each { |path|
22
- puts "[xmlrpc] Scanning handles from (#{path})"
23
- Dir.entries(path).each { |fname|
24
- fname = File.join(path, fname)
25
- if File.exist?(fname) and File.file?(fname)
26
- if fname.match(/rh_\w+\.rb$/)
27
- begin
28
- load fname
29
- rescue Exception => e
30
- # stub
31
- puts "Exception while loading #{fname}"
32
- puts e.inspect
33
- end
34
- else
35
- puts "Ignored: #{fname}"
36
- end
37
- end
38
- }
39
- }
40
-
41
- puts "[xmlrpc] found #{RPCHandles.constants.length} constants."
42
- RPCHandles.constants.each { |handler|
43
- if RPCHandles.const_get(handler).is_a?(Class)
44
- @core.add_handler(RPC_PREFIX, RPCHandles.const_get(handler).new)
45
- end
46
- }
47
- end
48
-
49
- def main_loop
50
- puts "RPCServer starts"
51
- @server.mount("/", @core)
52
- @server.start
53
- end
54
- end
55
- end
56
-
57
-
58
- if __FILE__ == $0
59
- puts "Local testing server starts..."
60
- rpcd = Rbitter::RPCServer.new('127.0.0.1', 1300)
61
- rpcd.main_loop
62
- end
63
-
1
+ # encoding: utf-8
2
+
3
+ require "rbitter/xmlrpcd/rpchandles"
4
+ require "rbitter/xmlrpcd/xmlrpc_auth_server"
5
+ require "webrick"
6
+
7
+ module Rbitter
8
+ RPC_PREFIX="rbitter"
9
+
10
+ class RPCServer
11
+ def initialize bind_host, bind_port
12
+ @server = WEBrick::HTTPServer.new(:Port => bind_port.to_i, :BindAddress => bind_host.to_s, :MaxClients => 4, :Logger => WEBrick::Log.new($stdout))
13
+ @core = XMLRPC::HTTPAuthXMLRPCServer.new
14
+ @core.set_default_handler { |name, *args|
15
+ "NO_COMMAND: #{name} with args #{args.inspect}"
16
+ }
17
+ end
18
+
19
+ def load_all_handles
20
+ Rbitter["xmlrpc"]["handles"].each { |path|
21
+ puts "[xmlrpc] Scanning handles from (#{path})"
22
+ Dir.entries(path).each { |fname|
23
+ fname = File.join(path, fname)
24
+ if File.exist?(fname) and File.file?(fname)
25
+ if fname.match(/rh_\w+\.rb$/)
26
+ begin
27
+ load fname
28
+ rescue Exception => e
29
+ # stub
30
+ puts "Exception while loading #{fname}"
31
+ puts e.inspect
32
+ end
33
+ else
34
+ puts "Ignored: #{fname}"
35
+ end
36
+ end
37
+ }
38
+ }
39
+
40
+ puts "[xmlrpc] found #{RPCHandles.constants.length} constants."
41
+ RPCHandles.constants.each { |handler|
42
+ if RPCHandles.const_get(handler).is_a?(Class)
43
+ @core.add_handler(RPC_PREFIX, RPCHandles.const_get(handler).new)
44
+ end
45
+ }
46
+ end
47
+
48
+ def main_loop
49
+ load_all_handles
50
+
51
+ @server.mount("/", @core)
52
+ @server.start
53
+
54
+ puts "[xmlrpc] XMLRPC started"
55
+ end
56
+ end
57
+
58
+ class DummyRPCServer
59
+ def initialize bind_host, bind_port; end
60
+
61
+ def load_all_handles; end
62
+
63
+ def main_loop
64
+ puts "[xmlrpc] DummyRPCServer started"
65
+ end
66
+ end
67
+
68
+ class NullRPCServer; end
69
+ end
data/lib/rbitter.rb CHANGED
@@ -1,92 +1,86 @@
1
- # encoding: utf-8
2
- #
3
-
4
- require "rbitter/version"
5
- require "rbitter/arcserver"
6
- require "rbitter/env"
7
- require "rbitter/console"
8
- require "rbitter/xmlrpc"
9
-
10
- module Rbitter
11
- def self.rbitter_header
12
- puts "Rbitter #{VERSION} on Ruby-#{RUBY_VERSION} (#{RUBY_PLATFORM})"
13
- end
14
-
15
- def self.rbitter_help_msg
16
- puts "Rbitter is a Twitter streaming archiver, with XMLRPC access."
17
- puts "-------"
18
- puts "Usage: rbitter (application-mode)"
19
- puts "application-mode's are:"
20
- puts "|- serve : Launch Rbitter full system (Streaming + Database + XMLRPC)"
21
- puts "|- console : Launch console application utilizing XMLRPC"
22
- puts "|- configure: Write default configuration file 'config.json' in current folder"
23
- puts "|- help : Show this message"
24
- puts "`- logs : Show Rbitter internal logs"
25
- end
26
-
27
- def self.prebootstrap
28
- # Due to stalled socket problem, If unpatched twitter gem is installed.
29
- # Twitter::Streaming::Connection will be monkey-patched.
30
- patch_required = false
31
-
32
- if Twitter::Version.const_defined?(:MAJOR)
33
- b5_version = Twitter::Version::MAJOR * 10000
34
- + Twitter::Version::MINOR * 100 + Twitter::Version::PATCH
35
- if b5_version <= 51400
36
- warn "[rbitter] Monkey-patching Twitter::Streaming::Connection..."
37
- warn "[rbitter] Gem installed on here seemed that it doesn't handle socket read timeout."
38
- warn "[rbitter] Please upgrade twitter gem"
39
- patch_required = true
40
- end
41
- else
42
- b6_version = Twitter::Version.to_a
43
- if b6_version[0] <= 6 and b6_version[1] <= 0 and b6_version[2] <= 0
44
- patch_required = true
45
- end
46
- end
47
-
48
- require "rbitter/libtwitter_connection_override" if patch_required
49
- end
50
-
51
- def self.bootstrap args=[]
52
- prebootstrap
53
-
54
- if args.length == 0
55
- rbitter_header
56
- elsif args[0] == "serve"
57
- Rbitter.config_initialize
58
-
59
- main = Rbitter::ArcServer.new
60
- if env['xmlrpc']['enable']
61
- $rpc_service_thread = Thread.new {
62
- rpc_server = Rbitter::RPCServer.new(env['xmlrpc']['bind_host'], env['xmlrpc']['bind_port'])
63
- rpc_server.main_loop
64
- }
65
- $rpc_service_thread.run
66
- end
67
- main.main_loop
68
- elsif args[0] == "configure"
69
- require "rbitter/default/config_json"
70
-
71
- puts "Writing config.json now"
72
- open(File.join(Dir.pwd, "config.json"), "w") { |io|
73
- io.write(DEFAULT_CONFIG_JSON)
74
- }
75
- puts "Writing finished"
76
- puts "You can put config.json one of these locations:"
77
- puts "[1] config.json (current folder)"
78
- puts "[2] .rbitter/config.json (current folder)"
79
- elsif args[0] == "console"
80
- Rbitter.config_initialize
81
-
82
- con = Rbitter::Console.new
83
- con.start
84
- elsif args[0] == "logs"
85
- # show log in stdout
86
- puts "This feature is in heavy development. Sorry."
87
- else
88
- rbitter_header
89
- rbitter_help_msg
90
- end
91
- end
92
- end
1
+ # encoding: utf-8
2
+ #
3
+
4
+ require "rbitter/version"
5
+ require "rbitter/arcserver"
6
+ require "rbitter/env"
7
+ require "rbitter/console"
8
+ require "rbitter/xmlrpc"
9
+
10
+ module Rbitter
11
+ BOOTSTRAP_ARGS = ['configure', 'console', 'help', 'logs', 'serve']
12
+
13
+ def self.rbitter_header
14
+ puts "Rbitter #{VERSION} on #{RUBY_VERSION} (#{RUBY_PLATFORM})"
15
+ end
16
+
17
+ def self.rbitter_help_msg
18
+ puts "Rbitter is a Twitter streaming archiver, with XMLRPC access."
19
+ puts "-------"
20
+ puts "Usage: rbitter (application-mode)"
21
+ puts "application-mode's are:"
22
+ puts "|- serve : Launch Rbitter full system (Streaming + Database + XMLRPC)"
23
+ puts "|- console : Launch console application utilizing XMLRPC"
24
+ puts "|- configure: Write default configuration file 'config.json' in current folder"
25
+ puts "|- help : Show this message"
26
+ puts "`- logs : Show Rbitter internal logs"
27
+ end
28
+
29
+ def self.prebootstrap
30
+ # Due to stalled socket problem, If unpatched twitter gem is installed.
31
+ # Twitter::Streaming::Connection will be monkey-patched.
32
+ patch_required = false
33
+
34
+ if Twitter::Version.const_defined?(:MAJOR)
35
+ b5_version = Twitter::Version::MAJOR * 10000
36
+ + Twitter::Version::MINOR * 100 + Twitter::Version::PATCH
37
+ if b5_version <= 51400
38
+ warn "[rbitter] Monkey-patching Twitter::Streaming::Connection"
39
+ warn "[rbitter] Please upgrade twitter gem to apply streaming read timeout"
40
+ patch_required = true
41
+ end
42
+ else
43
+ b6_version = Twitter::Version.to_a
44
+ if b6_version[0] <= 6 and b6_version[1] <= 0 and b6_version[2] <= 0
45
+ patch_required = true
46
+ end
47
+ end
48
+
49
+ require "rbitter/libtwitter_connection_override" if patch_required
50
+ end
51
+
52
+ def self.bootstrap_configs
53
+ require "rbitter/default/config_json"
54
+
55
+ open(File.join(Dir.pwd, "config.json"), "w") { |io|
56
+ io.write(DEFAULT_CONFIG_JSON)
57
+ }
58
+ end
59
+
60
+ def self.bootstrap args=[]
61
+ return nil if args.length < 1
62
+
63
+ if args[0] == "serve"
64
+ prebootstrap
65
+
66
+ Rbitter.config_initialize
67
+
68
+ archive_server = Rbitter::ArcServer.new
69
+ archive_server.main_loop
70
+ elsif args[0] == "help"
71
+ rbitter_help_msg
72
+ elsif args[0] == "configure"
73
+ bootstrap_configs
74
+ elsif args[0] == "console"
75
+ Rbitter.config_initialize
76
+
77
+ con = Rbitter::Console.new
78
+ con.start
79
+ elsif args[0] == "logs"
80
+ # show log in stdout
81
+ puts "Log buffer feature is in heavy development. Sorry."
82
+ else
83
+ fail StandardError, "Invalid bootstrap parameter: #{args[0]}"
84
+ end
85
+ end
86
+ end
data/rbitter.gemspec CHANGED
@@ -1,42 +1,42 @@
1
- # coding: utf-8
2
-
3
- lib = File.expand_path('../lib', __FILE__)
4
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'rbitter/version'
6
-
7
- Gem::Specification.new do |spec|
8
- spec.name = "rbitter"
9
- spec.version = Rbitter::VERSION
10
- spec.authors = ["Nidev Plontra"]
11
- spec.email = ["nidev.plontra@gmail.com"]
12
- spec.summary = %q{Rbitter is a Twitter client specialized in archiving}
13
- spec.description = %q{Rbitter archives all tweets appeared on user streaming using ActiveRecord. XMLRPC is used to serve archived tweets and useful features}
14
- spec.homepage = "https://github.com/nidev/rbitter"
15
- spec.license = "MIT"
16
-
17
- spec.files = `git ls-files -z`.split("\x0")
18
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
- spec.require_paths = ["lib"]
21
-
22
-
23
- spec.add_dependency 'twitter', '~> 5.14'
24
- spec.add_dependency 'json', '~> 1.7'
25
- spec.add_dependency 'ripl', '~> 0'
26
- spec.add_dependency 'activerecord', '~> 4.0'
27
-
28
- if RUBY_PLATFORM == 'java'
29
- spec.add_dependency 'activerecord-jdbc-adapter', '~> 1.3'
30
- spec.add_dependency 'jdbc-sqlite3', '~> 3.8'
31
- spec.add_dependency 'jdbc-mysql', '~> 5.1'
32
- spec.add_dependency 'activerecord-jdbcsqlite3-adapter', '~> 1.3'
33
- spec.add_dependency 'activerecord-jdbcmysql-adapter', '~> 1.3'
34
- else
35
- spec.add_dependency 'sqlite3', '~> 1.3'
36
- spec.add_dependency 'mysql2', '~> 0.3'
37
- spec.add_dependency 'activerecord-mysql2-adapter', '~> 0.0.3'
38
- end
39
-
40
- spec.add_development_dependency "bundler", "~> 1.6"
41
- spec.add_development_dependency "rake", "~> 10.0"
42
- end
1
+ # coding: utf-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'rbitter/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "rbitter"
9
+ spec.version = Rbitter::VERSION
10
+ spec.authors = ["Nidev Plontra"]
11
+ spec.email = ["nidev.plontra@gmail.com"]
12
+ spec.summary = %q{Rbitter is a Twitter client specialized in archiving}
13
+ spec.description = %q{Rbitter archives all tweets appeared on user streaming using ActiveRecord. XMLRPC is used to serve archived tweets and useful features}
14
+ spec.homepage = "https://github.com/nidev/rbitter"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+
23
+ spec.add_dependency 'twitter', '~> 5.14'
24
+ spec.add_dependency 'json', '~> 1.7'
25
+ spec.add_dependency 'ripl', '~> 0.7'
26
+ spec.add_dependency 'activerecord', '~> 4.0'
27
+
28
+ if RUBY_PLATFORM == 'java'
29
+ spec.add_dependency 'activerecord-jdbc-adapter', '~> 1.3'
30
+ spec.add_dependency 'jdbc-sqlite3', '~> 3.8'
31
+ spec.add_dependency 'jdbc-mysql', '~> 5.1'
32
+ spec.add_dependency 'activerecord-jdbcsqlite3-adapter', '~> 1.3'
33
+ spec.add_dependency 'activerecord-jdbcmysql-adapter', '~> 1.3'
34
+ else
35
+ spec.add_dependency 'sqlite3', '~> 1.3'
36
+ spec.add_dependency 'mysql2', '~> 0.3'
37
+ spec.add_dependency 'activerecord-mysql2-adapter', '~> 0.0.3'
38
+ end
39
+
40
+ spec.add_development_dependency "bundler", "~> 1.6"
41
+ spec.add_development_dependency "rake", "~> 10.0"
42
+ end
@@ -1,33 +1,33 @@
1
- {
2
- "twitter": {
3
- "consumer_key": "",
4
- "consumer_secret": "",
5
- "access_token": "",
6
- "access_token_secret": ""
7
- },
8
- "activerecord": "sqlite3",
9
- "sqlite3": {
10
- "dbfile": "rbitter.sqlite"
11
- },
12
- "mysql2": {
13
- "host": "localhost",
14
- "port": 3306,
15
- "dbname": "archive",
16
- "username": "",
17
- "password": ""
18
- },
19
- "media_downloader": {
20
- "cacert_path": "/cacerts/cacert.pem",
21
- "download_dir": "imgs/"
22
- },
23
- "xmlrpc": {
24
- "enable": true,
25
- "bind_host": "0.0.0.0",
26
- "bind_port": 1400,
27
- "auth": {
28
- "username": "username",
29
- "password": "password"
30
- },
31
- "handles": ["/path/to/handles"]
32
- }
1
+ {
2
+ "twitter": {
3
+ "consumer_key": "",
4
+ "consumer_secret": "",
5
+ "access_token": "",
6
+ "access_token_secret": ""
7
+ },
8
+ "activerecord": "sqlite3",
9
+ "sqlite3": {
10
+ "dbfile": "rbitter.sqlite"
11
+ },
12
+ "mysql2": {
13
+ "host": "localhost",
14
+ "port": 3306,
15
+ "dbname": "archive",
16
+ "username": "",
17
+ "password": ""
18
+ },
19
+ "media_downloader": {
20
+ "cacert_path": "/cacerts/cacert.pem",
21
+ "download_dir": "imgs/"
22
+ },
23
+ "xmlrpc": {
24
+ "enable": true,
25
+ "bind_host": "0.0.0.0",
26
+ "bind_port": 1400,
27
+ "auth": {
28
+ "username": "username",
29
+ "password": "password"
30
+ },
31
+ "handles": ["/path/to/handles"]
32
+ }
33
33
  }