BtSync 0.5.3 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +8 -8
  2. data/.rubocop.yml +3 -0
  3. data/.travis.yml +2 -2
  4. data/README.md +1 -0
  5. data/btsync.gemspec +1 -0
  6. data/lib/btsync.rb +90 -50
  7. data/lib/btsync/communicator.rb +36 -15
  8. data/lib/btsync/directory.rb +106 -51
  9. data/lib/btsync/version.rb +2 -1
  10. data/spec/BtSync/bt_sync_spec.rb +85 -59
  11. data/spec/BtSync/directory_spec.rb +77 -30
  12. data/spec/fixtures/cassettes/Remove-Default-Host.yml +3 -3
  13. data/spec/fixtures/cassettes/Setup-BtSync-Directory.yml +48 -46
  14. data/spec/fixtures/cassettes/Setup-BtSync.yml +287 -32
  15. data/spec/fixtures/cassettes/Setup-Directory-Settings.yml +6 -6
  16. data/spec/fixtures/cassettes/add-folder-list.yml +33 -30
  17. data/spec/fixtures/cassettes/add-folder.yml +67 -10
  18. data/spec/fixtures/cassettes/add-known-host.yml +8 -9
  19. data/spec/fixtures/cassettes/change_download_limit.yml +9 -9
  20. data/spec/fixtures/cassettes/change_listening_port.yml +9 -9
  21. data/spec/fixtures/cassettes/change_name.yml +9 -9
  22. data/spec/fixtures/cassettes/change_secret_custom.yml +59 -0
  23. data/spec/fixtures/cassettes/change_secret_empty.yml +59 -0
  24. data/spec/fixtures/cassettes/change_secret_error.yml +30 -0
  25. data/spec/fixtures/cassettes/change_upload_limit.yml +9 -9
  26. data/spec/fixtures/cassettes/check_for_new_version.yml +30 -0
  27. data/spec/fixtures/cassettes/check_is_writable.yml +32 -0
  28. data/spec/fixtures/cassettes/check_speeds.yml +33 -0
  29. data/spec/fixtures/cassettes/delete-directory.yml +379 -0
  30. data/spec/fixtures/cassettes/get-folders.yml +19 -76
  31. data/spec/fixtures/cassettes/get-os-type.yml +3 -3
  32. data/spec/fixtures/cassettes/get-peers.yml +8 -7
  33. data/spec/fixtures/cassettes/get-preferences.yml +24 -24
  34. data/spec/fixtures/cassettes/get-settings.yml +3 -3
  35. data/spec/fixtures/cassettes/get_dir.yml +93 -0
  36. data/spec/fixtures/cassettes/get_read_only_secret.yml +32 -0
  37. data/spec/fixtures/cassettes/{get-version.yml → get_version.yml} +4 -4
  38. data/spec/fixtures/cassettes/remove-folder-list.yml +19 -17
  39. data/spec/fixtures/cassettes/remove-folder.yml +36 -33
  40. data/spec/fixtures/cassettes/remove-known-host.yml +35 -8
  41. data/spec/fixtures/cassettes/reset_device_name.yml +9 -9
  42. data/spec/fixtures/cassettes/reset_download_limit.yml +9 -9
  43. data/spec/fixtures/cassettes/reset_listening_port.yml +9 -9
  44. data/spec/fixtures/cassettes/reset_secret.yml +31 -0
  45. data/spec/fixtures/cassettes/reset_upload_limit.yml +9 -9
  46. data/spec/fixtures/cassettes/set-preferences-delete.yml +11 -11
  47. data/spec/fixtures/cassettes/set-preferences-dht.yml +11 -11
  48. data/spec/fixtures/cassettes/set-preferences-hosts.yml +11 -11
  49. data/spec/fixtures/cassettes/set-preferences-lan.yml +11 -11
  50. data/spec/fixtures/cassettes/set-preferences-relay.yml +11 -11
  51. data/spec/fixtures/cassettes/set-preferences-tracker.yml +11 -11
  52. data/spec/fixtures/cassettes/view-folders.yml +3 -3
  53. data/spec/spec_helper.rb +7 -8
  54. metadata +39 -4
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MjhjNjEyZWExZmE5ZjY5Mzg0ZGY0N2EzNDY2M2E0Yjc0OWMzNGRmMg==
4
+ Yzk2ZWQ3OTY5NDA5NzVhMDgxOWY3NWU3NDVjNmMwZDE5OWE4NzRiOA==
5
5
  data.tar.gz: !binary |-
