BtSync 0.2.1 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ODYwZWQyNTQ5MmY5ZTk0MWU3YWM1MTYwYmM0ZjVkNjY0MDI1MTUxZg==
4
+ ZjkwYWYyMzIyODEwNjViYmE3MDNhZTBkM2JkNjU5Zjk1YWMzMzdmMg==
5
5
  data.tar.gz: !binary |-
6
- ZmRkODRiNDAxMGZiN2Q5N2UyNTk2NjFiNTExN2Q0ZDIwNGNjMTkxYw==
6
+ NTBlZDBlMDk4N2EyZjc3N2E2MzdmNDJlYTRlODBmMGZlNDc1ZGMzNw==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NWQ3ZjcxZDc0NWFmODBiYjYwYmQzNmM3N2M2NGIxZGYyODc4OTcxYjNjZjI0
10
- MWE5Y2E5NmY2ZTNhMjNhNjRkNzc4NmM1OTUyYTBhYTU0ZjUzZjM0NWFmMGIw
11
- NjQwY2Q2NDE5ZDVlNDI2ZTNmMThjNDJjYTNmNWMzN2NiY2E1OWY=
9
+ NDNjNDUzYmYyNjBhZTczYWY5NTQ4YWVhM2UxYzBhNmRkNmEyNTVkY2UzYmMx
10
+ ZDMyMzk2ZGNkOTYxYTRkYzNjODQ4ODc3NTU5NzIyMmRkMzZmZWZhYTY5MGQ3
11
+ OGFhMjZmODQzZGQzMWVjM2Q1MmYzNTg0MWZiMTBhYTVhMmQ5OTQ=
12
12
  data.tar.gz: !binary |-
13
- OTFjNjFmNmJjNmY5MmJhZmM1ODMwMTkzYTllODhlZmQyMjZlYmJkNzhlMGRj
14
- ZTY4OWViODMyNzNmMTdlMDQ0MzlmY2EwYjI2NzI1ZTcyNmZmZmUzMTE0YTcx
15
- OGMwZjQxM2YyNDcwNWUzOGJkNTVmOTJlNGZmZWUzM2IwNjBiNDg=
13
+ YWEyZDNjNjIzYWFkZWQxNTE1NTU5NTEyMDFmYTgzMjIwNzVmYjYxODM4Yzgz
14
+ M2RlZGVkYjM4YzA4ZWQ0OTdmYzEyZjNhNzYwMWYzOWFlMDY1YmIxZWNkMDk3
15
+ MjU0YTNjNjNiMmU4NTQzMjkzZDQwODA5Y2Q1ZjZiMzAxOTI2YzA=
@@ -1,9 +1,14 @@
1
1
  require 'httparty'
