fastdfs-client 1.0.0 → 1.0.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 84bd058d40b079c23d2cc236c651aa48a5a4e4f9
4
- data.tar.gz: 21b8ffd285416638286d3181134790665ce17c44
3
+ metadata.gz: b7c9c31e2cc224ba06f1ed3645106403401593f9
4
+ data.tar.gz: d6d383e70e70bc1ae9a4e89319728d2d2f631253
5
5
  SHA512:
6
- metadata.gz: de8034cd485d98fa4825ccb745e408f1e41052162c7bd86b75c25bcf08d7c5204cac57107ca3c2566770298f09d7fbc5ad8b0df0872f7bcfbfd8087e4ec525da
7
- data.tar.gz: 3de188e4493f56da22ce8ffb66c4d6cf332536381c0ec38de294a3e2d1acbd7bc02fec557302c062e17e4c3abaec93f2ff58e3f04149f9bd01bdac76e697d770
6
+ metadata.gz: 6f7622606be3975880698f78691a4bd1fd61306fd0cf7495069199e6140810e8d95b5522aae45c153021b67dc8aa7bfcfb335d435adb74f27026e6cf7c800846
7
+ data.tar.gz: ae1834faa05d1e4c81faeefa1849fea0a8ca44909bf7ce44e10d1e331bf1a437314f56ba825e680aa8a36de1459b42f6a9e067f871eeec5d20a59cdf15e9fdfb
data/.gitignore CHANGED
@@ -1 +1,2 @@
1
- *.gem
1
+ *.gem
2
+ Gemfile.lock
data/Gemfile CHANGED
@@ -1,8 +1,3 @@
1
1
  source 'http://gems.ruby-china.org/'
2
2
 
3
- gemspec
4
-
5
- group :test, :development do
6
- gem 'debugger'
7
- gem 'rspec'
8
- end
3
+ gemspec
data/README.md CHANGED
@@ -15,7 +15,7 @@ fastdfs client for ruby
15
15
  #
16
16
 
17
17
 
18
- tracker = new Fastdfs::Client::Tracker("192.168.1.1", "22122")
18
+ tracker = Fastdfs::Client::Tracker.new("192.168.1.1", "22122")
19
19
 
20
20
  @storage = tracker.get_storage
21
21
 
@@ -20,4 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ["lib"]
21
21
 
22
22
  spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "rspec", "~> 3.4.0"
24
+ spec.add_development_dependency "debugger", "~> 1.6.8"
25
+
23
26
  end
@@ -7,11 +7,4 @@ class Array
7
7
  def full_fill(val, len)
8
8
  self.fill(val, self.length...len)
9
9
  end
10
- end
11
-
12
- class Object
13
-
14
- def blank?
15
- self.nil? || self.empty?
16
- end
17
10
  end
@@ -31,8 +31,8 @@ module Fastdfs
31
31
 
32
32
  def connection
33
33
  if @socket.nil? || !connected
34
- Timeout.timeout(@connection_timeout) do
35
- @socket = TCPSocket.new(@host, @port)
34
+ @socket = Timeout.timeout(@connection_timeout) do
35
+ TCPSocket.new(@host, @port)
36
36
  end
37
37
  end
38
38
  end
@@ -42,8 +42,8 @@ module Fastdfs
42
42
  end
43
43
 
44
44
  def receive(&block)
45
- timeout_recv do
46
- @header = @socket.recv(@header_len).unpack("C*")
45
+ @header = timeout_recv do
46
+ @socket.recv(@header_len).unpack("C*")
47
47
  end
48
48
  res_header = parseHeader
49
49
  if res_header[:status]
@@ -56,11 +56,11 @@ module Fastdfs
56
56
 
57
57
  private
58
58
  def parseHeader