6
- MzBiMGJiMTlhYmM4N2ZlZmYyNmE1ZjU3NThiZmRiYjRjNzU3NDU4MA==
6
+ OGUzNjQyNmM5OGJlMDc0N2NhNjQ3MmY2YzI4OTNmN2M1YTE5YzQ2Nw==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- MjRhZDhhZWQzMGQ1MGRkMDgwNDAyMThiYzc4NGJiMDYwNzdmZDY0ZGJjOTdj
10
- NWU1NWM3NTVhYzI3N2IzNmVjODhkZGRmNzMyMWI1MzU3ZjA0MTU3MDc3ZWFh
11
- ZjdhNDdlZGU2YjFjOWJkYzE2MDA3ODhkMGQxYmE3YzAzMDkwZTk=
9
+ MWNhNzgzZTJlYjZkYmMwMjEwZjk1OWExZjg0NTc1MDE0Y2MwYjM4ZjJkN2Mx
10
+ NDVmNjE5ZWUxMTEyZWQ3MTk2YjkyNWYyNGYxYTI4YWNhZGQ2NzRkMzU1ZmFj
11
+ YzRhYWI1YzNiYzFhMmUwMDBiZjJjZWRiZmI3YzAwOWFlZGQyZTY=
12
12
  data.tar.gz: !binary |-
