kp_folder 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gem "kuaipan"
data/Gemfile.lock ADDED
@@ -0,0 +1,16 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ json (1.6.7)
5
+ kuaipan (0.0.3)
6
+ json (~> 1.6.6)
7
+ rest-client
8
+ mime-types (1.18)
9
+ rest-client (1.6.7)
10
+ mime-types (>= 1.16)
11
+
12
+ PLATFORMS
13
+ ruby
14
+
15
+ DEPENDENCIES
16
+ kuaipan
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
@@ -0,0 +1,9 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ t.pattern = 'test/**/test_*.rb'
6
+ end
7
+
8
+ desc "Run tests"
9
+ task :default => :test
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
@@ -0,0 +1,10 @@
1
+ # conding: utf-8
2
+
3
+ module KpFolder
4
+ module Config
5
+ @consumer_key, @consumer_secret = %w(xcWcZhCNKFJz1H8p 8RvkM0aGYiQF5kJF)
6
+ class << self
7
+ attr_reader :consumer_key, :consumer_secret
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ # conding: utf-8
2
+
3
+ require 'kp_folder'
4
+ require 'test/unit'
5
+
6
+ class ConfigTest < Test::Unit::TestCase
7
+ def test_config
8
+ assert_not_nil KpFolder::Config.consumer_key
9
+ assert_not_nil KpFolder::Config.consumer_secret
10
+ end
11
+ end
@@ -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: []