2
+ lib = File.expand_path('../btsync', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ require 'communicator'
2
6
 
3
7
  class BtSync
8
+ include BtCommunicator
4
9
  include HTTParty
5
10
  default_params :output => 'json'
6
- debug_output
11
+
7
12
  def initialize uri=nil, port=nil
8
13
  @uri = uri
9
14
  @port = port
@@ -16,7 +21,12 @@ class BtSync
16
21
  errors
17
22
  end
18
23
  def get_folders
19
- get_folder_list["folders"]
24
+ f = get_folder_list["folders"]
25
+ folders = []
26
+ f.each do |folder|
27
+ folders << Directory.new(folder["name"], folder["secret"])
28
+ end
29
+ folders
20
30
  end
21
31
  def get_speed
22
32
  s = get_folder_list["speed"].split(", ")
@@ -27,7 +37,6 @@ class BtSync
27
37
  def remove_folder folder_name, my_secret = nil
28
38
  my_secret ||= secret(folder_name)
29
39
  res = self.class.get(path('removefolder'), :query => { :name => folder_name, :secret => my_secret}, :headers => {"Cookie" => cookies})
30
- token(true)
31
40
  true
32
41
  end
33
42
  def add_folder folder_name, my_secret = nil
@@ -37,64 +46,9 @@ class BtSync
37
46
  @errors << res["message"]
38
47
  return false
39
48
  end
40
- token(true)
41
- true
42
- end
43
- def update_secret with_dir, new_secret = nil, my_secret = nil
44
- my_secret ||= secret(with_dir)
45
- new_secret ||= generate_secret
46
- self.class.get(path('updatesecret'), :query => { :name => with_dir, :secret => my_secret, :newsecret => new_secret}, :headers => {"Cookie" => cookies})
47
- true
48
- end
49
- def use_tracker with_dir, opt = true
50
- res = self.class.get(path('setfolderpref'), query: make_opts(with_dir, 'usetracker', opt), :headers => {"Cookie" => cookies })
51
- true
52
- end
53
- def use_tracker? with_dir
54
- bool(get_folder_preferences(with_dir)["usetracker"])
55
- end
56
- def use_hosts with_dir, opt = false
57
- res = self.class.get(path('setfolderpref'), query: make_opts(with_dir, 'usehosts', opt), :headers => {"Cookie" => cookies })
58
- true
59
- end
60
- def use_hosts? with_dir
61
- bool(get_folder_preferences(with_dir)["usehosts"])
62
- end
63
- def search_lan with_dir, opt = true
64
- res = self.class.get(path('setfolderpref'), query: make_opts(with_dir, 'searchlan', opt), :headers => {"Cookie" => cookies })
65
- true
66
- end
67
- def search_lan? with_dir
68
- bool(get_folder_preferences(with_dir)["searchlan"])
69
- end
70
- def search_dht with_dir, opt = false
71
- res = self.class.get(path('setfolderpref'), query: make_opts(with_dir, 'searchdht', opt), :headers => {"Cookie" => cookies })
72
- true
73
- end
74
- def search_dht? with_dir
75
- bool(get_folder_preferences(with_dir)["searchdht"])
76
- end
77
- def use_relay with_dir, opt = true
78
- res = self.class.get(path('setfolderpref'), query: make_opts(with_dir, 'relay', opt), :headers => {"Cookie" => cookies })
79
- true
80
- end
81
- def use_relay? with_dir
82
- bool(get_folder_preferences(with_dir)["relay"])
83
- end
84
- def delete_to_trash with_dir, opt = true
85
- res = self.class.get(path('setfolderpref'), query: make_opts(with_dir, 'deletetotrash', opt), :headers => {"Cookie" => cookies })
86
49
  true
87
50
  end
88
- def delete_to_trash? with_dir
89
- bool(get_folder_preferences(with_dir)["deletetotrash"])
90
- end
91
- def is_writable? with_dir
92
- bool(get_folder_preferences(with_dir)["iswritable"])
93
- end
94
- def generate_secret
95
- res = self.class.get(path('generatesecret'), :headers => {"Cookie" => cookies })
96
- res.parsed_response["secret"]
97
- end
51
+
98
52
  def get_settings
99
53
  res = self.class.get(path('getsettings'), :headers => {"Cookie" => cookies })
100
54
  res.parsed_response["settings"]
@@ -111,11 +65,7 @@ class BtSync
111
65
  res = self.class.get(path('checknewversion'), :headers => {"Cookie" => cookies })
112
66
  res.parsed_response["version"]
113
67
  end
114
- def get_folder_preferences folder_name, my_secret = nil
115
- my_secret ||= secret(folder_name)
116
- res = self.class.get(path('getfolderpref'), :query => { :name => folder_name, :secret => my_secret}, :headers => {"Cookie" => cookies})
117
- res.parsed_response["folderpref"]
118
- end
68
+
119
69
  def get_dir with_dir
120
70
  res = self.class.get(path('getdir'), :query => {:dir => with_dir}, :headers => {"Cookie" => cookies })
121
71
  res.parsed_response["folders"]
@@ -126,67 +76,114 @@ class BtSync
126
76
  res["hosts"]
127
77
  end
128
78
  def secret with_dir
129
- f = get_folders.select{|folder| folder["name"] == with_dir}.first
130
- f["secret"]
131
- end
132
- def get_read_only_secret with_dir, my_secret = nil
133
- my_secret ||= secret(with_dir)
134
- get_folder_preferences(with_dir, my_secret)["readonlysecret"]
79
+ f = get_folders.select{|folder| folder.name == with_dir}.first
80
+ f.secret
135
81
  end
136
82
  private
137
- def make_opts with_dir, name, opt
138
- opts = get_folder_preferences(with_dir)
139
- opts[name] = bool_to_i(opt)
140
- opts.delete('readonlysecret')
141
- opts.merge!({:name => with_dir, :secret => secret(with_dir)})
142
- end
143
- def bool i
144
- if i == 0
145
- false
146
- elsif i == 1
147
- true
148
- else
149
- i
150
- end
151
- end
152
- def bool_to_i bool
153
- if bool
154
- 1
155
- else
156
- 0
157
- end
158
- end
83
+
159
84
  def get_folder_list
160
85
  res = self.class.get(path('getsyncfolders'), :headers => {"Cookie" => cookies })
161
86
  @folder_list = res.parsed_response
162
87
  end
163
88
 
164
- def port
165
- @port ||= '8888'
166
- end
167
- def uri
168
- @uri ||= "http://localhost"
169
- end
170
- def token force = false
171
- time = DateTime.now.strftime("%s").to_i
172
- if time > @token_cache + 600 || force
173
- @token = request_token(force).gsub('</div></html>', '').gsub("<html><div id='token' style='display:none;'>", '')
174
- @token_cache = time
175
- end
176
- @cookies = nil if force
177
- @token
178
- end
179
- def cookies
180
- @cookies ||= request_token.headers["set-cookie"].split("; ")[0]
181
- end
182
- def request_token force = false
183
- if @request_token.nil? || force
184
- @request_token = self.class.get("#{uri}:#{port}/gui/token.html", :query => {:output => :text})
185
- else
186
- @request_token
89
+ class Directory
90
+ include HTTParty
91
+ include BtCommunicator
92
+ default_params :output => 'json'
93
+
94
+ attr_reader :secret, :name
95
+
96
+ def initialize name, secret
97
+ @name = name
98
+ @secret = secret
99
+ @errors = []
100
+ end
101
+
102
+ def update_secret new_secret = nil
103
+ new_secret ||= generate_secret
104
+ res = self.class.get(path('updatesecret'), :query => { :name => @name, :secret => @secret, :newsecret => new_secret}, :headers => {"Cookie" => cookies})
105
+ if res.parsed_response != "{}" && res.parsed_response != '\r\ninvalid request'
106
+ @secret = new_secret
107
+ true
108
+ else
109
+ @errors << res.parsed_response
110
+ false
111
+ end
112
+ end
113
+ def use_tracker=(opt)
114
+ res = self.class.get(path('setfolderpref'), query: make_opts('usetracker', opt), :headers => {"Cookie" => cookies })
115
+ true
116
+ end
117
+ def use_tracker?
118
+ bool(preferences["usetracker"])
119
+ end
120
+ def use_hosts=(opt)
121
+ res = self.class.get(path('setfolderpref'), query: make_opts('usehosts', opt), :headers => {"Cookie" => cookies })
122
+ true
123
+ end
124
+ def use_hosts?
125
+ bool(preferences["usehosts"])
126
+ end
127
+ def search_lan=(opt)
128
+ res = self.class.get(path('setfolderpref'), query: make_opts('searchlan', opt), :headers => {"Cookie" => cookies })
129
+ true
130
+ end
131
+ def search_lan?
132
+ bool(preferences["searchlan"])
133
+ end
134
+ def search_dht=(opt)
135
+ res = self.class.get(path('setfolderpref'), query: make_opts('searchdht', opt), :headers => {"Cookie" => cookies })
136
+ true
137
+ end
138
+ def search_dht?
139
+ bool(preferences["searchdht"])
140
+ end
141
+ def use_relay=(opt)
142
+ res = self.class.get(path('setfolderpref'), query: make_opts('relay', opt), :headers => {"Cookie" => cookies })
143
+ true
144
+ end
145
+ def use_relay?
146
+ bool(preferences["relay"])
147
+ end
148
+ def delete_to_trash=(opt)
149
+ res = self.class.get(path('setfolderpref'), query: make_opts('deletetotrash', opt), :headers => {"Cookie" => cookies })
150
+ true
151
+ end
152
+ def delete_to_trash?
153
+ bool(preferences["deletetotrash"])
154
+ end
155
+ def is_writable? with_dir
156
+ bool(preferences["iswritable"])
157
+ end
158
+ def preferences
159
+ res = self.class.get(path('getfolderpref'), :query => { :name => @name, :secret => @secret}, :headers => {"Cookie" => cookies})
160
+ res.parsed_response["folderpref"]
161
+ end
162
+ def read_only_secret
163
+ preferences["readonlysecret"]
164
+ end
165
+ private
166
+ def make_opts name, opt
167
+ opts = preferences
168
+ opts[name] = bool_to_i(opt)
169
+ opts.delete('readonlysecret')
170
+ opts.merge!({:name => @name, :secret => @secret})
171
+ end
172
+ def bool i
173
+ if i == 0
174
+ false
175
+ elsif i == 1
176
+ true
177
+ else
178
+ i
179
+ end
180
+ end
181
+ def bool_to_i bool
182
+ if bool
183
+ 1
184
+ else
185
+ 0
186
+ end
187
187
  end
188
- end
189
- def path action_name
190
- "#{uri}:#{port}/gui/?token=#{token}&action=#{action_name}"
191
188
  end
192
189
  end
@@ -0,0 +1,36 @@
1
+ module BtCommunicator
2
+ include HTTParty
3
+ def generate_secret
4
+ res = self.class.get(path('generatesecret'), :headers => {"Cookie" => cookies })
5
+ res.parsed_response["secret"]
6
+ end
7
+ def port
8
+ @port ||= '8888'
9
+ end
10
+ def uri
11
+ @uri ||= "http://localhost"
12
+ end
13
+ def token force = false
14
+ @token_cache ||= 0
15
+ time = DateTime.now.strftime("%s").to_i
16
+ if time > @token_cache + 600 || force
17
+ @token = request_token(force).gsub('</div></html>', '').gsub("<html><div id='token' style='display:none;'>", '')
18
+ @token_cache = time
19
+ end
20
+ @cookies = nil if force
21
+ @token
22
+ end
23
+ def cookies
24
+ @cookies ||= request_token.headers["set-cookie"].split("; ")[0]
25
+ end
26
+ def request_token force = false
27
+ if @request_token.nil? || force
28
+ @request_token = self.class.get("#{uri}:#{port}/gui/token.html", :query => {:output => :text})
29
+ else
30
+ @request_token
31
+ end
32
+ end
33
+ def path action_name
34
+ "#{uri}:#{port}/gui/?token=#{token}&action=#{action_name}"
35
+ end
36
+ end
@@ -1,3 +1,3 @@
1
1
  module BtsyncVersion
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -11,7 +11,7 @@ describe 'BtSync' do
11
11
  VCR.use_cassette("get-folders") do
12
12
  @folder = @bt.get_folders.first
13
13
  end
14
- @folder["name"].should == "/home/chris/Documents"
14
+ @folder.name.should == "/home/chris/Documents"
15
15
  end
16
16
  it "can view settings" do
17
17
  VCR.use_cassette("get-settings") do
@@ -40,7 +40,7 @@ describe 'BtSync' do
40
40
  folders = @bt.get_folders
41
41
  folders.count.should == 2
42
42
  folder = folders.last
43
- folder["name"].should == "/home/chris/bt_test"
43
+ folder.name.should == "/home/chris/bt_test"
44
44
  end
45
45
  VCR.use_cassette("remove-folder") do
46
46
  @bt.remove_folder '/home/chris/bt_test'
@@ -49,7 +49,7 @@ describe 'BtSync' do
49
49
  folders = @bt.get_folders
50
50
  folders.count.should == 1
51
51
  folder = folders.last
52
- folder["name"].should == "/home/chris/Documents"
52
+ folder.name.should == "/home/chris/Documents"
53
53
  end
54
54
  end
55
55
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: BtSync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris MacNaughton
@@ -111,6 +111,7 @@ files:
111
111
  - Rakefile
112
112
  - btsync.gemspec
113
113
  - lib/btsync.rb
114
+ - lib/btsync/communicator.rb
114
115
  - lib/btsync/version.rb
115
116
  - spec/BtSync/bt_sync_spec.rb
116
117
  - spec/fixtures/cassettes/add-folder-list.yml