cmis-ruby 0.3.8 → 0.3.9

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: 5509c0d7a7ebe328fb70713c0d33286634414c3b
4
- data.tar.gz: 1b083a997de518a72a4d3de31b955321f32184ef
3
+ metadata.gz: eb2a6ae007e4f3159fd4f301e20f41566a88e0c7
4
+ data.tar.gz: 847b9a6c163696833c89fdedcb63248658fa7557
5
5
  SHA512:
6
- metadata.gz: 71aeea351aef546a84493d3090c959b62f8b318c9adc0e13ffbb98ed8125cc7ac03bb63c1ae18d82936ce2a0eb80092b1f71074b9b1b94ea0667fb0bc8ec154a
7
- data.tar.gz: 933826ba179011b28eda09faa060b4fc722ff5ea595f0a243a9ddc9dbbec9581b50d50f40151936e02550b590c287f256cc43f5ff18588de3470f22fd73c7ea2
6
+ metadata.gz: f8dbd5f1d1dfd272697240739e7fd8dd9af6f111be7f4afe4946e286920186580b07dcd4f3d71097fad75310c908e1d90d0faf3b82c1f21eb34a995975933d84
7
+ data.tar.gz: a16cdbc5e5acfb6a5fff6d0b0de835729e644d596e574381cfc718a6fe1eb97316ccd953dddf1d6fb640791373e91023dbda49c3ef1dba91fb3acd857769129f
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ env:
6
+ - TEST_ENV=alfresco
data/Gemfile CHANGED
@@ -2,5 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'rake'
6
- gem 'rspec'
5
+ group :test do
6
+ gem 'rake'
7
+ gem 'rspec'
8
+ end
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rspec/core/rake_task'
2
2
 
3
3
  RSpec::Core::RakeTask.new(:spec) do |spec|
4
- spec.rspec_opts = ['--colour']
4
+ spec.rspec_opts = ['--options', 'spec/rspec.opts']
5
5
  end
6
6
 
7
7
  task default: [:spec]
@@ -2,23 +2,25 @@ $LOAD_PATH.unshift 'lib'
2
2
  require 'cmis/version'
3
3
 
4
4
  Gem::Specification.new do |s|
5
- s.name = 'cmis-ruby'
6
- s.version = CMIS::VERSION
7
- s.date = Time.now.strftime('%Y-%m-%d')
8
- s.authors = ['Kenneth Geerts', 'Michael Brackx']
9
- s.email = ['kenneth@up-nxt.com']
10
- s.homepage = 'https://github.com/UP-nxt'
11
- s.summary = 'Ruby client for CMIS'
12
- s.license = 'Apache-2.0'
13
- s.has_rdoc = false
5
+ s.name = 'cmis-ruby'
6
+ s.version = CMIS::VERSION
7
+ s.date = Time.now.strftime('%Y-%m-%d')
8
+ s.authors = ['Kenneth Geerts', 'Michael Brackx']
9
+ s.email = ['kenneth@up-nxt.com']
10
+ s.homepage = 'https://github.com/UP-nxt'
11
+ s.summary = 'Ruby client for CMIS'
12
+ s.license = 'Apache-2.0'
13
+ s.has_rdoc = false
14
14
 
15
- s.files = `git ls-files`.split($/)
16
- s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
- s.test_files = s.files.grep(%r{^(test|spec|features)/})
18
- s.require_paths = [ 'lib' ]
15
+ s.files = `git ls-files`.split($/)
16
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
18
+ s.require_paths = %w( lib )
19
19
 
20
- s.add_dependency 'faraday', '~> 0.9'
21
- s.add_dependency 'activesupport', '>= 3.2', '< 5.0'
20
+ s.required_ruby_version = '>= 1.9.3'
21
+
22
+ s.add_dependency 'faraday', '~> 0.9'
23
+ s.add_dependency 'activesupport', '>= 3.2', '< 5.0'
22
24
 
23
25
  s.description = <<-DESCRIPTION
24
26
  CMIS browser binding client library in ruby.
@@ -88,7 +88,7 @@ module CMIS
88
88
  skipCount: @skip_count,
89
89
  orderBy: @order_by,
90
90
  includeRelationships: @include_relationships,
91
- filter: @filter}, @opts)
91
+ filter: @filter }, @opts)
92
92
 
93
93
  results = result['objects'].map { |o| build_object_with_relationships(o) }
94
94
  QueryResult.new(results, result['numItems'], result['hasMoreItems'])
@@ -3,8 +3,8 @@ module CMIS
3
3
  def initialize(options)
4
4
  options.symbolize_keys!
5
5
 
6
- @service_url = options[:service_url] || ENV['CMIS_BROWSER_URL'] or \
7
- raise "option `:service_url` or ENV['CMIS_BROWSER_URL'] must be set"
6
+ message = "option `service_url` must be set"
7
+ @service_url = options[:service_url] or raise message
8
8
 
