ocman 1.2.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 050bc6a6baa2dea31694c49f2b320dcbf95f5929
4
- data.tar.gz: a1b186c12d2e6169f593832e91de398e6f2c4d11
2
+ SHA256:
3
+ metadata.gz: 01adcff61e626c6b19883ece249e25d7b7df6f5a1223aeb35b8ac117dc5eb1ab
4
+ data.tar.gz: f0231c022308483bdc19b490632d653e17c7692aa8680036423e8495bd49b7ea
5
5
  SHA512:
6
- metadata.gz: 98046bfc2dda057cbd11ac2bfa82cedb918a66fc37d63547a673b6ee521c6a22aed842adaea3c5c53e87faf7138ca45c6e7b36d063d8e81b3793f50c7199aa82
7
- data.tar.gz: a03e115913971f9de297fd0acb9e3c87a42d9073ef0c24fb7ee6555ad5e2016436dd835dee3122aec8d85d0893f75e09d37b5d9bda85a082ce50147f772f9697
6
+ metadata.gz: a1623d11c9a31c730a3169dbae68e2454c7f03873b14254b31c4296d9cbd55bbbdd4fb64b6c00a71969795e9864087ad44d960f16966779c77c8dabbed3d8f53
7
+ data.tar.gz: 5a8fa49d48f2d1a3e66fcf7af8dddcef628567b70c835966276312c48aeb981fa43d0877adcbd728f3aea3c745069ad33050ef06a53e4cbe9f02e0523bf0693e
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'ocman/configuration'
2
4
  require 'ocman/dav'
3
5
  require 'ocman/item'
6
+ require 'ocman/permission'
4
7
  require 'ocman/folder'
5
8
  require 'ocman/version'
6
9
  require 'ocman/share'
@@ -19,8 +22,8 @@ module Ocman
19
22
  end
20
23
 
21
24
  ### share
22
- def self.share(path, user)
23
- Ocman::Share.new(path).share(user)
25
+ def self.share(path, user, permission = Permission.all)
26
+ Ocman::Share.new(path).share(user, permission)
24
27
  end
25
28
 
26
29
  def self.delete_share(path, user)
@@ -28,16 +31,20 @@ module Ocman
28
31
  end
29
32
 
30
33
  ### folder
31
- def self.list(path, options={})
34
+ def self.list(path, options = {})
32
35
  Ocman::Folder.list(path, options)
33
36
  end
34
37
 
35
- def self.create_folder(path)
36
- Ocman::Folder.create(path)
38
+ def self.create_folder(path, recursive: false)
39
+ if recursive
40
+ Ocman::Folder.create_recursive(path)
41
+ else
42
+ Ocman::Folder.create(path)
43
+ end
37
44
  end
38
45
 
39
46
  ### files
40
- def self.put(file_path, path, options={})
47
+ def self.put(file_path, path, options = {})
41
48
  Ocman::Item.create(file_path, path, options)
42
49
  end
43
50
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ocman
2
4
  class Configuration
3
5
  attr_accessor :base_url, :user_name, :password, :dav_base_uri
@@ -1,32 +1,33 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'net/dav'
4
+ require 'cgi'
2
5
 
3
6
  module Ocman
4
7
  class Dav
5
8
  attr_writer :connection
6
9
 
7
10
  def mkdir(path)
8
- connection.mkdir( uri(path) )
11
+ connection.mkdir(uri(path))
9
12
  end
10
13
 
11
- def ls(path, options={})
12
- connection.find( uri(path), options ) do |item|
13
- yield(item)
14
- end
14
+ def ls(path, options = {}, &block)
15
+ connection.find(uri(path), options, &block)
15
16
  end
16
17
 
17
- def put(file_path, path, options={})
18
+ def put(file_path, path, options = {})
18
19
  filename = options[:filename] || File.basename(file_path)
19
20
  File.open(file_path, 'r') do |stream|
20
- connection.put( uri(path, filename) , stream, File.size(file_path))
21
+ connection.put(uri(path, filename), stream, File.size(file_path))
21
22
  end
22
23
  end
23
24
 
24
25
  def delete(path)
25
- connection.delete( uri(path) )
26
+ connection.delete(uri(path))
26
27
  end
27
28
 
28
29
  def move(source_path, destination_path)
