kp_folder 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -0
- data/Gemfile.lock +16 -0
- data/README.rdoc +16 -0
- data/Rakefile +9 -0
- data/bin/kf +44 -0
- data/kp_folder.gemspec +29 -0
- data/lib/kp_folder.rb +149 -0
- data/lib/kp_folder/config.rb +10 -0
- data/test/kp_folder/test_config.rb +11 -0
- data/test/test_client.rb +39 -0
- metadata +71 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
= kp_folder
|
2
|
+
|
3
|
+
kuaipan sync folders tool
|
4
|
+
To install then command tool:
|
5
|
+
|
6
|
+
gem install kp_folder
|
7
|
+
|
8
|
+
commands:
|
9
|
+
kp --help # help doc
|
10
|
+
kp -a yourfolder_absolute_path # add a folder to sync
|
11
|
+
kp -rm yourfolder_absolute_ath # remove a folder
|
12
|
+
kp -s # start sync all folders to kuaipan
|
13
|
+
kp -s ^\\..* # filter some files whose name start by '.'. You can give other regex str
|
14
|
+
kp -l # list all folders added
|
15
|
+
|
16
|
+
|
data/Rakefile
ADDED
data/bin/kf
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'kp_folder'
|
4
|
+
|
5
|
+
case ARGV.shift
|
6
|
+
when '-a'
|
7
|
+
arg1 = ARGV.shift if ARGV[0]
|
8
|
+
ARGV.clear
|
9
|
+
KpFolder.init
|
10
|
+
if arg1 && File.exist?(arg1) && File.directory?(arg1)
|
11
|
+
KpFolder.add(File.absolute_path(arg1)) # trip trailing '/'
|
12
|
+
end
|
13
|
+
when '-rm'
|
14
|
+
arg1 = ARGV.shift if ARGV[0]
|
15
|
+
ARGV.clear
|
16
|
+
KpFolder.init
|
17
|
+
if arg1 && File.exist?(arg1) && File.directory?(arg1)
|
18
|
+
KpFolder.remove(File.absolute_path(arg1)) # trip trailing '/'
|
19
|
+
end
|
20
|
+
when '-s'
|
21
|
+
arg1 = ARGV.shift if ARGV[0]
|
22
|
+
ARGV.clear
|
23
|
+
KpFolder.init
|
24
|
+
if arg1
|
25
|
+
KpFolder.start(:filter => arg1)
|
26
|
+
else
|
27
|
+
KpFolder.start
|
28
|
+
end
|
29
|
+
when '-l'
|
30
|
+
ARGV.clear
|
31
|
+
KpFolder.init
|
32
|
+
KpFolder.list
|
33
|
+
when '--help'
|
34
|
+
puts "kf -i : init firstly"
|
35
|
+
puts "kf -a folder : add a folder"
|
36
|
+
puts "kf -rm folder : remove a folder"
|
37
|
+
puts "kf -s : start to sync all folders"
|
38
|
+
puts "kf -l : list all folders which were added"
|
39
|
+
puts "a simple example, that will sync all files in folder '/home/tom/Documents':
|
40
|
+
1 kf -a /home/tom/Documents
|
41
|
+
2 kf -s"
|
42
|
+
else
|
43
|
+
puts 'wrong params!please refer to help:kf --help'
|
44
|
+
end
|
data/kp_folder.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'kp_folder'
|
3
|
+
s.version = '0.0.4'
|
4
|
+
s.executables << 'kf'
|
5
|
+
s.date = '2012-05-01'
|
6
|
+
s.summary = "kuaipan sync folder command tool"
|
7
|
+
s.description = "You can define folders which should be synced by 'kp' command."
|
8
|
+
s.authors = ["tiemei"]
|
9
|
+
s.email = 'jiadongkai@gmail.com'
|
10
|
+
s.files = [
|
11
|
+
"lib/kp_folder/config.rb",
|
12
|
+
"lib/kp_folder.rb",
|
13
|
+
"bin/kf",
|
14
|
+
"Gemfile",
|
15
|
+
"Gemfile.lock",
|
16
|
+
"README.rdoc",
|
17
|
+
"Rakefile",
|
18
|
+
"kp_folder.gemspec",
|
19
|
+
"test/kp_folder/test_config.rb",
|
20
|
+
"test/test_client.rb"
|
21
|
+
]
|
22
|
+
s.require_paths = ["lib"]
|
23
|
+
s.homepage = 'http://rubygems.org/gems/kp_folder'
|
24
|
+
s.required_ruby_version = '>= 1.9.3'
|
25
|
+
s.required_rubygems_version = ">= 1.3.6"
|
26
|
+
|
27
|
+
s.add_runtime_dependency 'kuaipan', '~> 0.0.3'
|
28
|
+
|
29
|
+
end
|
data/lib/kp_folder.rb
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
# conding: utf-8
|
2
|
+
require 'kuaipan'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
require 'set'
|
6
|
+
|
7
|
+
require 'kp_folder/config'
|
8
|
+
|
9
|
+
module KpFolder
|
10
|
+
extend Kuaipan::OpenAPI
|
11
|
+
class << self
|
12
|
+
attr_reader :k_session
|
13
|
+
end
|
14
|
+
def self.init
|
15
|
+
@oauth_result_file = "#{ Dir.home }/.kf_oauth_result.json"
|
16
|
+
input_config(Config.consumer_key, Config.consumer_secret)
|
17
|
+
@k_session = nil
|
18
|
+
if File.exist?(@oauth_result_file)
|
19
|
+
File.open(@oauth_result_file, 'r')do |f|
|
20
|
+
oauth_result = JSON.parse(f.read)
|
21
|
+
@k_session = g_session_skip_oauth(oauth_result['oauth_token'],
|
22
|
+
oauth_result['oauth_token_secret'],
|
23
|
+
oauth_result['user_id'])
|
24
|
+
end
|
25
|
+
else
|
26
|
+
@k_session = g_session
|
27
|
+
authorize_url = @k_session[:authorize_url]
|
28
|
+
puts 'please copy the url to your brower,then get number here:'
|
29
|
+
puts authorize_url
|
30
|
+
oauth_verifier = gets
|
31
|
+
oauth_result = @k_session.set_atoken oauth_verifier
|
32
|
+
File.open(@oauth_result_file, 'w+')do |f|
|
33
|
+
f.write(JSON.generate(oauth_result))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
@folders_file = "#{ Dir.home }/.kf_folders"
|
37
|
+
@db_file = "#{ Dir.home }/.kf_db"
|
38
|
+
File.open(@folders_file, 'w'){|f| f.write('[]')} unless File.exist?(@folders_file)
|
39
|
+
File.open(@db_file, 'w'){|f| f.write('{}')} unless File.exist?(@db_file)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.list
|
43
|
+
File.open(@folders_file, 'r')do |f|
|
44
|
+
arr = JSON.parse(f.read)
|
45
|
+
arr.each {|item| puts item}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.remove(folder)
|
50
|
+
arr = []
|
51
|
+
File.open(@folders_file, 'r')do |f|
|
52
|
+
arr = JSON.parse(f.read)
|
53
|
+
end
|
54
|
+
if arr.delete(folder)
|
55
|
+
File.open(@folders_file, 'w')do |f|
|
56
|
+
f.write(JSON.generate(arr))
|
57
|
+
end
|
58
|
+
puts "success!remove #{ folder }"
|
59
|
+
else
|
60
|
+
puts "failed to remove #{ folder }"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.add(folder)
|
65
|
+
arr = []
|
66
|
+
File.open(@folders_file, 'r')do |f|
|
67
|
+
arr = JSON.parse(f.read)
|
68
|
+
end
|
69
|
+
set = arr.to_set
|
70
|
+
set.add(folder)
|
71
|
+
File.open(@folders_file, 'w')do |f|
|
72
|
+
f.write(JSON.generate(set.to_a))
|
73
|
+
end
|
74
|
+
puts "success to add #{folder}"
|
75
|
+
end
|
76
|
+
|
77
|
+
# 1.upload local files that aren't in file '.db',and update .db
|
78
|
+
# 2.clear remote files
|
79
|
+
def self.start(opts={})
|
80
|
+
filter = Regexp.compile(filter) if (filter = opts.delete(:filter))
|
81
|
+
@local_files = []
|
82
|
+
File.open(@folders_file, 'r'){|f| @folders = JSON.parse(f.read)}
|
83
|
+
@folders.each do |folder|
|
84
|
+
files_in_folder(folder)
|
85
|
+
end
|
86
|
+
|
87
|
+
File.open(@db_file, 'r')do |f|
|
88
|
+
@db = JSON.parse(f.read)
|
89
|
+
end
|
90
|
+
@db_tmp = {}
|
91
|
+
@local_files.each do |file_name|
|
92
|
+
next if filter && (filter =~ File.basename(file_name))
|
93
|
+
m = %r{/.*/}.match(file_name)
|
94
|
+
file = File.open(file_name, 'rb')
|
95
|
+
if @db[file_name] == nil
|
96
|
+
puts "upload file: \t\t#{ file_name }"
|
97
|
+
k_session.upload_file(file, :path => m[0])
|
98
|
+
@db_tmp[file_name] = k_session.metadata(file_name)
|
99
|
+
elsif @db[file_name]['size'] != File.size(file_name)
|
100
|
+
k_session.delete(file_name)
|
101
|
+
puts "update file: \t\t#{ file_name }"
|
102
|
+
k_session.upload_file(file, :path => m[0])
|
103
|
+
@db_tmp[file_name] = k_session.metadata(file_name)
|
104
|
+
else
|
105
|
+
@db_tmp[file_name] = @db[file_name]
|
106
|
+
end
|
107
|
+
end
|
108
|
+
@db = @db_tmp
|
109
|
+
File.open(@db_file, 'w'){|f| f.write(JSON.generate(@db))}
|
110
|
+
|
111
|
+
@files_remote = {}
|
112
|
+
@folders.each do |folder|
|
113
|
+
check_folder(folder)
|
114
|
+
end
|
115
|
+
|
116
|
+
diff = @files_remote.select {|k,_| @db[k] == nil }
|
117
|
+
diff.each do |k,_|
|
118
|
+
k_session.delete(k)
|
119
|
+
puts "clear remote file: \t#{ k }"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
def self.files_in_folder(folder)
|
125
|
+
Dir.foreach(folder)do |name|
|
126
|
+
absolute_path = "#{ folder }/#{ name }"
|
127
|
+
@local_files << absolute_path if File.file?(absolute_path)
|
128
|
+
next if (name == '.' or name == '..')
|
129
|
+
files_in_folder(absolute_path) if File.directory?(absolute_path)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.check_folder(folder)
|
134
|
+
puts "check remote folder: \t#{ folder }"
|
135
|
+
begin
|
136
|
+
@k_session.metadata(folder)
|
137
|
+
rescue Kuaipan::NotFound => nf
|
138
|
+
@k_session.create_folder(folder)
|
139
|
+
ensure
|
140
|
+
hash = @k_session.metadata(folder)
|
141
|
+
files = hash['files']
|
142
|
+
files.each do |f|
|
143
|
+
@files_remote["#{ hash['path'] }/#{ f['name'] }"] = f if f['type'] == 'file'
|
144
|
+
check_folder("#{ hash['path'] }/#{ f['name'] }") if f['type'] == 'folder'
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
data/test/test_client.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# conding: utf-8
|
2
|
+
|
3
|
+
require 'kp_folder'
|
4
|
+
require 'test/unit'
|
5
|
+
require 'uri'
|
6
|
+
|
7
|
+
class KpFolderTest < Test::Unit::TestCase
|
8
|
+
def test_init
|
9
|
+
KpFolder.init
|
10
|
+
p KpFolder.k_session.metadata('/')
|
11
|
+
KpFolder.k_session.create_folder('/tiemei_test/')
|
12
|
+
p KpFolder.k_session.metadata('/tiemei_test')
|
13
|
+
p KpFolder.k_session.delete('/tiemei_test')
|
14
|
+
#KpFolder.k_session.metadata('/tiemei_test')
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_rm_add
|
18
|
+
KpFolder.add('/home/jdk')
|
19
|
+
KpFolder.add('/home/jdk/Desktop')
|
20
|
+
KpFolder.remove('/home/jdk/Desktop')
|
21
|
+
KpFolder.add('/home/jdk')
|
22
|
+
KpFolder.remove('/home/jdk')
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_files_in_folders
|
26
|
+
KpFolder.instance_eval do
|
27
|
+
@local_files = []
|
28
|
+
files_in_folder('/home/jdk/codespace/ruby_space/kp_folder/lib')
|
29
|
+
p @local_files
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_start
|
34
|
+
KpFolder.add('/home/jdk/codespace/ruby_space/kp_folder/lib')
|
35
|
+
KpFolder.start
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kp_folder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.4
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- tiemei
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-01 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: kuaipan
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.0.3
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.0.3
|
30
|
+
description: You can define folders which should be synced by 'kp' command.
|
31
|
+
email: jiadongkai@gmail.com
|
32
|
+
executables:
|
33
|
+
- kf
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- lib/kp_folder/config.rb
|
38
|
+
- lib/kp_folder.rb
|
39
|
+
- bin/kf
|
40
|
+
- Gemfile
|
41
|
+
- Gemfile.lock
|
42
|
+
- README.rdoc
|
43
|
+
- Rakefile
|
44
|
+
- kp_folder.gemspec
|
45
|
+
- test/kp_folder/test_config.rb
|
46
|
+
- test/test_client.rb
|
47
|
+
homepage: http://rubygems.org/gems/kp_folder
|
48
|
+
licenses: []
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options: []
|
51
|
+
require_paths:
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ! '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: 1.9.3
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 1.3.6
|
65
|
+
requirements: []
|
66
|
+
rubyforge_project:
|
67
|
+
rubygems_version: 1.8.22
|
68
|
+
signing_key:
|
69
|
+
specification_version: 3
|
70
|
+
summary: kuaipan sync folder command tool
|
71
|
+
test_files: []
|