59
- err_msg = ""
60
- err_msg = "recv package size #{@header} is not equal #{@header_len}, cmd: #{@cmd}" unless @header.length == @header_len
61
- err_msg = "recv cmd: #{@header[8]} is not correct, expect cmd: #{CMD::RESP_CODE}, cmd: #{@cmd}" unless @header[8] == CMD::RESP_CODE
62
- err_msg = "recv erron #{@header[9]}, 0 is correct cmd: #{@cmd}" unless @header[9] == 0
63
- {status: err_msg.blank?, err_msg: err_msg}
59
+ err_msg = nil
60
+ err_msg = "recv package size #{@header} is not equal #{@header_len}, cmd: #{@cmd}" unless @header.length == @header_len || err_msg
61
+ err_msg = "recv cmd: #{@header[8]} is not correct, expect cmd: #{CMD::RESP_CODE}, cmd: #{@cmd}" unless @header[8] == CMD::RESP_CODE || err_msg
62
+ err_msg = "recv erron #{@header[9]}, 0 is correct cmd: #{@cmd}" unless @header[9] == 0 || err_msg
63
+ {status: err_msg.nil?, err_msg: err_msg}
64
64
  end
65
65
 
66
66
  def timeout_recv
@@ -88,7 +88,7 @@ module Fastdfs
88
88
  body_len -= len
89
89
  end
90
90
  end
91
- @content = nil if @content.blank?
91
+ @content = nil if Utils.is_blank? @content
92
92
  end
93
93
 
94
94
  end
@@ -28,7 +28,7 @@ module Fastdfs
28
28
  group_name_max_len = ProtoCommon::GROUP_NAME_MAX_LEN
29
29
 
30
30
  res = {group_name: body[0...group_name_max_len].strip, path: body[group_name_max_len..-1]}
31
- _set_metadata(res[:path], res[:group_name], options) unless options.blank?
31
+ _set_metadata(res[:path], res[:group_name], options) unless Utils.is_blank?(options)
32
32
  res
33
33
  end
34
34
  end
@@ -86,12 +86,11 @@ module Fastdfs
86
86
  end
87
87
 
88
88
  def extract_path!(path, group_name = nil)
89
- raise "path arguments is empty!" if path.blank?
90
- if group_name.blank?
89
+ raise "path arguments is empty!" if Utils.is_blank? path
90
+ if Utils.is_blank? group_name
91
91
  group_name = /^\/?(\w+)/.match(path)[1]
92
92
  path = path.gsub(Regexp.new("/?#{group_name}/?"), "")
93
93
  end
94
- raise "group_name arguments is empty!" if group_name.blank?
95
94
  return group_name, path
96
95
  end
97
96
 
@@ -114,7 +113,7 @@ module Fastdfs
114
113
  cover: ProtoCommon::SET_METADATA_FLAG_OVERWRITE,
115
114
  merge: ProtoCommon::SET_METADATA_FLAG_MERGE
116
115
  }
117
- flag = :cover if flag.blank?
116
+ flag ||= :cover
118
117
  data[flag.to_sym]
119
118
  end
120
119
 
@@ -122,7 +121,7 @@ module Fastdfs
122
121
  meta_bytes = options.map do |a|
123
122
  a.join(ProtoCommon::FILE_SEPERATOR)
124
123
  end.join(ProtoCommon::RECORD_SEPERATOR).bytes
125
- meta_bytes << 0 if meta_bytes.blank?
124
+ meta_bytes << 0 if meta_bytes.length <= 0
126
125
  meta_bytes
127
126
  end
128
127
 
@@ -8,7 +8,8 @@ module Fastdfs
8
8
  attr_accessor :socket, :cmd, :options
9
9
 
10
10
  def initialize(host, port, options = {})
11
- @socket = Socket.new(host, port, options[:socket])
11
+ @options = options
12
+ @socket = Socket.new(host, port, @options[:socket])
12
13
  @cmd = CMD::STORE_WITHOUT_GROUP_ONE
13
14
  end
14
15
 
@@ -19,7 +20,7 @@ module Fastdfs
19
20
  storage_port = body[ProtoCommon::PORT].unpack("C*").to_pack_long