29
- connection.move( uri(source_path), uri(destination_path) )
30
+ connection.move(uri(source_path), uri(destination_path))
30
31
  end
31
32
 
32
33
  def self.base_uri
@@ -34,7 +35,7 @@ module Ocman
34
35
  end
35
36
 
36
37
  def self.url(path)
37
- Ocman.configuration.base_url + (Ocman::Dav.base_uri + path).gsub(/\/+/, '/')
38
+ Ocman.configuration.base_url + (Ocman::Dav.base_uri + path).gsub(%r{/+}, '/')
38
39
  end
39
40
 
40
41
  private
@@ -47,8 +48,9 @@ module Ocman
47
48
  }
48
49
  end
49
50
 
50
- def uri(path, filename=nil)
51
- [Ocman::Dav.base_uri, path, filename].compact.join('/').gsub(/\/+/, '/')
51
+ def uri(path, filename = nil)
52
+ filename = CGI.escape(filename) if filename
53
+ [Ocman::Dav.base_uri, path, filename].compact.join('/').gsub(%r{/+}, '/')
52
54
  end
53
55
 
54
56
  def connection
@@ -1,23 +1,71 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'hashie'
4
+ require 'cgi'
5
+ require 'erb'
2
6
 
3
7
  module Ocman
4
8
  class Folder
5
- def self.create(path)
6
- Ocman::Dav.new.mkdir(URI.encode(path))
7
- end
9
+ class << self
10
+ def create_recursive(path)
11
+ path_list(path).each do |path_part|
12
+ next if ignore404 { list(path_part) }
13
+
14
+ create(path_part)
15
+ end
16
+ end
17
+
18
+ def create(path)
19
+ Ocman::Dav.new.mkdir(escape_path(path))
20
+ wait_for_folder(path)
21
+ end
22
+
23
+ def list(path, options = {})
24
+ accu = []
8
25
 
9
- def self.list(path, options={})
10
- accu = []
26
+ Ocman::Dav.new.ls(escape_path(path), options) do |item|
27
+ accu << Hashie::Mash.new(
28
+ path: CGI.unescape(item.uri.to_s.gsub(Ocman::Dav.url(path), '').gsub('/', '')),
29
+ type: item.type.to_s,
30
+ size: item.size
31
+ )
32
+ end
11
33
 
12
- Ocman::Dav.new.ls(URI.encode(path), options) do |item|
13
- accu << Hashie::Mash.new({
14
- path: URI.decode(item.uri.to_s.gsub(Ocman::Dav.url(path), '').gsub('/', '')),
15
- type: item.type.to_s,
16
- size: item.size
17
- })
34
+ accu
18
35
  end
19
36
 
20
- accu
37
+ private
38
+
39
+ def escape_path(path)
40
+ path.split('/').map { |segment| ERB::Util.url_encode(segment) }.join('/')
41
+ end
42
+
43
+ def wait_for_folder(path)
44
+ wait_time = 1
45
+ retries = 0
46
+ loop do
47
+ raise TimeoutError if retries >= 3
48
+ break if Ocman.list(path)
49
+
50
+ sleep wait_time
51
+ wait_time *= 2
52
+ retries += 1
53
+ end
54
+ end
55
+
56
+ def ignore404
57
+ yield
58
+ rescue Net::HTTPServerException => e
59
+ raise unless e.to_s.match?(/404.*Not found/i)
60
+
61
+ nil
62
+ end
63
+
64
+ def path_list(path)
65
+ path.split('/').reduce([]) do |acc, segment|
66
+ acc << [acc.last, segment].compact.join('/')
67
+ end
68
+ end
21
69
  end
22
70
  end
23
71
  end
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ocman
2
4
  class Item
3
- def self.create(file, path, options={})
4
- Ocman::Dav.new.put(file, URI.encode(path), options)
5
+ def self.create(file, path, options = {})
6
+ Ocman::Dav.new.put(file, CGI.escape(path), options)
5
7
  end
6
8
 
7
9
  def self.delete(path)
8
- Ocman::Dav.new.delete(URI.encode(path))
10
+ Ocman::Dav.new.delete(CGI.escape(path))
9
11
  end
10
12
 
11
13
  def self.move(source_path, destination_path)
