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 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: []