20
21
  store_path = body[ProtoCommon::TRACKER_BODY_LEN-1].unpack("C*")[0]
21
22
 
22
- Storage.new(storage_ip, storage_port, store_path, options)
23
+ Storage.new(storage_ip, storage_port, store_path, @options)
23
24
  end
24
25
  res[:status] ? res[:result] : res
25
26
  end
@@ -13,4 +13,8 @@ module Utils
13
13
  def self.symbolize_keys(obj)
14
14
  obj.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
15
15
  end
16
+
17
+ def self.is_blank?(obj)
18
+ obj.nil? || obj.empty?
19
+ end
16
20
  end
@@ -1,5 +1,5 @@
1
1
  module Fastdfs
2
2
  module Client
3
- VERSION = '1.0.0'
3
+ VERSION = '1.0.1'
4
4
  end
5
5
  end
@@ -1,5 +1,5 @@
1
1
 
2
- class TCPSocket
2
+ class MockTCPSocket
3
3
  include Fastdfs::Client
4
4
 
5
5
  attr_accessor :host, :port, :cmd, :recv_offset, :connect_state
@@ -15,11 +15,24 @@ class TCPSocket
15
15
  def write(*args)
16
16
  pkg = args[0].unpack("C*")
17
17
  @cmd ||= pkg[8]
18
+ sleep(2)
18
19
  end
19
20
 
20
21
  def recv(len)
21
- recv_data = recv_config[@cmd.to_s] || {}
22
- data = recv_data.key?(:recv_bytes) ? recv_data[:recv_bytes].call(len) : nil
22
+ data = case @cmd
23
+ when 101
24
+ gate_tracker(len)
25
+ when 11
26
+ upload_file(len)
27
+ when 12
28
+ delete_file(len)
29
+ when 15
30
+ get_metadata(len)
31
+ when 13
32
+ set_metadata(len)
33
+ when 14
34
+ download_file(len)
35
+ end
23
36
  @recv_offset = len
24
37
  data
25
38
  end
@@ -35,62 +48,50 @@ class TCPSocket
35
48
  end
36
49
 
37
50
  private
51
+ def gate_tracker(len)
52
+ header = ProtoCommon.header_bytes(CMD::RESP_CODE, 0)
53
+ header[7] = ProtoCommon::TRACKER_BODY_LEN
38
54
 
