mymedia_ftp 0.2.0 → 0.3.3

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
- SHA1:
3
- metadata.gz: 2a79c27201bd99d03df23d7fac22ac335904f591
4
- data.tar.gz: c95aeb3a504437ed05e198d0e11d4b1d9ce2ecd4
2
+ SHA256:
3
+ metadata.gz: b7eb16a509a0458ad7e202999d535cb7aabe305e08b5267ae0f39f3583ffeecd
4
+ data.tar.gz: 4c0f913a18c5a00fc91c6a4be31895fcbdd265f47382b66fce04ecba22d7b05c
5
5
  SHA512:
6
- metadata.gz: c96d73bf20f366be140b15d6702393431812bcf89094b2fd3dfbe04d20731adfff977f2c786f2415d9384c268590d32dca930474edf9c2dd5fd900bbdaff2e59
7
- data.tar.gz: f0c685f277c99e5eb5a9dcf835c20d7af289f1f47927beec6d7f9ac311737d9d21203ab35079e4d9a17cc132f5ccd98e0372d0c669a61a2fddfa8f48751b7bc1
6
+ metadata.gz: 5cd0981666fe7fd3434a601d80698d774972706743503e1d5300fe0c94da5ab6b84816ec141f5b61f2464f38c6bbd3f8c5a10d0ab5fba58fa29009cec5dce640
7
+ data.tar.gz: b4b03d2487ac64c1d571f51ec11886e70adbe943c1f6111be4cff7a9e2ded7b797c84adfcb86e74af9c3925500a38feacc2a683019a56a2c0ff58907a7837066
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -3,15 +3,75 @@
3
3
  # file: mymedia_ftp.rb
4
4
 
5
5
  require 'net/ftp'
6
+ require 'tempfile'
6
7
  require 'fileutils'
7
8
 
8
9
 
9
10
  class MyMediaFTP < Net::FTP
10
11
 
