kp_folder 0.0.4
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.
- 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: []
|