9
9
  adapter = (options[:adapter] || :net_http).to_sym
10
10
 
@@ -18,9 +18,8 @@ module CMIS
18
18
  builder.request :multipart
19
19
  builder.request :url_encoded
20
20
 
21
- if username = options[:username] || ENV['CMIS_USER']
22
- password = options[:password] || ENV['CMIS_PASSWORD']
23
- builder.basic_auth(username, password)
21
+ if options[:username]
22
+ builder.basic_auth(options[:username], options[:password])
24
23
  end
25
24
 
26
25
  builder.adapter adapter
@@ -35,7 +34,7 @@ module CMIS
35
34
  options.symbolize_keys!
36
35
 
37
36
  query = options[:query] || {}
38
- headers = options[:headers]|| {}
37
+ headers = options[:headers] || {}
39
38
  url = url(params.delete(:repositoryId), params[:objectId])
40
39
 
41
40
  response = if params[:cmisaction]
@@ -37,12 +37,15 @@ module CMIS
37
37
  repositoryId: repository.id,
38
38
  objectId: cmis_object_id }, opts)
39
39
 
40
- rescue Exceptions::Constraint
41
- # Check for specific constraint?
42
- nil
40
+ rescue Exceptions::Constraint => e
41
+ if e.message =~ /no content stream/
42
+ nil
43
+ else
44
+ raise e
45
+ end
43
46
  end
44
47
 
45
- def set_content(opts = {})
48
+ def content=(opts = {})
46
49
  opts.stringify_keys!
47
50
  content = { stream: opts.delete('stream'),
48
51
  mime_type: opts.delete('mime_type'),
@@ -21,29 +21,16 @@ module CMIS
21
21
 
22
22
  def create(object, opts = {})
23
23
  case object
24
- when Relationship
25
- raise "'cmis:relationship' is not fileable. Use Repository#create_relationship"
26
-
27
24
  when Document
28
25
  return object.create_in_folder(self, opts)
29
-
30
26
  when Folder
31
- o = server.execute!({ cmisaction: 'createFolder',
32
- repositoryId: repository.id,
33
- properties: object.properties,
34
- objectId: cmis_object_id }, opts)
35
-
27
+ o = create_in_self(object, 'createFolder', opts)
36
28
  when Policy
37
- o = server.execute!({ cmisaction: 'createPolicy',
38
- repositoryId: repository.id,
39
- properties: object.properties,
40
- objectId: cmis_object_id }, opts)
29
+ o = create_in_self(object, 'createPolicy', opts)
41
30
  when Item
42
- o = server.execute!({ cmisaction: 'createItem',
43
- repositoryId: repository.id,
44
- properties: object.properties,
45
- objectId: cmis_object_id }, opts)
46
-
31
+ o = create_in_self(object, 'createItem', opts)
32
+ when Relationship
33
+ raise "`cmis:relationship` is not fileable. Use Repository#create_relationship."
47
34
  else
48
35
  raise "Unexpected base_type_id: #{object.base_type_id}"
49
36
  end
@@ -70,5 +57,14 @@ module CMIS
70
57
  objectId: object.cmis_object_id,
71
58
  folderId: cmis_object_id }, opts)
72
59
  end
60
+
61
+ private
62
+
63
+ def create_in_self(object, cmis_action, opts)
64
+ server.execute!({ cmisaction: cmis_action,
65
+ repositoryId: repository.id,
66
+ properties: object.properties,
67
+ objectId: cmis_object_id }, opts)
68
+ end
73
69
  end
74
70
  end
@@ -68,14 +68,17 @@ module CMIS
68
68
  def sanitize(prop)
69
69
  value = prop['value']
70
70
 
71
- # Sometimes (when?) single values come in an array
72
- if value.is_a?(Array) && prop['cardinality'] == 'single'
73
- value = value.first
74
- end
71
+ # Sometimes (when?) single values come in an array.
72
+ # For now, we do nothing to hide this and leave it up to the user.
73
+ # # value = value.first if value.is_a?(Array)
75
74
 
76
75
  if !!value && prop['type'] == 'datetime'
77
76
  # CMIS sends millis since epoch
78
- value = Time.at(value / 1000.0)
77
+ if value.is_a? Array
78
+ value.map! { |v| Time.at(v / 1000.0) }
79
+ else
80
+ value = Time.at(value / 1000.0)
81
+ end
79
82
  end
80
83
 
81
84
  value
@@ -68,7 +68,7 @@ module CMIS
68
68
  Type.new(result, self)
69
69
  end
70
70
 
71
- def has_type?(type_id)
71
+ def type?(type_id)
72
72
  type(type_id)
73
73
  true
74
74
  rescue Exceptions::ObjectNotFound