39
- def recv_config
40
- {
41
- "101" => {
42
- recv_bytes: lambda do |len|
43
- header = ProtoCommon.header_bytes(CMD::RESP_CODE, 0)
44
- header[7] = ProtoCommon::TRACKER_BODY_LEN
55
+ group_name = Utils.array_merge([].fill(0, 0...16), TestConfig::GROUP_NAME.bytes)
56
+ ip = Utils.array_merge([].fill(0, 0...15), TestConfig::STORAGE_IP.bytes)
57
+ port = Utils.number_to_buffer(TestConfig::STORAGE_PORT.to_i)
58
+ store_path = Array(TestConfig::STORE_PATH)
45
59
 
46
- group_name = Utils.array_merge([].fill(0, 0...16), TestConfig::GROUP_NAME.bytes)
47
- ip = Utils.array_merge([].fill(0, 0...15), TestConfig::STORAGE_IP.bytes)
48
- port = Utils.number_to_buffer(TestConfig::STORAGE_PORT.to_i)
49
- store_path = Array(TestConfig::STORE_PATH)
60
+ (header+group_name+ip+port+store_path)[@recv_offset...@recv_offset+len].pack("C*")
61
+ end
62
+
63
+ def upload_file(len)
64
+ header = ProtoCommon.header_bytes(CMD::RESP_CODE, 0)
65
+ group_name = Utils.array_merge([].fill(0, 0...16), TestConfig::GROUP_NAME.bytes)
66
+ file_name = TestConfig::FILE_NAME.bytes
67
+ res = (group_name + file_name)
68
+ header[7] = (header + res).length
69
+ res = (header + res)
70
+
71
+ res[@recv_offset...@recv_offset+len].pack("C*")
72
+ end
73
+
74
+ def delete_file(len)
75
+ header = ProtoCommon.header_bytes(CMD::RESP_CODE, 0)
76
+ header.pack("C*")
77
+ end
78
+
79
+ def get_metadata(len)
80
+ header = ProtoCommon.header_bytes(CMD::RESP_CODE, 0)
81
+ body = TestConfig::METADATA.map{|a| a.join(ProtoCommon::FILE_SEPERATOR)}.join(ProtoCommon::RECORD_SEPERATOR).bytes
82
+ header[7] = body.length
83
+ (header + body)[@recv_offset...@recv_offset+len].pack("C*")
84
+ end
85
+
86
+ def set_metadata(len)
87
+ header = ProtoCommon.header_bytes(CMD::RESP_CODE, 0)
88
+ header.pack("C*")
89
+ end
50
90
 
51
- (header+group_name+ip+port+store_path)[@recv_offset...@recv_offset+len].pack("C*")
52
- end
53
- },
54
- "11" => {
55
- recv_bytes: lambda do |len|
56
- header = ProtoCommon.header_bytes(CMD::RESP_CODE, 0)
57
- group_name = Utils.array_merge([].fill(0, 0...16), TestConfig::GROUP_NAME.bytes)
58
- file_name = TestConfig::FILE_NAME.bytes
59
- res = (group_name + file_name)
60
- header[7] = (header + res).length
61
- res = (header + res)
62
-
63
- res[@recv_offset...@recv_offset+len].pack("C*")
64
- end
65
- },
66
- "12" => {
67
- recv_bytes: lambda do |len|
68
- header = ProtoCommon.header_bytes(CMD::RESP_CODE, 0)
69
- header.pack("C*")
70
- end
71
- },
72
- "15" => {
73
- recv_bytes: lambda do |len|
74
- header = ProtoCommon.header_bytes(CMD::RESP_CODE, 0)
75
- body = TestConfig::METADATA.map{|a| a.join(ProtoCommon::FILE_SEPERATOR)}.join(ProtoCommon::RECORD_SEPERATOR).bytes
76
- header[7] = body.length
77
- (header + body)[@recv_offset...@recv_offset+len].pack("C*")
78
- end
79
- },
80
- "13" => {
81
- recv_bytes: lambda do |len|
82
- header = ProtoCommon.header_bytes(CMD::RESP_CODE, 0)
83
- header.pack("C*")
84
- end
85
- },
86
- "14" => {
87
- recv_bytes: lambda do |len|
88
- header = ProtoCommon.header_bytes(CMD::RESP_CODE, 0)
89
- body = IO.read(TestConfig::FILE).bytes
90
- header[7] = body.length
91
- (header + body)[@recv_offset...@recv_offset+len].pack("C*")
92
- end
93
- }
94
- }
91
+ def download_file(len)
92
+ header = ProtoCommon.header_bytes(CMD::RESP_CODE, 0)
93
+ body = IO.read(TestConfig::FILE).bytes
94
+ header[7] = body.length
95
+ (header + body)[@recv_offset...@recv_offset+len].pack("C*")
95
96
  end
96
97
  end
data/spec/spec_helper.rb CHANGED
@@ -9,7 +9,13 @@ require File.expand_path('../mock_tcp_socket', __FILE__)
9
9
  FC = Fastdfs::Client
10
10
 
11
11
  RSpec.configure do |config|
12
+ config.before(:each) do
13
+ TCPSocket.stub(:new) do |h, p|
14
+ MockTCPSocket.new(h, p)
15
+ end
16
+ end
12
17
  config.mock_with :rspec do |c|
13
18
  c.syntax = [:should, :expect]
14
19
  end
15
20
  end
21
+
data/spec/storage_spec.rb CHANGED
@@ -40,7 +40,7 @@ describe Fastdfs::Client::Storage do
40
40
  it "can delete file raise exception" do