12
- Ocman::Dav.new.move(URI.encode(source_path), URI.encode(destination_path))
14
+ Ocman::Dav.new.move(CGI.escape(source_path), CGI.escape(destination_path))
13
15
  end
14
16
  end
15
17
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ocman
4
+ class Permission
5
+ PERMISSIONS = {
6
+ read: 1,
7
+ update: 2,
8
+ create: 4,
9
+ delete: 8,
10
+ share: 16
11
+ }.freeze
12
+ private_constant :PERMISSIONS
13
+
14
+ attr_reader :permissions
15
+
16
+ def initialize(permissions = [:all])
17
+ @permissions = Set.new(permissions)
18
+ @permissions = Set.new(PERMISSIONS.keys) if @permissions.include?(:all)
19
+
20
+ raise ArgumentError, "No permission given. Valid permissions are: #{PERMISSIONS.keys}" if @permissions.empty?
21
+ return if @permissions.all? { |permission| PERMISSIONS.key?(permission) }
22
+
23
+ raise ArgumentError, "Valid permissions are: #{PERMISSIONS.keys}"
24
+ end
25
+
26
+ def to_i
27
+ @permissions
28
+ .map { |permission| PERMISSIONS.fetch(permission) }
29
+ .inject(&:|) || PERMISSIONS[:all]
30
+ end
31
+
32
+ def +(other)
33
+ Permission.new(permissions + other.permissions)
34
+ end
35
+
36
+ def -(other)
37
+ Permission.new(permissions - other.permissions)
38
+ end
39
+
40
+ class << self
41
+ PERMISSIONS.each_key do |name|
42
+ define_method(name) do
43
+ new([name])
44
+ end
45
+ end
46
+
47
+ def all
48
+ new(PERMISSIONS.keys)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,4 +1,6 @@
1
- require 'json'
1
+ # frozen_string_literal: true
2
+
3
+ require 'multi_json'
2
4
  require 'restclient'
3
5
  require 'hashie'
4
6
 
@@ -8,68 +10,67 @@ module Ocman
8
10
  @path = path
9
11
  end
10
12
 
11
- def share(user)
13
+ def share(user, permission = Permission.all)
12
14
  request_parameter = {
13
- payload: {
15
+ payload: {
14
16
  path: @path,
15
17
  shareWith: user,
16
18
  shareType: '0',
17
- permissions: '31',
18
- },
19
+ permissions: permission.to_i
20
+ }
19
21
  }.merge connection_params('post')
20
22
 
21
- request = RestClient::Request.new( request_parameter )
22
- parse_result( request.execute )
23
+ request = RestClient::Request.new(request_parameter)
24
+ parse_result(request.execute)
23
25
  end
24
26
 
25
27
  def delete_share(user)
26
28
  share = find_share(user)
27
- request_parameter = connection_params('delete', share.id)
28
- request = RestClient::Request.new( request_parameter )
29
- parse_result( request.execute )
29
+ return if share.nil?
30
+
31
+ request = RestClient::Request.new(connection_params('delete', id: share.id))
32
+ parse_result(request.execute)
30
33
  end
31
34
 
32
35
  def find_share(user)
33
- result = nil
34
- shares = share_info.data
35
- shares = [shares] unless shares.kind_of?(Array)
36
- shares.each do |share|
37
- if share.share_with == user
38
- result = share
39
- end
36
+ Array(share_info.data).find do |share|
37
+ share.share_with == user
40
38
  end
41
- result
42
39
  end
43
40
 
44
41
  def share_info
45
- request_parameter = {
46
- headers: {
47
- params: {
48
- path: @path
49
- },
50
- },
51
- }.merge connection_params('get')
52
-
53
- request = RestClient::Request.new( request_parameter )
54
- parse_result( request.execute )
42
+ request = RestClient::Request.new(connection_params('get', path: @path))
43
+ parse_result(request.execute)
55
44
  end
56
45
 
57
46
  private
47
+
58
48
  def parse_result(response)
59
- Hashie::Mash.new( JSON.parse(response)['ocs'] )
49
+ Hashie::Mash.new(MultiJson.load(response)['ocs'])
60
50
  end
61
51
 