@@ -120,7 +120,7 @@ module CMIS
120
120
  value = value.strftime('%Y-%m-%dT%H:%M:%S.%L')
121
121
  "TIMESTAMP '#{value}'"
122
122
  else
123
- # TODO Correct escaping for find_object
123
+ # TODO: Correct escaping for find_object
124
124
  # value = value.gsub(BACKSLASH, BACKSLASH * 4).gsub(QUOTE, "#{BACKSLASH * 2}#{QUOTE}")
125
125
  "'#{value}'"
126
126
  end
@@ -130,7 +130,7 @@ module CMIS
130
130
  types = []
131
131
  a.each do |t|
132
132
  types << Type.new(t['type'], self)
133
- types << construct_types(t['children']) if t.has_key?('children')
133
+ types << construct_types(t['children']) if t.key?('children')
134
134
  end
135
135
  types.flatten
136
136
  end
@@ -1,6 +1,5 @@
1
1
  module CMIS
2
2
  class Server < Connection
3
-
4
3
  def initialize(options = {})
5
4
  super
6
5
  end
@@ -20,7 +19,7 @@ module CMIS
20
19
  Repository.new(result[repository_id], self)
21
20
  end
22
21
 
23
- def has_repository?(repository_id)
22
+ def repository?(repository_id)
24
23
  repository(repository_id)
25
24
  true
26
25
  rescue Exceptions::ObjectNotFound
@@ -1,3 +1,3 @@
1
1
  module CMIS
2
- VERSION = '0.3.8'
2
+ VERSION = '0.3.9'
3
3
  end
data/readme.md CHANGED
@@ -1,12 +1,15 @@
1
- # cmis-ruby
1
+ # CMIS ruby
2
2
 
