BtSync 0.2.1 → 0.3.1

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