11
- def initialize(host: '127.0.0.1', user: 'user', password: '1234',
12
+ def self.cp(src, dest, debug: false)
13
+
14
+ if src =~ /^ftp:\/\// then
15
+ uri, remotepath = src.match(/^(ftp:\/\/[^\/]+)(\/[^$]+)/).captures
16
+ new(uri, debug: debug).cp(remotepath, dest, :inbound)
17
+ else
18
+ uri, remotepath = dest.match(/^(ftp:\/\/[^\/]+)(\/[^$]+)/).captures
19
+ new(uri, debug: debug).cp(src, remotepath, :outbound)
20
+ end
21
+
22
+ end
23
+
24
+ def self.ls(s, debug: false)
25
+
26
+ uri, remotepath = s.match(/^(ftp:\/\/[^\/]+)(\/[^$]*)?/).captures
27
+ puts 'remotepath' + remotepath.inspect if debug
28
+ new(uri, debug: debug).ls(remotepath || '/')
29
+
30
+ end
31
+
32
+ def self.read(s, debug: false)
33
+
34
+ uri, remotepath = s.match(/^(ftp:\/\/[^\/]+)(\/[^$]+)/).captures
35
+ ftp = new(uri, debug: debug)
36
+ p ftp if debug
37
+
38
+ tmpfile = Tempfile.new('ftp')
39
+
40
+ ftp.cp remotepath, tmpfile.path
41
+ File.read tmpfile.path
42
+
43
+ end
44
+
45
+ def self.rm(s, debug: false)
46
+
47
+ uri, remotepath = s.match(/^(ftp:\/\/[^\/]+)(\/[^$]+)/).captures
48
+ new(uri, debug: debug).rm(remotepath)
49
+
50
+ end
51
+
52
+ def self.write(s, content='', debug: false)
53
+
54
+ tmpfile = Tempfile.new('ftp')
55
+ File.write tmpfile.path, content
56
+ self.cp tmpfile.path, s
57
+
58
+ end
59
+
60
+ def initialize(s=nil, host: '127.0.0.1', user: 'user', password: '1234',
12
61
  port: 21, debug: false)
13
62
 
63
+ if s then
64
+
65
+ r = s.match(/(?<user>\w+):(?<password>\w+)@(?<host>[^:]+)(?:\:(?<port>\d+))?/)
66
+ h = r.named_captures.map {|k,v| [k.to_sym, v]}.to_h
67
+ puts 'h: ' + h.inspect if debug
68
+ user, password, host = h.values.take(3)
69
+ port = h[:port] if h[:port]
70
+
71
+ end
72
+
14
73
  @debug = debug
74
+
15
75
  @curdir = '/'
16
76
  super()
17
77
  connect(host, port)
@@ -23,55 +83,74 @@ class MyMediaFTP < Net::FTP
23
83
  super(dir)
24
84
  @curdir = pwd
25
85
  end
86
+
87
+ alias cd chdir
26
88
 
27
- def cp(src='', dest='', &blk)
89
+ def cp(src='', dest='', direction=:inbound, &blk)
28
90
 
91
+ return outbound_cp(src, dest) if direction == :outbound
92
+
29
93
  puts 'cp: ' + src.inspect if @debug
30
94
  chdir File.dirname(src)
31
- FileUtils.mkdir_p dest
32
- Dir.chdir dest
33
-
34
- files = list_filenames(src)
35
-
36
- puts 'copying ...'
95
+ dir = File.dirname(dest)
96
+ FileUtils.mkdir_p dir
97
+ Dir.chdir dir
37
98
 
38
- files.each do |h|
39
-
40
- name, type = h[:name], h[:type]
99
+ puts 'copying ...' if @debug
100
+
101
+ files = if src =~ /[\*\?]/ then
102
+
103
+ cp_files(src)
41
104
 
42
- puts name
105
+ else
106
+
107
+ begin
108
+ getbinaryfile src, dest
109
+ rescue Net::FTPPermError => e
110
+ puts 'e: ' + e.inspect
111
+ end
43
112
 
44
- if type == :file then
45
- getbinaryfile name, name.downcase.gsub(/ +/,'-')
46
- else
47
- cp_dir(name, &blk)
48
- end
49
- blk.call(name, type) if block_given?
50
113
  end
51
114
 
52
115
  end
53
116
 
54
- def list_filenames(s=@curdir+'/*')
117
+ def delete(filename)
118
+ super(filename)
119
+ 'file deleted'
120
+ end
121
+
122
+ def list_filenames(s=@curdir+'/*', ctimesort: false)
55
123
 
56
124
  if @debug
57
125
  puts 'inside list_filenames'
58
126
  puts 's: ' + s.inspect
59
127
  end
60
128
 
61
- src = File.dirname(s)
129
+ if s =~ /\*/ then
130
+
131
+ src = File.dirname(s)
62
132
 
63
- raw_q = File.basename(s)
64
- puts 'raw_q: ' + raw_q.inspect if @debug
65
-
66
- q = raw_q.gsub('.','\.').gsub('*','.*').gsub('?','.?')\
67
- .sub(/[^\*\?\.]$/,'.*')
133
+ raw_q = File.basename(s)
134
+ puts 'raw_q: ' + raw_q.inspect if @debug
135
+
136
+ q = raw_q.gsub('.','\.').gsub('*','.*').gsub('?','.?')\
137
+ .sub(/[^\*\?\.]$/,'.*')
138
+ else
139
+ src = s
140
+ end
68
141
 
69
142
  list(src).inject([]) do |r, x|
70
143
 
71
144
  raw_attr, _, owner, group, filesize, month, day, time, filename = \
72
145
  x.split(/ +/,9)
73
- type = raw_attr =~ /d/ ? :directory : :file
74
- filename[/^#{q}$/] ? r << {name: filename, type: type} : r
146
+ type = raw_attr[0] == 'd' ? :directory : :file
147
+ d = Time.parse([Date.today.year, month, day, time].join(' ') )
148
+
149
+ if q then
150
+ filename[/^#{q}$/] ? r << {name: filename, type: type, filesize: filesize, ctime: d} : r
151
+ else
152
+ r << {name: filename, type: type, filesize: filesize, ctime: d}
153
+ end
75
154
  r
76
155
  end
77
156
 
@@ -88,6 +167,8 @@ class MyMediaFTP < Net::FTP
88
167
 
89
168
  end
90
169
 
170
+ alias rm delete
171
+
91
172
  private
92
173
 
93
174
  def cp_dir(directory, &blk)
@@ -99,5 +180,37 @@ class MyMediaFTP < Net::FTP
99
180
  cp('*', directory, &blk)
100
181
  chdir parent_dir
101
182
  end
183
+
184
+ def cp_files(src)
185
+
186
+ files = list_filenames(src)
187
+
188
+ files.each do |h|
189
+
190
+ name, type = h[:name], h[:type]
191
+
192
+ puts name
193
+
194
+ if type == :file then
195
+ begin
196
+ getbinaryfile name, name.downcase.gsub(/ +/,'-')
197
+ rescue Net::FTPPermError => e
198
+ puts 'e: ' + e.inspect
199
+ end
200
+ else
201
+ cp_dir(name, &blk)
202
+ end
203
+ blk.call(name, type) if block_given?
204
+ end
205
+ end
206
+
207
+ def outbound_cp(src, destination='.')
208
+
209
+ if File.basename(destination) == '.' then
210
+ destination.sub!(/\.$/, File.basename(src))
211
+ end
212
+
213
+ putbinaryfile(src, destination)
214
+ end
102
215
 
103
216
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mymedia_ftp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -10,27 +10,32 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDXjCCAkagAwIBAgIBATANBgkqhkiG9w0BAQUFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTgwMzEyMTQzMjEyWhcN
15
- MTkwMzEyMTQzMjEyWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVvDiX
17
- wZVChRBu6zZoETSQ17WFQF7bFJxMLuF+dQ45iCjGBOiMHkARKtgF/H9oeFLQGQpk
18
- WxWVgjD0a1EW1Sbq76q6+4LTJHHzspMTR3OIclLg8uxhGH8XckMixwjYj2oX7j+h
19
- 837NDczDJwqB/OH8chn9zO1qfyWIiTDg0e9BRWQsAwNAigoAbipC56x6ciizdXq7
20
- Uc2hfxmKUP4Rt5P5myMWhTAHNcYxXud0HS3XrtFUIL3pP/LBtwWy+/5HVTMS5iML
21
- rlJLLOZ5ll0aNrT4h0DlspAN4IBYuZEwD/VKBSD2zg5vocSrDmvXFxaUnfMNGSxK
22
- LR0DthL2JJU1KSGbAgMBAAGjgYowgYcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
23
- HQYDVR0OBBYEFPr4r2Be8t/4br//MJNp3Rqta50nMCYGA1UdEQQfMB2BG2dlbW1h
24
- c3RlckBqYW1lc3JvYmVydHNvbi5ldTAmBgNVHRIEHzAdgRtnZW1tYXN0ZXJAamFt
25
- ZXNyb2JlcnRzb24uZXUwDQYJKoZIhvcNAQEFBQADggEBAMOtYvEPHEeLVwGNfgK5
26
- lLMgIXA9Y4eRdOnhBFpcVlzsFrVm1oLieMFGVxkNHgflFRMHUpnzosaa8m+Tc4L4
27
- ZQTtBa7dK7HjfBi7l8sGJR00KRk1QQNA1/dfhIr1YQejNq1J8RkUG7uI+aiEmMwW
28
- +EWu4oQM7AHtDghXOxlPJlJphH/kpQcfSGfEz7pctL2WDEEr/7ax56cQHQzaInbh
29
- 7c6Xalbryf2I+Uj21nW9Sn5ZGyGl7mFqRiclRyqg89+k55DgQolX05KJGfiV8aWA
30
- XgExvIVcxlAxeQOUlcIGBWKIf+Hva5DT7OUUp76DGt6bi3X8uUeZd6y3+UtFj/RZ
31
- BXg=
13
+ MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjAwOTA2MTA1OTAxWhcN
15
+ MjEwOTA2MTA1OTAxWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDFzmsx
17
+ 8i7y/T2jgUQTBx/SMOu2OXWbl7FSmXvNqiScWjvkHHKFBtUTJ6eCGSKGF3xoAGKn
18
+ tolvsX3ZxNLGeYaaGSLImAx1yDskE8H2o/B+gQkhXOaqAWF0gMKKuSHgZGyBsrvf
19
+ LOSQipq/vbLQBrl2D1q5rlYetcKQ7sjAW3IAQWJsJe/TvoohEb2iXR1Btq8qx9qZ
20
+ XtL2SxNV7OaNRECTC2UieCXJNKVi/xpfkRorfyjv21KWfgw5T5h4xrNZtBRiS3vH
21
+ kO/cIlNTAqgSu0ZeQUhr8blMP+Te6o2cmynR/4vfGMU7L822l+in9Fkde5AxoVBQ
22
+ FejSp6+UEd8Bu2nXQmO91NxlwCvRlylHheYjabsij41+KeFYhJqsVFOzQlcBD0Pb
23
+ FGsq3YNbStt+DHir1OfceK4JX3N7CiPnQsXTx06T3ZnUxiYUj0QquefTnqb/S7MO
24
+ XtAMy3eH5msr8cAYiPRBW0hr/6RGGDTMM6Cjz+VzFgAF6OXqVDN9bjYQqckCAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU/PN/KSth
26
+ nZ4pBrLLklzgnH00nkMwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
+ c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
+ BgkqhkiG9w0BAQsFAAOCAYEAHM0WneD/luRLhn4hraEIWTNCUaVzz94DUcoo4umJ
29
+ 2APA5QsBXnnh33rUwCx3bWtTCR7mW0cShSVbGFwgvB7dRyegHczXlQcx2AgwB1k1
30
+ FzhR/37ef8Vdu44nXhhKj6NDhzVi89XuNLxSXzEHoGde6liAjTiGA7ydCyxSBdzq
31
+ Ld3WBJ+LycfVWgoNmW2csBCgrALXa145QKO5HW34n03wbZ5fAaCVy8GjAaHRf6Tf
32
+ 3QFe8+mYaXbHnqf2qEkNPIPQmdBKrfiyJK2kMIqQ3ldUGZZj+H5e1VOH8NKlSvr8
33
+ MtTHQ/vWwolPDjip3vyPbPMyNsdwC8QJHXiYl5M4rxYHSCaG6/+dMWMFAGMYVs52
34
+ 4LpA7DyCXsIeDLLZm4GvsGU+ntoCovwRCl4ZtgXtZt19QRze/nd9rcIxwULjVOBR
35
+ vmQbOdyo1gepCZyCN+UN/SCimjgu1yZtpI0S9lPHE1w/fMob3ohXflP/mnwUFxsN
36
+ KVwzt+QIecFrRei1GVykx8z3
32
37
  -----END CERTIFICATE-----
33
- date: 2018-03-12 00:00:00.000000000 Z
38
+ date: 2020-10-16 00:00:00.000000000 Z
34
39
  dependencies: []
35
40
  description:
36
41
  email: james@jamesrobertson.eu
@@ -58,8 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
58
63
  - !ruby/object:Gem::Version
59
64
  version: '0'
60
65
  requirements: []
61
- rubyforge_project:
62
- rubygems_version: 2.6.13
66
+ rubygems_version: 3.0.3
63
67
  signing_key:
64
68
  specification_version: 4
65
69
  summary: A MyMedia FTP client which uses Net/FTP.
metadata.gz.sig CHANGED
Binary file