ocman 1.2.1 → 1.4.0

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