13
- YTRhZjQ1OTVhZjhkYjQ4YWRlOTVhMDY2NjlmN2FhMTg2YTUwOWFjNGIzNTJh
14
- ODlmNzA3MmJhMGFlOGFlZWVkNmQ1NzEzM2U4NzAxOGU4NmJjNDdiMDlhNmMx
15
- NTQxNTEyY2ZlOGFiY2RhMzllMjAwOTRmNmI4ZTQwZGU4MTk2ZjQ=
13
+ NTA5NTdmNDg0M2QwYTZjNTYyNjMxMWMzNmJkZGY0MzNlMDFlZGU1N2M4ZWEz
14
+ ZDM4ZjRhNzA0ZTI4Y2VmM2M3MDY5ODA1YWZiOTU4MGZkMDA3YzU1NmM2YjFj
15
+ ZjUxZDllZTE0ZGJlZTcwNDNjNDcxYWQ5ODAwY2E3YmFiODcxMDg=
@@ -0,0 +1,3 @@
1
+ AllCops:
2
+ Excludes:
3
+ - cookbooks/**
@@ -1,10 +1,10 @@
1
1
  language: ruby
2
2
  rvm:
3
- - "1.8.7"
4
3
  - "1.9.2"
5
4
  - "1.9.3"
6
5
  - "2.0.0"
7
6
  # uncomment this line if your project needs to run something other than `rake`:
8
- script: bundle exec rspec spec
7
+ script:
8
+ - bundle exec rspec spec
9
9
  notifications:
10
10
  email: false
data/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/ChrisMacNaughton/BtSync.png?branch=master)](https://travis-ci.org/ChrisMacNaughton/BtSync)
4
4
  [![Code Climate](https://codeclimate.com/github/ChrisMacNaughton/BtSync.png)](https://codeclimate.com/github/ChrisMacNaughton/BtSync)
5
+ [![Coverage Status](https://coveralls.io/repos/ChrisMacNaughton/BtSync/badge.png)](https://coveralls.io/r/ChrisMacNaughton/BtSync)
5
6
 
6
7
  BtSync is a library to help you interact with Bittorrent Sync in Ruby
7
8
 
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "rspec"
24
24
  spec.add_development_dependency "webmock"
25
25
  spec.add_development_dependency "vcr"
26
+ spec.add_development_dependency "coveralls"
26
27
 
27
28
  spec.add_runtime_dependency "httparty"
28
29
  spec.add_runtime_dependency "json"
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require 'httparty'
2
3
  lib = File.expand_path('../btsync', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
@@ -8,80 +9,96 @@ require 'directory'
8
9
  class BtSync
9
10
  include BtCommunicator
10
11
  include HTTParty
11
- default_params :output => 'json'
12
- def initialize options = {}
13
- @opts = {
14
- :protocol => "http",
15
- :uri => "localhost",
16
- :port => "8888",
17
- :user => "admin",
18
- :password => "AdminPassword"}
19
- @opts.merge!(options.symbolize)
20
- @opts[:uri].gsub!(/^(https?:\/\/){1,}/i, '')
21
- @port = @opts[:port]
22
- @user = @opts[:user]
23
- @pass = @opts[:password]
12
+ default_params output: 'json'
13
+ def initialize(options = {})
14
+ @opts = setup_opts(options)
24
15
  @errors = []
25
16
  @token_cache = 0
26
17
  end
18
+
27
19
  def errors
28
20
  errors = @errors
29
21
  @errors = []
30
22
  errors
31
23
  end
24
+
32
25
  def folders
33
- f = get_folder_list["folders"]
26
+ f = get_folder_list['folders']
34
27
  folders = []
35
28
  f.each do |folder|
36
- folders << Directory.new(folder["name"], folder["secret"], self)
29
+ folders << Directory.new(folder['name'], folder['secret'], self)
37
30
  end
38
31
  folders
39
32
  end
33
+
40
34
  def upload_limit
41
- get_settings["ulrate"].to_i
35
+ get_settings['ulrate'].to_i
42
36
  end
37
+
43
38
  def download_limit
44
- get_settings["dlrate"].to_i
39
+ get_settings['dlrate'].to_i
45
40
  end
41
+
46
42
  def device_name
47
- get_settings["devicename"]
43
+ get_settings['devicename']
48
44
  end
45
+
49
46
  def listening_port
50
- get_settings["listeningport"].to_i
47
+ get_settings['listeningport'].to_i
51
48
  end
52
- def upload_limit= opt
53
- change_setting "ulrate", opt
49
+
50
+ def upload_limit=(opt)
51
+ change_setting 'ulrate', opt
54
52
  end
55
- def download_limit= opt
56
- change_setting "dlrate", opt
53
+
54
+ def download_limit=(opt)
55
+ change_setting 'dlrate', opt
57
56
  end
58
- def device_name= opt
59
- change_setting "devicename", opt
57
+
58
+ def device_name=(opt)
59
+ change_setting 'devicename', opt
60
60
  end
61
- def listening_port= opt
62
- change_setting "listeningport", opt
61
+
62
+ def listening_port=(opt)
63
+ change_setting 'listeningport', opt
63
64
  end
64
- def change_setting type, opt
65
- options = get_settings.merge!({type => opt})
66
65
 
67
- res = get(path('setsettings'), :query => options)
66
+ def change_setting(type, opt)
67
+ options = get_settings.merge!({ type => opt })
68
+
69
+ get(path('setsettings'), query: options)
68
70
  end
71
+
69
72
  def get_speed
70
- s = get_folder_list["speed"].split(", ")
71
- up = s[0].split(" ")
72
- down = s[1].split(" ")
73
- {:up => {:speed => up[0], :metric => up[1]}, :down => {:speed => down[0], :metric => down[1]}}
73
+ {
74
+ up: up,
75
+ down: down
76
+ }
77
+ end
78
+
79
+ def up
80
+ l = get_folder_list['speed'].split(', ')[0].split(' ')
81
+ {speed: l[0].to_f, metric: l[1]}
82
+ end
83
+
84
+ def down
85
+ l = get_folder_list['speed'].split(', ')[1].split(' ')
86
+ {speed: l[0].to_f, metric: l[1]}
74
87
  end
75
- def remove_folder folder_name, my_secret = nil
88
+
89
+ def remove_folder(folder_name, my_secret = nil)
76
90
  my_secret ||= secret(folder_name)
77
- res = get(path('removefolder'), :query => { :name => folder_name, :secret => my_secret})
91
+ query = { name: folder_name, secret: my_secret }
92
+ get(path('removefolder'), query: query)
78
93
  true
79
94
  end
80
- def add_folder folder_name, my_secret = nil
95
+
96
+ def add_folder(folder_name, my_secret = nil)
81
97
  my_secret ||= generate_secret
82
- res = get(path('addsyncfolder'), :query => { :name => folder_name, :secret => my_secret})
83
- unless res["error"] == 0
84
- @errors << res["message"]
98
+ query = { name: folder_name, secret: my_secret }
99
+ res = get(path('addsyncfolder'), query: query)
100
+ unless res['error'] == 0
101
+ @errors << res['message']
85
102
  return false
86
103
  end
87
104
  Directory.new(folder_name, my_secret, self)
@@ -89,32 +106,55 @@ class BtSync
89
106
 
90
107
  def get_settings
91
108
  res = get(path('getsettings'))
92
- res.parsed_response["settings"]
109
+ res.parsed_response['settings']
93
110
  end
111
+
94
112
  def get_os_type
95
113
  res = get(path('getostype'))
96
- res.parsed_response["os"]
114
+ res.parsed_response['os']
97
115
  end
116
+
98
117
  def get_version
99
118
  res = get(path('getversion'))
100
- res.parsed_response["version"]
119
+ res.parsed_response['version']
101
120
  end
121
+
102
122
  def check_new_version
103
123
  res = get(path('checknewversion'))
104
- res.parsed_response["version"]
124
+ res.parsed_response['version']
105
125
  end
106
126
 
107
- def get_dir with_dir = "/"
108
- res = get(path('getdir'), :query => {"dir" => with_dir})
109
- res.parsed_response["folders"].map{|f| f.gsub!('//', '/')}
127
+ def get_dir(with_dir = '/')
128
+ res = get(path('getdir'), query: { 'dir' => with_dir })
129
+ res.parsed_response['folders'].map { |f| f.gsub!('//', '/') }
110
130
  end
111
131
 
112
- def secret with_dir
113
- f = folders.select{|folder| folder.name == with_dir}.first
132
+ def secret(with_dir)
133
+ f = folders.select { |folder| folder.name == with_dir }.first
114
134
  f.secret
115
135
  end
136
+
116
137
  private
117
138
 
139
+ def setup_opts(opts)
140
+ opt = defaults.merge!(opts.symbolize)
141
+ opt[:uri].gsub!(%r(^(https?://){1,})i, '')
142
+ @port = opt[:port]
143
+ @user = opt[:user]
144
+ @pass = opt[:password]
145
+ opt
146
+ end
147
+
148
+ def defaults
149
+ {
150
+ protocol: 'http',
151
+ uri: 'localhost',
152
+ port: '8888',
153
+ user: 'admin',
154
+ password: 'AdminPassword'
155
+ }
156
+ end
157
+
118
158
  def get_folder_list
119
159
  res = get(path('getsyncfolders'))
120
160
  @folder_list = res.parsed_response
@@ -123,7 +163,7 @@ end
123
163
  class Hash
124
164
  def symbolize
125
165
  r = {}
126
- self.each do |k,v|
166
+ self.each do |k, v|
127
167
  if k.is_a? String
128
168
  r[k.to_symbol] = v
129
169
  else
@@ -1,68 +1,89 @@
1
+ # encoding: utf-8
1
2
  module BtCommunicator
2
3
  include HTTParty
4
+ attr_reader :opts
3
5
  disable_rails_query_string_format
4
- default_params :output => 'json'
6
+ default_params output: 'json'
5
7
  def generate_secret
6
8
  res = get(path('generatesecret'))
7
- res.parsed_response["secret"]
9
+ res.parsed_response['secret']
8
10
  end
11
+
9
12
  def port
10
13
  @opts[:port]
11
14
  end
15
+
12
16
  def uri
13
17
  @opts[:uri]
14
18
  end
19
+
15
20
  def protocol
16
21
  @opts[:protocol]
17
22
  end
23
+
18
24
  def user
19
25
  @opts[:user]
20
26
  end
27
+
21
28
  def password
22
29
  @opts[:password]
23
30
  end
24
- def communication_options
25
- @opts
26
- end
31
+
27
32
  def auth
28
- {:username => user, :password => password}
33
+ { username: user, password: password }
29
34
  end
30
- def token force = false
35
+
36
+ def token(force = false)
31
37
  @token_cache ||= 0
32
- time = DateTime.now.strftime("%s").to_i
38
+ time = DateTime.now.strftime('%s').to_i
33
39
  if time > @token_cache + 600 || force
34
- @token = request_token(force).gsub('</div></html>', '').gsub("<html><div id='token' style='display:none;'>", '')
40
+ @token = request_token(force).
41
+ gsub('</div></html>', '').
42
+ gsub("<html><div id='token' style='display:none;'>", '')
35
43
  @token_cache = time
36
44
  end
37
45
  @cookies = nil if force
38
46
  @token
39
47
  end
48
+
40
49
  def cookies
41
- @cookies ||= request_token.headers["set-cookie"].split("; ")[0]
50
+ @cookies ||= request_token.headers['set-cookie'].split('; ')[0]
42
51
  end
52
+
43
53
  def root_url
44
54
  "#{starter}#{uri}:#{port}/"
45
55
  end
46
56
 
47
- def get path, opts = {}
48
- opts = {:headers=>{"Cookie" => cookies}, :query => {}, :basic_auth => auth}.merge(opts)
57
+ def get(path, opts = {})
58
+ opts = {
59
+ headers: {
60
+ 'Cookie' => cookies
61
+ }, query: {
62
+
63
+ }, basic_auth: auth }.merge(opts)
49
64
  self.class.get(path, opts)
50
65
  end
51
66
 
52
- def request_token force = false
67
+ def request_token(force = false)
53
68
  @last_request ||= 0
54
69
  t = DateTime.now.strftime('%s').to_i
55
70
  if @request_token.nil? || force || (@last_request + 600) < t
56
71
  @last_request = t
57
- @request_token = self.class.get("#{root_url}gui/token.html", :basic_auth => auth)
72
+ @request_token = self.class.get(token_path, basic_auth: auth)
58
73
  else
59
74
  @request_token
60
75
  end
61
76
  end
77
+
78
+ def token_path
79
+ "#{root_url}gui/token.html"
80
+ end
81
+
62
82
  def starter
63
83
  "#{protocol}://"
64
84
  end
65
- def path action_name
85
+
86
+ def path(action_name)
66
87
  "#{root_url}gui/?token=#{token}&action=#{action_name}"
67
88
  end
68
89
  end
@@ -1,15 +1,16 @@
1
+ # encoding: utf-8
1
2
  class BtSync
2
3
  class Directory
3
4
  include HTTParty
4
5
  include BtCommunicator
5
- default_params :output => 'json'
6
- attr_reader :secret, :name
6
+ default_params output: 'json'
7
+ attr_reader :secret, :name, :errors
7
8
 
8
- def initialize name, secret, btsync
9
+ def initialize(name, secret, btsync)
9
10
  @name = name
10
11
  @secret = secret
11
12
 
12
- @opts = btsync.communication_options
13
+ @opts = btsync.opts
13
14
 
14
15
  find_or_create
15
16
 
@@ -17,105 +18,149 @@ class BtSync
17
18
  end
18
19
 
19
20
  def destroy
20
- get(path('removefolder'), :query => { :name => name, :secret => secret} )
21
- self.instance_variables.each{|v| v = nil}
21
+ get(path('removefolder'), query: { name: name, secret: secret })
22
+ self.instance_variables.each { |v| v = nil }
22
23
  end
23
- def update_secret new_secret = nil
24
- new_secret ||= generate_secret
25
- res = get(path('updatesecret'), :query => { :name => @name, :secret => @secret, :newsecret => new_secret} )
26
- if res.parsed_response != "{}" && res.parsed_response != '\r\ninvalid request'
24
+
25
+ def update_secret(new_secret = generate_secret)
26
+ query = secret_params(new_secret)
27
+ res = get(path('updatesecret'), query: query)
28
+ p = res.parsed_response
29
+ if p != {} && p != '\r\ninvalid request'
27
30
  @secret = new_secret
28
31
  true
29
32
  else
30
- @errors << res.parsed_response
33
+ if p == {}
34
+ @errors << "Invalid Secret"
35
+ else
36
+ @errors << res.parsed_response
37
+ end
31
38
  false
32
39
  end
33
40
  end
41
+
34
42
  def folders
35
- res = get(path('getdir'), :query => {:dir => @name})
36
- res.parsed_response["folders"]
43
+ res = get(path('getdir'), query: { dir: @name })
44
+ res.parsed_response['folders']
37
45
  end
46
+
38
47
  def peers
39
- res = get(path('getsyncfolders') )
40
- f = res.parsed_response["folders"].select{|f| f["name"] == name}.first
41
- f["peers"]
48
+ res = get(path('getsyncfolders'))
49
+ r = res.parsed_response['folders'].select { |f| f['name'] == name }.first
50
+ r['peers']
42
51
  end
52
+
43
53
  def known_hosts
44
- res = get(path('getknownhosts'), :query => {:name => name, :secret => secret})
54
+ query = { name: name, secret: secret }
55
+ res = get(path('getknownhosts'), query: query)
45
56
  hosts = {}
46
- res["hosts"].map{|h| hosts[h["index"]] = h["peer"]}
57
+ res['hosts'].map { |h| hosts[h['index']] = h['peer'] }
47
58
  hosts
48
59
  end
49
- def add_host host, port
50
- res = get(path('addknownhosts'), :query =>{:name => name, :secret => secret, :addr =>host, :port => port} )
60
+
61
+ def add_host(host, port)
62
+ query = { name: name, secret: secret, addr: host, port: port }
63
+ get(path('addknownhosts'), query: query)
51
64
  true
52
65
  end
53
- def remove_host index
54
- res = get(path('removeknownhosts'), :query =>{:name => name, :secret => secret, :index => index} )
66
+
67
+ def remove_host(index)
68
+ query = { name: name, secret: secret, index: index }
69
+ res = get(path('removeknownhosts'), query: query)
55
70
  if res.parsed_response != {}
56
71
  res.parsed_response
57
72
  else
58
73
  true
59
74
  end
60
75
  end
61
- def remove_host_by_ip ip, port = nil
62
- @hosts = known_hosts
76
+
77
+ def remove_host_by_ip(ip, port = nil)
78
+ known_hosts.each do |id, host|
79
+ host = host.split(':')
80
+ if ip == host[0]
81
+ next if port != host[1] unless port.nil?
82
+
83
+ remove_host(id)
84
+ end
85
+ end
63
86
  end
87
+
64
88
  def use_tracker=(opt)
65
89
  set_pref('usetracker', opt)
66
90
  end
91
+
67
92
  def use_tracker?
68
- bool(preferences["usetracker"])
93
+ bool(preferences['usetracker'])
69
94
  end
95
+
70
96
  def use_hosts=(opt)
71
97
  set_pref('usehosts', opt)
72
98
  end
99
+
73
100
  def use_hosts?
74
- bool(preferences["usehosts"])
101
+ bool(preferences['usehosts'])
75
102
  end
103
+
76
104
  def search_lan=(opt)
77
105
  set_pref('searchlan', opt)
78
106
  end
107
+
79
108
  def search_lan?
80
- bool(preferences["searchlan"])
109
+ bool(preferences['searchlan'])
81
110
  end
111
+
82
112
  def search_dht=(opt)
83
113
  set_pref('searchdht', opt)
84
114
  end
115
+
85
116
  def search_dht?
86
- bool(preferences["searchdht"])
117
+ bool(preferences['searchdht'])
87
118
  end
119
+
88
120
  def use_relay=(opt)
89
121
  set_pref('relay', opt)
90
122
  end
123
+
91
124
  def use_relay?
92
- bool(preferences["relay"])
125
+ bool(preferences['relay'])
93
126
  end
127
+
94
128
  def delete_to_trash=(opt)
95
129
  set_pref('deletetotrash', opt)
96
130
  end
131
+
97
132
  def delete_to_trash?
98
- bool(preferences["deletetotrash"])
133
+ bool(preferences['deletetotrash'])
99
134
  end
100
- def is_writable? with_dir
101
- bool(preferences["iswritable"])
135
+
136
+ def is_writable?
137
+ bool(preferences['iswritable'])
102
138
  end
139
+
103
140
  def preferences
104
- res = get(path('getfolderpref'), :query => { :name => @name, :secret => @secret})
105
- res.parsed_response["folderpref"]
141
+ res = get(path('getfolderpref'), query: { name: @name, secret: @secret })
142
+ res.parsed_response['folderpref']
106
143
  end
144
+
107
145
  def read_only_secret
108
- preferences["readonlysecret"]
146
+ preferences['readonlysecret']
109
147
  end
148
+
110
149
  private
111
- def set_pref pref, opt
112
- res = get(path('setfolderpref'), :query => make_opts(pref, opt) )
150
+
151
+ def set_pref(pref, opt)
152
+ get(path('setfolderpref'), query: make_opts(pref, opt))
113
153
  true
114
154
  end
155
+
115
156
  def default_settings
116
- opts = {
117
- 'name'=>@name,
118
- 'secret'=>@secret,
157
+ get(path('setfolderpref'), query: defaults)
158
+ end
159
+
160
+ def defaults
161
+ {
162
+ 'name' => @name,
163
+ 'secret' => @secret,
119
164
  'relay' => 1,
120
165
  'usetracker' => 1,
121
166
  'searchlan' => 1,
@@ -123,37 +168,47 @@ class BtSync
123
168
  'deletetotrash' => 1,
124
169
  'usehosts' => 1
125
170
  }
126
- get(path('setfolderpref'), :query => opts )
127
171
  end
128
- def make_opts name, opt
172
+
173
+ def make_opts(name, opt)
129
174
  opts = preferences
130
175
  opts[name] = bool_to_i(opt)
131
176
  opts.delete('readonlysecret')
132
- opts.merge!({:name => @name, :secret => @secret})
177
+ opts.merge!({ name: @name, secret: @secret })
133
178
  end
134
- def bool i
179
+
180
+ def secret_params(s)
181
+ {
182
+ name: @name,
183
+ secret: @secret,
184
+ newsecret: s
185
+ }
186
+ end
187
+
188
+ def bool(i)
189
+ i = i.to_i
135
190
  if i == 0
136
191
  false
137
- elsif i == 1
138
- true
139
192
  else
140
- i
193
+ true
141
194
  end
142
195
  end
143
- def bool_to_i bool
196
+
197
+ def bool_to_i(bool)
144
198
  if bool
145
199
  1
146
200
  else
147
201
  0
148
202
  end
149
203
  end
204
+
150
205
  def find_or_create
151
206
  res = get(path('getsyncfolders'))
152
- folder_list = res.parsed_response["folders"]
153
- if folder_list.map{|f| f["name"]}.include? name
207
+ folder_list = res.parsed_response['folders']
208
+ if folder_list.map { |f| f['name'] }.include? name
154
209
  true
155
210
  else
156
- res = get(path('addsyncfolder'), :query => { :name => name, :secret => secret})
211
+ res = get(path('addsyncfolder'), query: { name: name, secret: secret })
157
212
  end
158
213
  end
159
214
  end