rtfs 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES ADDED
@@ -0,0 +1,4 @@
1
+ === 0.0.1 / 2011-08-02
2
+
3
+ * Birthday!
4
+ * �˰汾�ǵ���tfstoolʵ���ļ���tfs�IJ�������������Ӧ�õ���tfsclient��̬���c�ӿ�ʵ��
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Nowa Zhu <nowazhu@gmail.com>, http://nowa.me.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ 'Software'), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,3 @@
1
+ RTFS is a Ruby Client for TFS.
2
+
3
+ What's TFS: http://code.taobao.org/project/view/366/
@@ -0,0 +1,26 @@
1
+ # TFS Client for Ruby
2
+ # by nowa<nowazhu@gmail.com> 2011-07-23
3
+
4
+ #!/usr/local/bin/ruby
5
+
6
+ $:.unshift(File.dirname(__FILE__))
7
+
8
+ module RTFS; end
9
+
10
+ def require_local(suffix)
11
+ require(File.expand_path(File.join(File.dirname(__FILE__), suffix)))
12
+ end
13
+
14
+ require 'rubygems'
15
+ require 'nice-ffi'
16
+ require 'yaml'
17
+
18
+ require_local 'rtfs/wrapper.rb'
19
+ require_local 'rtfs/client.rb'
20
+ require_local 'rtfs/meta.rb'
21
+ require_local 'rtfs/version.rb'
22
+
23
+ # tfs = RTFS::Client.new({:ns_addr => '10.246.65.210:3100'})
24
+ # puts "tfsname: '#{tfs.put_file_and_get_url("/home/xifeng/1.png")}'"
25
+ # puts "#{tfs.get_file('T1H9t5XeRwXXaCwpjX')}"
26
+ # puts "#{tfs.file_stat('T1H9t5XeRwXXaCwpjX').inspect}"
@@ -0,0 +1,80 @@
1
+ # Code for client
2
+ # by nowa<nowazhu@gmail.com> 2011-07-23
3
+
4
+ module RTFS
5
+ TFSTOOL_PATH = "/home/admin/tfs/bin/tfstool"
6
+
7
+ class Client
8
+ attr_accessor :ns_addr
9
+ attr_accessor :tfstool_path
10
+
11
+ def initialize(options)
12
+ return nil unless options
13
+ @ns_addr = options[:ns_addr]
14
+ @tfstool_path = options[:tfstool_path] ? options[:tfstool_path] : TFSTOOL_PATH
15
+ raise NoTFSToolError.new unless File.exist?(@tfstool_path)
16
+ end
17
+
18
+ # ��tfs��ȡ�ļ�
19
+ def get_file(tfs_name, local_file=nil)
20
+ local_file ||= tfs_name
21
+ `#{tfstool_cmd} -i "get #{tfs_name} #{local_file}"`
22
+ end
23
+
24
+ # �����ļ���tfs�������ļ���tfsname
25
+ # tfsname example: T1lpVcXftHXXaCwpjX
26
+ def put_file(local_file, tfs_name="NULL", suffix=nil)
27
+ suffix ||= ".#{local_file.split(".").last}"
28
+ result = `#{tfstool_cmd} -i "put #{local_file} #{tfs_name} #{suffix}"`
29
+ # puts "result: #{result}"
30
+ t = nil
31
+ if result.include?("=> ")
32
+ result = result.split("=> ").last
33
+ if result.include?(",")
34
+ t = result.split(",").first
35
+ end
36
+ end
37
+ t.nil? ? nil : t
38
+ end
39
+
40
+ # �����ļ���tfs�������ļ��Ŀɷ���cdn url
41
+ def put_file_and_get_url(local_file, tfs_name="NULL", suffix=nil)
42
+ suffix ||= ".#{local_file.split(".").last}"
43
+ t = put_file(local_file, tfs_name, suffix)
44
+ t.nil? ? nil : "http://img03.taobaocdn.com/tfscom/#{t}#{suffix}"
45
+ end
46
+
47
+ # ɾ��tfs file
48
+ def rm_file(tfs_name)
49
+ `#{tfstool_cmd} -i "rm #{tfs_name}"`
50
+ end
51
+
52
+ # ������tfs file�����Ƽ�ʹ��
53
+ # new name ����Ҳ�� tfsname ��ʽ
54
+ def rename_file(tfs_name, new_name)
55
+ `#{tfstool_cmd} -i "rename #{tfs_name} #{new_name}"`
56
+ end
57
+
58
+ # ��ȡtfs file��stat
59
+ def file_stat(tfs_name)
60
+ result = `#{tfstool_cmd} -i "stat #{tfs_name}"`
61
+ stat = {}
62
+ result.split("\n").each do |line|
63
+ line = line.split(':').map {|i| i.gsub!(" ", "")}
64
+ stat["#{line.first}"] = line.last
65
+ end
66
+ stat
67
+ end
68
+
69
+ protected
70
+ def tfstool_cmd
71
+ "#{@tfstool_path} -n -s #{@ns_addr}"
72
+ end
73
+ end
74
+
75
+ class NoTFSToolError < RuntimeError
76
+ def to_s
77
+ "You must install tfs from yum or source first!"
78
+ end
79
+ end # NoTFSToolError
80
+ end
@@ -0,0 +1,56 @@
1
+ # meta.rb contains <tt>Top4R::Meta</tt> and related classes that
2
+ # help define the metadata of the <tt>Top4R</tt> project.
3
+
4
+ require('rubygems')
5
+ require('erb')
6
+
7
+ class RTFS::Meta #:nodoc:
8
+ attr_accessor :root_dir
9
+ attr_reader :gem_spec, :project_files, :spec_files
10
+
11
+ # Initializer for Top4R::Meta class. Takes <tt>root_dir</tt> as parameter.
12
+ def initialize(root_dir)
13
+ @root_dir = root_dir
14
+ end
15
+
16
+ # Returns package information defined in <tt>root_dir</tt>/pkg-info.yml
17
+ def pkg_info
18
+ yaml_file = File.join(@root_dir, 'pkg-info.yml')
19
+ ryaml = ERB.new(File.read(yaml_file), 0)
20
+ s = ryaml.result(binding)
21
+ YAML.load(s)
22
+ end
23
+
24
+ # Returns RubyGems spec information
25
+ def spec_info
26
+ self.pkg_info['spec'] if self.pkg_info
27
+ end
28
+
29
+ # Returns list of project files
30
+ def project_files
31
+ @project_files ||= Dir.glob(File.join(@root_dir, 'lib/**/*.rb'))
32
+ @project_files
33
+ end
34
+
35
+ # Returns list of specification files
36
+ def spec_files
37
+ @spec_files ||= Dir.glob(File.join(@root_dir, 'spec/**/*_spec.rb'))
38
+ @spec_files
39
+ end
40
+
41
+ # Returns RubyGem specification for Top4R project
42
+ def gem_spec
43
+ @gem_spec ||= Gem::Specification.new do |spec|
44
+ self.spec_info.each do |key, val|
45
+ if val.is_a?(Hash)
46
+ val.each do |k, v|
47
+ spec.send(key, k, v)
48
+ end
49
+ else
50
+ spec.send("#{key}=", val)
51
+ end
52
+ end
53
+ end
54
+ @gem_spec
55
+ end
56
+ end
@@ -0,0 +1,20 @@
1
+ # Version for RTFS
2
+ # by nowa<nowazhu@gmail.com> 2011-07-23
3
+
4
+ module RTFS::Version
5
+ MAJOR = 0
6
+ MINOR = 0
7
+ REVISION = 1
8
+
9
+ class << self
10
+ # Returns X.Y.Z formatted version string
11
+ def to_version
12
+ "#{MAJOR}.#{MINOR}.#{REVISION}"
13
+ end
14
+
15
+ # Returns X-Y-Z formatted version name
16
+ def to_name
17
+ "#{MAJOR}_#{MINOR}_#{REVISION}"
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,67 @@
1
+ # ʹ��ffi��nice-ffi�����ö�̬���c�ӿ�
2
+ # tfsclient c apiĿǰ�в����ƣ�����c�ӿڵķ�װ���ò�����������
3
+ # ���Ŀǰ��ʹ�ø�wrapper���ļ��ݴ�
4
+ # by nowa<nowazhu@gmail.com> 2011-07-23
5
+
6
+ module LibC
7
+ extend FFI::Library
8
+ # figures out the correct libc for each platform including Windows
9
+ library = ffi_lib(FFI::Library::LIBC).first
10
+
11
+ # Size_t not working properly on Windows
12
+ find_type(:size_t) rescue typedef(:ulong, :size_t)
13
+
14
+ # memory allocators
15
+ attach_function :malloc, [:size_t], :pointer
16
+ attach_function :free, [:pointer], :void
17
+
18
+ # get a pointer to the free function; used for ZMQ::Message deallocation
19
+ Free = library.find_symbol('free')
20
+
21
+ # memory movers
22
+ attach_function :memcpy, [:pointer, :pointer, :size_t], :pointer
23
+ end # module LibC
24
+
25
+ module LibRTFS
26
+ extend NiceFFI::Library
27
+
28
+ libs_dir = "/home/admin/tfs/lib/"
29
+ pathset = NiceFFI::PathSet::DEFAULT.prepend(libs_dir)
30
+
31
+ load_library("tfsclient_c", pathset)
32
+
33
+ attach_function :t_initialize, [:string, :int, :int], :int
34
+
35
+ #enum OpenFlag
36
+ # {
37
+ # T_READ = 1,
38
+ # T_WRITE = 2,
39
+ # T_CREATE = 4,
40
+ # T_NEWBLK = 8,
41
+ # T_NOLEASE = 16,
42
+ # T_STAT = 32,
43
+ # T_LARGE = 64
44
+ # };
45
+ attach_function :t_open, [:string, :string, :string, :int, :string], :int
46
+ attach_function :t_read, [:int, :pointer, :int], :int
47
+ attach_function :t_write, [:int, :pointer, :int], :int
48
+ attach_function :t_lseek, [:int, :int, :int], :int
49
+ attach_function :t_pread, [:int, :pointer, :int, :int], :int
50
+ attach_function :t_pwrite, [:int, :pointer, :int, :int], :int
51
+ attach_function :t_fstat, [:int, :pointer, :int], :int
52
+ attach_function :t_close, [:int, :string, :int], :int
53
+ attach_function :t_unlink, [:string, :string, :int], :int
54
+ end
55
+
56
+ # �����ⲿ�ִ����������LibRTFS
57
+ # LibRTFS.t_initialize("10.232.35.32:3100", 5, 1000)
58
+ # fd = LibRTFS.t_open("test", ".png", nil, 2, nil)
59
+ # puts "fd: #{fd}"
60
+ #
61
+ # ori_file = nil
62
+ # File.open("/home/xifeng/1.png", "r") do |f|
63
+ # ori_file = f.read
64
+ # end
65
+ # buffer = LibC.malloc ori_file.size
66
+ # buffer.write_string ori_file, ori_file.size
67
+ # puts "write: #{LibRTFS.t_write(fd, buffer, ori_file.size)}"
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rtfs
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Nowa Zhu
14
+ autorequire: rtfs
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-08-02 00:00:00 +08:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: nice-ffi
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ - 4
33
+ version: "0.4"
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ description:
37
+ email: nowazhu@gmail.com
38
+ executables: []
39
+
40
+ extensions: []
41
+
42
+ extra_rdoc_files:
43
+ - README
44
+ - CHANGES
45
+ - MIT-LICENSE
46
+ files:
47
+ - lib/rtfs/meta.rb
48
+ - lib/rtfs/version.rb
49
+ - lib/rtfs/client.rb
50
+ - lib/rtfs/wrapper.rb
51
+ - lib/rtfs.rb
52
+ - README
53
+ - CHANGES
54
+ - MIT-LICENSE
55
+ has_rdoc: true
56
+ homepage: http://rtfs.labs.nowa.me
57
+ licenses: []
58
+
59
+ post_install_message:
60
+ rdoc_options: []
61
+
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ hash: 57
70
+ segments:
71
+ - 1
72
+ - 8
73
+ - 7
74
+ version: 1.8.7
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ hash: 3
81
+ segments:
82
+ - 0
83
+ version: "0"
84
+ requirements:
85
+ - Ruby 1.8.7+
86
+ rubyforge_project: rtfs
87
+ rubygems_version: 1.3.7
88
+ signing_key:
89
+ specification_version: 3
90
+ summary: RTFS is a Ruby Client for TFS.
91
+ test_files: []
92
+