62
- def connection_params(http_method, id=nil)
63
- url = Ocman.configuration.base_url + "/ocs/v1.php/apps/files_sharing/api/v1/shares" + "#{'/' + id.to_s if id}?format=json"
52
+ def connection_params(http_method, attributes = {})
64
53
  {
65
- url: url,
66
- method: http_method,
67
- user: Ocman.configuration.user_name,
54
+ url: share_url(attributes[:id]),
55
+ method: http_method,
56
+ user: Ocman.configuration.user_name,
68
57
  password: Ocman.configuration.password,
69
- headers: {
70
- 'OCS-APIRequest': true,
71
- }
58
+ headers: connection_headers(attributes)
72
59
  }
73
60
  end
61
+
62
+ def connection_headers(attributes = {})
63
+ {
64
+ 'OCS-APIRequest' => true,
65
+ params: {
66
+ path: attributes[:path],
67
+ format: 'json'
68
+ }.compact
69
+ }
70
+ end
71
+
72
+ def share_url(id = nil)
73
+ "#{Ocman.configuration.base_url}/ocs/v1.php/apps/files_sharing/api/v1/shares#{"/#{id}" if id}"
74
+ end
74
75
  end
75
76
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ocman
2
- VERSION = '1.2.1'
4
+ VERSION = '1.4.0'
3
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ocman
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Waldemar Gribele
@@ -9,52 +9,52 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-12-21 00:00:00.000000000 Z
12
+ date: 2016-12-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: net_dav
15
+ name: hashie
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: 0.5.1
20
+ version: '3.4'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: 0.5.1
27
+ version: '3.4'
28
28
  - !ruby/object:Gem::Dependency
29
- name: hashie
29
+ name: multi_json
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '3.4'
34
+ version: '1.0'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '3.4'
41
+ version: '1.0'
42
42
  - !ruby/object:Gem::Dependency
43
- name: rest-client
43
+ name: net_dav
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '2.0'
48
+ version: 0.5.1
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '2.0'
55
+ version: 0.5.1
56
56
  - !ruby/object:Gem::Dependency
57
- name: json
57
+ name: rest-client
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - "~>"
@@ -67,6 +67,48 @@ dependencies:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: '2.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: pry
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: pry-nav
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rake
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
70
112
  - !ruby/object:Gem::Dependency
71
113
  name: rspec
72
114
  requirement: !ruby/object:Gem::Requirement
@@ -81,7 +123,49 @@ dependencies:
81
123
  - - "~>"
82
124
  - !ruby/object:Gem::Version
83
125
  version: '3.5'
84
- description: Ruby gem for file managment and sharing in owncloud
126
+ - !ruby/object:Gem::Dependency
127
+ name: rubocop
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: 1.6.1
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: 1.6.1
140
+ - !ruby/object:Gem::Dependency
141
+ name: rubocop-rake
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '0.5'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: '0.5'
154
+ - !ruby/object:Gem::Dependency
155
+ name: rubocop-rspec
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: 2.1.0
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: 2.1.0
168
+ description: Ruby gem for file managment and sharing in nextcloud/owncloud
85
169
  email: laboratories@toptranslation.com
86
170
  executables: []
87
171
  extensions: []
@@ -92,6 +176,7 @@ files:
92
176
  - lib/ocman/dav.rb
93
177
  - lib/ocman/folder.rb
94
178
  - lib/ocman/item.rb
179
+ - lib/ocman/permission.rb
95
180
  - lib/ocman/share.rb
96
181
  - lib/ocman/version.rb
97
182
  homepage: https://developer.toptranslation.com
@@ -106,16 +191,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
106
191
  requirements:
107
192
  - - ">="
108
193
  - !ruby/object:Gem::Version
109
- version: '0'
194
+ version: '2.4'
110
195
  required_rubygems_version: !ruby/object:Gem::Requirement
111
196
  requirements:
112
197
  - - ">="
113
198
  - !ruby/object:Gem::Version
114
199
  version: '0'
115
200
  requirements: []
116
- rubyforge_project:
117
- rubygems_version: 2.5.1
201
+ rubygems_version: 3.1.4
118
202
  signing_key:
119
203
  specification_version: 4
120
- summary: Ocman - Manages files and shares in owncloud
204
+ summary: Ocman - Manages files and shares in nextcloud/owncloud
121
205
  test_files: []