41
41
  res = storage.upload(TestConfig::FILE)[:result]
42
42
  result = FC::ProtoCommon.header_bytes(FC::CMD::RESP_CODE, 0, 22)
43
- TCPSocket.any_instance.stub("recv").and_return(result.pack("C*"))
43
+ MockTCPSocket.any_instance.stub("recv").and_return(result.pack("C*"))
44
44
  expect( storage.delete("fdsaf", res[:group_name])[:status] ).to be_falsey
45
45
  end
46
46
 
@@ -58,6 +58,5 @@ describe Fastdfs::Client::Storage do
58
58
  expect(res[:status]).to be_truthy
59
59
  expect(res[:result]).to be_an_instance_of(Tempfile)
60
60
  expect(IO.read(res[:result])).to eq(IO.read(TestConfig::FILE))
61
-
62
61
  end
63
62
  end
data/spec/tracker_spec.rb CHANGED
@@ -29,7 +29,18 @@ describe Fastdfs::Client::Tracker do
29
29
  expect(tracker.get_storage.store_path).to eq(TestConfig::STORE_PATH)
30
30
  end
31
31
 
32
+ it "get to the server failed" do
33
+ result = FC::ProtoCommon.header_bytes(FC::CMD::RESP_CODE, 0, 22)
34
+ MockTCPSocket.any_instance.stub("recv").and_return(result.pack("C*"))
35
+ expect(tracker.get_storage).to be_a_kind_of(Hash)
36
+ expect(tracker.get_storage[:status]).to be_falsey
37
+ end
38
+
32
39
  it "run server flow" do
40
+ 1.times.map do
41
+ tracker.get_storage
42
+ end
43
+
33
44
  # storage = tracker.get_storage
34
45
  # puts "#{storage.host}, #{storage.port}"
35
46
  # results = storage.upload(File.open("/Users/huxinghai/Documents/shark/app/assets/images/page.png"))
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastdfs-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ka Ka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-17 00:00:00.000000000 Z
11
+ date: 2016-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 3.4.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 3.4.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: debugger
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.6.8
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.6.8
27
55
  description: fastdfs upload file client for ruby
28
56
  email:
29
57
  - huxinghai1988@gmail.com
@@ -33,7 +61,6 @@ extra_rdoc_files: []
33
61
  files:
34
62
  - ".gitignore"
35
63
  - Gemfile
36
- - Gemfile.lock
37
64
  - README.md
38
65
  - fastdfs-client.gemspec
39
66
  - lib/fastdfs-client.rb
data/Gemfile.lock DELETED
@@ -1,38 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- fastdfs-client (1.0.0)
5
-
6
- GEM
7
- remote: http://gems.ruby-china.org/
8
- specs:
9
- columnize (0.9.0)
10
- debugger (1.6.8)
11
- columnize (>= 0.3.1)
12
- debugger-linecache (~> 1.2.0)
13
- debugger-ruby_core_source (~> 1.3.5)
14
- debugger-linecache (1.2.0)
15
- debugger-ruby_core_source (1.3.8)
16
- diff-lcs (1.2.5)
17
- rspec (3.4.0)
18
- rspec-core (~> 3.4.0)
19
- rspec-expectations (~> 3.4.0)
20
- rspec-mocks (~> 3.4.0)
21
- rspec-core (3.4.4)
22
- rspec-support (~> 3.4.0)
23
- rspec-expectations (3.4.0)
24
- diff-lcs (>= 1.2.0, < 2.0)
25
- rspec-support (~> 3.4.0)
26
- rspec-mocks (3.4.1)
27
- diff-lcs (>= 1.2.0, < 2.0)
28
- rspec-support (~> 3.4.0)
29
- rspec-support (3.4.1)
30
-
31
- PLATFORMS
32
- ruby
33
-
34
- DEPENDENCIES
35
- bundler (~> 1.3)
36
- debugger
37
- fastdfs-client!
38
- rspec