3
- **cmis-ruby** is a [CMIS](http://chemistry.apache.org/project/cmis.html) client library, using the the CMIS browser binding ([CMIS 1.1](http://docs.oasis-open.org/cmis/CMIS/v1.1/CMIS-v1.1.html)) for Ruby.
3
+ [![Gem Version](https://badge.fury.io/rb/cmis-ruby.png)](http://badge.fury.io/rb/cmis-ruby)
4
+ [![Code Climate](https://codeclimate.com/github/UP-nxt/cmis-ruby.png)](https://codeclimate.com/github/UP-nxt/cmis-ruby)
5
+ [![Build Status](https://travis-ci.org/UP-nxt/cmis-ruby.png?branch=master)](https://travis-ci.org/UP-nxt/cmis-ruby)
6
+ [![Dependency Status](https://gemnasium.com/UP-nxt/cmis-ruby.png)](https://gemnasium.com/UP-nxt/cmis-ruby)
4
7
 
5
- ## Running Test
8
+ **CMIS ruby** is a [CMIS](http://chemistry.apache.org/project/cmis.html) client library, using the the CMIS browser binding ([CMIS 1.1](http://docs.oasis-open.org/cmis/CMIS/v1.1/CMIS-v1.1.html)) for Ruby.
6
9
 
7
- Running the tests requires a running CMIS server.
10
+ ## Running specs
8
11
 
9
- rake
12
+ Running the tests requires a separate CMIS server. The default rake task runs the specs.
10
13
 
11
14
  ## TODO
12
15
 
@@ -15,4 +18,4 @@ Running the tests requires a running CMIS server.
15
18
 
16
19
  ## Contributing
17
20
 
18
- Write some code. Run tests. Open a pull request.
21
+ Write some code. Run the specs. Open a pull request.
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ module CMIS
4
+ describe Document do
5
+ context 'when creating a document with content' do
6
+ it 'has properties and content' do
7
+ document = repository.new_document
8
+ document.name = 'apple_document'
9
+ document.object_type_id = 'cmis:document'
10
+ document.content = { stream: StringIO.new('apple is a fruit'),
11
+ mime_type: 'text/apple',
12
+ filename: 'apple.txt' }
13
+ document = document.create_in_folder(repository.root)
14
+
15
+ expect(document.content_stream_mime_type).to eq('text/apple')
16
+ expect(document.content_stream_file_name).to eq('apple.txt')
17
+ expect(document.content).to eq('apple is a fruit')
18
+
19
+ document.delete
20
+ end
21
+ end
22
+
23
+ context 'when creating a document without content' do
24
+ it 'has properties and no content' do
25
+ document = repository.new_document
26
+ document.name = 'apple_document'
27
+ document.object_type_id = 'cmis:document'
28
+ document = document.create_in_folder(repository.root)
29
+
30
+ expect(document.content_stream_mime_type).to be_nil
31
+ expect(document.content_stream_file_name).to be_nil
32
+ expect(document.content).to be_nil
33
+
34
+ document.delete
35
+ end
36
+ end
37
+
38
+ context 'when creating a document and then setting the content' do
39
+ it 'has properties and content' do
40
+ document = repository.new_document
41
+ document.name = 'apple_document'
42
+ document.object_type_id = 'cmis:document'
43
+ document = document.create_in_folder(repository.root)
44
+
45
+ document.content = { stream: StringIO.new('apple is a fruit'),
46
+ mime_type: 'text/apple',
47
+ filename: 'apple.txt' }
48
+
49
+ # Why doesn't this work?
50
+ # expect(document.content_stream_mime_type).to eq('text/apple')
51
+ # expect(document.content_stream_file_name).to eq('apple.txt')
52
+ expect(document.content).to eq('apple is a fruit')
53
+
54
+ document.delete
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ module CMIS
4
+ describe Folder do
5
+ describe '#parent' do
6
+ before do
7
+ @folder = create_folder
8
+ end
9
+
10
+ after do
11
+ @folder.delete
12
+ end
13
+
14
+ it 'is nil for the root folder' do
15
+ expect(repository.root.parent).to be_nil
16
+ end
17
+
18
+ it 'is the root folder for its child' do
19
+ expect(@folder.parent.cmis_object_id).to eq(repository.root_folder_id)
20
+ end
21
+
22
+ def create_folder
23
+ folder = repository.new_folder
24
+ folder.name = 'test_folder'
25
+ folder.object_type_id = 'cmis:folder'
26
+ repository.root.create(folder)
27
+ end
28
+ end
29
+
30
+ describe '#create' do
31
+ context 'when creating a relationship in a folder' do
32
+ it 'raises an exception' do
33
+ relationship = repository.new_relationship
34
+ relationship.name = 'test_relationship'
35
+ relationship.object_type_id = 'cmis:relationship'
36
+ expect {
37
+ repository.root.create(new_object)
38
+ }.to raise_exception
39
+ end
40
+ end
41
+
42
+ context 'when creating an item in a folder' do
43
+ it 'raises an exception' do
44
+ item = repository.new_item
45
+ item.name = 'test_item'
46
+ item.object_type_id = 'cmis:item'
47
+ item = repository.root.create(item)
48
+ expect(item).to be_a CMIS::Item
49
+ expect(item.name).to eq('test_item')
50
+ item.delete
51
+ end
52
+ end
53
+
54
+ context 'when creating a plain object in a folder' do
55
+ it 'raises an exception' do
56
+ new_object = CMIS::Object.new({}, repository)
57
+ new_object.name = 'object1'
58
+ new_object.object_type_id = 'cmis:folder'
59
+ expect {
60
+ repository.root.create(new_object)
61
+ }.to raise_exception
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ module CMIS
4
+ describe Object do
5
+ before do
6
+ @document = create_document
7
+ end
8
+
9
+ after do
10
+ @document.delete
11
+ end
12
+
13
+ describe '#properties' do
14
+ # Property accessor behavior...
15
+ end
16
+
17
+ describe '#object_type' do
18
+ it 'returns the type' do
19
+ expect(@document.object_type).to be_a CMIS::Type
20
+ expect(@document.object_type.id).to eq('cmis:document')
21
+ end
22
+ end
23
+
24
+ describe '#parents' do
25
+ it 'has the root as only parent' do
26
+ expect(@document.parents.size).to eq(1)
27
+ expect(@document.parents.first.cmis_object_id).to eq(repository.root_folder_id)
28
+ end
29
+ end
30
+
31
+ describe '#allowable_actions' do
32
+ it 'returns the allowable actions' do
33
+ actions = @document.allowable_actions
34
+ expect(actions).to_not be_nil
35
+ expect(actions).to_not be_empty
36
+ actions.values.each do |v|
37
+ expect([true, false]).to include(v)
38
+ end
39
+ end
40
+ end
41
+
42
+ describe '#relationships' do
43
+ it 'returns all relationships' do
44
+ relationships = @document.relationships
45
+ expect(relationships).to be_a_kind_of(Relationships)
46
+ relationships.each_relationship do |r|
47
+ expect(r).to be_a(Relationship)
48
+ end
49
+ end
50
+ end
51
+
52
+ describe '#unfile' do
53
+ it 'unfiles it from the parent folder' do
54
+ @document.unfile
55
+ expect(@document.parents).to be_empty
56
+ end
57
+ end
58
+
59
+ describe '#acls' do
60
+ it 'returns acls' do
61
+ acls = @document.acls
62
+ expect(acls).to have_key(:aces)
63
+ expect(acls).to have_key(:isExact)
64
+ expect([true, false]).to include(acls[:isExact])
65
+ end
66
+ end
67
+
68
+ def create_document
69
+ document = repository.new_document
70
+ document.name = 'test_document'
71
+ document.object_type_id = 'cmis:document'
72
+ repository.root.create(document)
73
+ end
74
+ end
75
+ end