woodwing_elvis 0.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 +7 -0
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/LICENSE +1 -0
- data/README.md +14 -0
- data/Rakefile +2 -0
- data/lib/woodwing.rb +16 -0
- data/lib/woodwing/elvis.rb +273 -0
- data/lib/woodwing/elvis/rest.rb +30 -0
- data/lib/woodwing/elvis/rest/authorization_keys.rb +31 -0
- data/lib/woodwing/elvis/rest/browse.rb +65 -0
- data/lib/woodwing/elvis/rest/checkout.rb +24 -0
- data/lib/woodwing/elvis/rest/create.rb +71 -0
- data/lib/woodwing/elvis/rest/create_elvislink.rb +148 -0
- data/lib/woodwing/elvis/rest/folders.rb +27 -0
- data/lib/woodwing/elvis/rest/login_logout.rb +257 -0
- data/lib/woodwing/elvis/rest/relations.rb +24 -0
- data/lib/woodwing/elvis/rest/search.rb +156 -0
- data/lib/woodwing/elvis/rest/stub.rb +11 -0
- data/lib/woodwing/elvis/soap.rb +18 -0
- data/lib/woodwing/elvis/soap/stub.rb +11 -0
- data/lib/woodwing/elvis/utilities.rb +80 -0
- data/lib/woodwing/elvis/utilities/pmask.rb +52 -0
- data/lib/woodwing/version.rb +5 -0
- data/test/elvis_search.rb +416 -0
- data/woodwing_elvis.gemspec +23 -0
- metadata +98 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6ea949496d1f812078942642edaec4ba77633479
|
4
|
+
data.tar.gz: 7b5be281d4ac85ad6b0c75c713847388a1758c13
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3a4b656cbb4a5051e5a3d922922d26d320ee9e5b10366eaa4aa753ec989e08e23fc0d710d150d0640342496d9135c784fbd416292efe4f00b10e678b49ea9581
|
7
|
+
data.tar.gz: 925d473f24b19506abd07714614284dce20b4a973cd36e0100563781e0c9ce16b4430f4916eb0a783100588347b21fe0a54f8805b2bf8efee424d93264227ef3
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
You want it; its yours.
|
data/README.md
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
woodwing_elvis
|
2
|
+
==============
|
3
|
+
|
4
|
+
A Ruby implementation of Woodwing's Elvis API
|
5
|
+
|
6
|
+
System environment variables used:
|
7
|
+
|
8
|
+
Name Default
|
9
|
+
----------------- -------------------------------
|
10
|
+
ELVIS_API_URL http://localhost:8080/services/
|
11
|
+
ELVIS_USER guest
|
12
|
+
ELVIS_PASS guest
|
13
|
+
|
14
|
+
|
data/Rakefile
ADDED
data/lib/woodwing.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
###################################################
|
2
|
+
###
|
3
|
+
## File: woodwing.rb
|
4
|
+
## Desc: API definitions for WoodWing products
|
5
|
+
#
|
6
|
+
|
7
|
+
require "url_safe_base64"
|
8
|
+
require 'rest_client'
|
9
|
+
require 'multi_json'
|
10
|
+
|
11
|
+
module WoodWing
|
12
|
+
require_relative 'woodwing/version'
|
13
|
+
require_relative 'woodwing/elvis'
|
14
|
+
end # module WoodWing
|
15
|
+
|
16
|
+
WW = WoodWing unless defined?(WW)
|
@@ -0,0 +1,273 @@
|
|
1
|
+
###################################################
|
2
|
+
###
|
3
|
+
## File: rest.rb
|
4
|
+
## Desc: REST API definitions for WoodWing's Elvis
|
5
|
+
#
|
6
|
+
|
7
|
+
require_relative 'elvis/utilities'
|
8
|
+
require_relative 'elvis/rest'
|
9
|
+
require_relative 'elvis/soap'
|
10
|
+
|
11
|
+
module WoodWing
|
12
|
+
|
13
|
+
# Elvis is a Digital Asset Manager implemented in Java
|
14
|
+
class Elvis
|
15
|
+
|
16
|
+
attr_accessor :base_url
|
17
|
+
attr_accessor :cookies
|
18
|
+
|
19
|
+
# SMELL: Why is this error any more special than the others?
|
20
|
+
class ConcurrentModificationException < StandardError; end
|
21
|
+
class NotLoggedIn < StandardError; end
|
22
|
+
|
23
|
+
|
24
|
+
COMMANDS = {
|
25
|
+
# method name URL Resource Required Parameters
|
26
|
+
browse: ["browse", [:path]],
|
27
|
+
checkout: ["checkout", []],
|
28
|
+
copy: ["copy", [:source, :target]],
|
29
|
+
create: ["create", [:assetPath, :Filedata]],
|
30
|
+
create: ["create", [:Filedata]],
|
31
|
+
create_auth_key: ["create_auth_key", []],
|
32
|
+
create_collection: ["create", [:assetPath]],
|
33
|
+
create_relation: ["create_relation", []],
|
34
|
+
create_folder: ["createFolder", [:path]],
|
35
|
+
localization: ["localization", []],
|
36
|
+
log_usage_stats: ["log_usage_stats", []],
|
37
|
+
login: ["login", [:username, :password]],
|
38
|
+
logout: ["logout", []],
|
39
|
+
move: ["move", [:source, :target]],
|
40
|
+
profile: ["profile", []],
|
41
|
+
query_stats: ["queryStats", []],
|
42
|
+
remove_bulk: ["remove", [:q]],
|
43
|
+
remove_bulk_ids: ["remove", [:ids]],
|
44
|
+
remove_folder: ["remove", [:folderPath]],
|
45
|
+
remove_relation: ["remove_relation", []],
|
46
|
+
revoke_auth_keys: ["revoke_auth_keys",[]],
|
47
|
+
search: ["search", [:q]],
|
48
|
+
undo_checkout: ["undo_checkout", []],
|
49
|
+
update: ["update", [:Filedata, :id]],
|
50
|
+
update_metadata: ["update", [:id, :metadata]],
|
51
|
+
update_auth_key: ["update_auth_key", []],
|
52
|
+
update_bulk_metadata: ["updatebulk", [:q, :metadata]],
|
53
|
+
zip_download: ["zip_download", []]
|
54
|
+
}
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
def initialize( my_base_url=ENV['ELVIS_API_URL'],
|
59
|
+
my_cookies={})
|
60
|
+
|
61
|
+
@base_url = my_base_url
|
62
|
+
@cookies = my_cookies
|
63
|
+
|
64
|
+
@base_url += '/' unless @base_url.end_with?('/')
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
# Use RestClient.get
|
70
|
+
|
71
|
+
def get_response(url=nil,options={})
|
72
|
+
|
73
|
+
raise NotLoggedIn unless logged_in? || url.end_with?('login')
|
74
|
+
|
75
|
+
response = RestClient.get(url, { params: options, cookies: @cookies })
|
76
|
+
|
77
|
+
if $DEBUG
|
78
|
+
debug_me(){[:url, :options, :response ]}
|
79
|
+
debug_me(){[ 'response.code', 'response.cookies', 'response.body' ]}
|
80
|
+
end
|
81
|
+
|
82
|
+
@cookies = response.cookies unless response.cookies.empty?
|
83
|
+
|
84
|
+
response = MultiJson.load( response.body,
|
85
|
+
:symbolize_keys => true)
|
86
|
+
|
87
|
+
if response.include?(:errorcode)
|
88
|
+
if 401 == response[:errorcode] &&
|
89
|
+
response[:message].include?('ConcurrentModificationException')
|
90
|
+
raise ConcurrentModificationException
|
91
|
+
else
|
92
|
+
error_condition = "ERROR #{response[:errorcode]}: #{response[:message]}"
|
93
|
+
raise error_condition
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
return response
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
# SMELL: This is sooooo close to #get_response
|
102
|
+
# Use RestClient.post
|
103
|
+
|
104
|
+
def get_response_using_post(url=nil,options={})
|
105
|
+
|
106
|
+
raise NotLoggedIn unless logged_in? || url.end_with?('login')
|
107
|
+
|
108
|
+
response = RestClient.post( url, options, { cookies: @cookies } )
|
109
|
+
|
110
|
+
if $DEBUG
|
111
|
+
debug_me(){[:url, :options, :response ]}
|
112
|
+
debug_me(){[ 'response.code', 'response.cookies', 'response.body' ]}
|
113
|
+
end
|
114
|
+
|
115
|
+
@cookies = response.cookies unless response.cookies.empty?
|
116
|
+
|
117
|
+
response = MultiJson.load( response.body,
|
118
|
+
:symbolize_keys => true)
|
119
|
+
|
120
|
+
if response.include?(:errorcode)
|
121
|
+
if 401 == response[:errorcode] &&
|
122
|
+
response[:message].include?('ConcurrentModificationException')
|
123
|
+
raise ConcurrentModificationException
|
124
|
+
else
|
125
|
+
error_condition = "ERROR #{response[:errorcode]}: #{response[:message]}"
|
126
|
+
raise error_condition
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
return response
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
# https://elvis.tenderapp.com/kb/api/rest-copy
|
136
|
+
def copy(options={})
|
137
|
+
Utilities.demand_required_options!( :copy, options )
|
138
|
+
url = base_url + "copy"
|
139
|
+
response = get_response(url, options)
|
140
|
+
end # copy
|
141
|
+
|
142
|
+
|
143
|
+
# No file is uploaded. A placehold asset is created with the
|
144
|
+
# associated metadata
|
145
|
+
def create_collection(options={})
|
146
|
+
Utilities.demand_required_options!( :create_collection, options )
|
147
|
+
url = base_url + "create"
|
148
|
+
options.merge!( {assetType: 'collection'} )
|
149
|
+
response = get_response(url, options)
|
150
|
+
end # create
|
151
|
+
|
152
|
+
|
153
|
+
# https://elvis.tenderapp.com/kb/api/rest-localization
|
154
|
+
def localization(options={})
|
155
|
+
url = base_url + "localization"
|
156
|
+
response = get_response(url, options)
|
157
|
+
end # localization
|
158
|
+
|
159
|
+
|
160
|
+
# https://elvis.tenderapp.com/kb/api/rest-log_usage_stats
|
161
|
+
def log_usage_stats(options={})
|
162
|
+
url = base_url + "log_usage_stats"
|
163
|
+
response = get_response(url, options)
|
164
|
+
end # log_usage_stats
|
165
|
+
|
166
|
+
|
167
|
+
# https://elvis.tenderapp.com/kb/api/rest-move
|
168
|
+
def move(options={})
|
169
|
+
Utilities.demand_required_options!( :move, options )
|
170
|
+
url = base_url + "move"
|
171
|
+
response = get_response(url, options)
|
172
|
+
end # move
|
173
|
+
|
174
|
+
alias :rename :move
|
175
|
+
|
176
|
+
|
177
|
+
# https://elvis.tenderapp.com/kb/api/rest-profile
|
178
|
+
def profile(options={})
|
179
|
+
url = base_url + "profile"
|
180
|
+
response = get_response(url, options)
|
181
|
+
end # profile
|
182
|
+
|
183
|
+
|
184
|
+
# https://elvis.tenderapp.com/kb/api/rest-query_stats
|
185
|
+
def query_stats(options={})
|
186
|
+
url = base_url + "queryStats"
|
187
|
+
response = get_response(url, options)
|
188
|
+
end # query_stats
|
189
|
+
|
190
|
+
|
191
|
+
# https://elvis.tenderapp.com/kb/api/rest-remove
|
192
|
+
# can delete one or more using list of IDs or a search query
|
193
|
+
# pr a folderPath. The folderPath process has been abstracted
|
194
|
+
# into #remove_folder.
|
195
|
+
|
196
|
+
def remove_bulk(options={})
|
197
|
+
Utilities.demand_required_options!( :remove_bulk, options )
|
198
|
+
url = base_url + "remove"
|
199
|
+
response = get_response(url, options)
|
200
|
+
end # remove
|
201
|
+
|
202
|
+
alias :delete_bulk :remove_bulk
|
203
|
+
|
204
|
+
|
205
|
+
# https://elvis.tenderapp.com/kb/api/rest-remove
|
206
|
+
# can delete one or more using list of IDs or a search query
|
207
|
+
# pr a folderPath. The folderPath process has been abstracted
|
208
|
+
# into #remove_folder.
|
209
|
+
|
210
|
+
def remove_bulk_ids(options={})
|
211
|
+
Utilities.demand_required_options!( :remove_bulk_ids, options )
|
212
|
+
url = base_url + "remove"
|
213
|
+
response = get_response(url, options)
|
214
|
+
end # remove
|
215
|
+
|
216
|
+
alias :delete_bulk_ids :remove_bulk_ids
|
217
|
+
|
218
|
+
|
219
|
+
# https://elvis.tenderapp.com/kb/api/rest-update
|
220
|
+
# used to update assets and metadata
|
221
|
+
def update(options={})
|
222
|
+
Utilities.demand_required_options!( :update, options )
|
223
|
+
url = base_url + "update"
|
224
|
+
response = get_response(url, options)
|
225
|
+
end # update
|
226
|
+
|
227
|
+
alias :replace :update
|
228
|
+
alias :update_asset :update
|
229
|
+
alias :replace_asset :update
|
230
|
+
|
231
|
+
|
232
|
+
# https://elvis.tenderapp.com/kb/api/rest-update
|
233
|
+
# used to update metadata for a specific asset referenced by 'id'
|
234
|
+
|
235
|
+
def update_metadata(options={})
|
236
|
+
Utilities.demand_required_options!( :update, options )
|
237
|
+
options[:metadata] = options[:metadata].to_json
|
238
|
+
url = base_url + "update"
|
239
|
+
response = get_response(url, options)
|
240
|
+
end # update
|
241
|
+
|
242
|
+
alias :replace_metadata :update_metadata
|
243
|
+
|
244
|
+
|
245
|
+
# https://elvis.tenderapp.com/kb/api/rest-updatebulk
|
246
|
+
# updates metadata fields for all assets matching a specific query
|
247
|
+
def update_bulk_metadata(options={})
|
248
|
+
Utilities.demand_required_options!( :update_bulk_metadata, options )
|
249
|
+
options[:metadata] = options[:metadata].to_json
|
250
|
+
url = base_url + "updatebulk"
|
251
|
+
response = get_response(url, options)
|
252
|
+
end # update_bulk
|
253
|
+
|
254
|
+
alias :bulk_update_metadata :update_bulk_metadata
|
255
|
+
alias :bulk_replace_metadata :update_bulk_metadata
|
256
|
+
alias :replace_bulk_metadata :update_bulk_metadata
|
257
|
+
|
258
|
+
|
259
|
+
# https://elvis.tenderapp.com/kb/api/rest-zip_download
|
260
|
+
def zip_download(options={})
|
261
|
+
url = base_url + "zip_download"
|
262
|
+
response = get_response(url, options)
|
263
|
+
end # zip_download
|
264
|
+
|
265
|
+
alias :download_zip :zip_download
|
266
|
+
|
267
|
+
end # class Elvis
|
268
|
+
|
269
|
+
end # module WoodWing
|
270
|
+
|
271
|
+
|
272
|
+
WW = WoodWing unless defined?(WW)
|
273
|
+
WwElvis = WoodWing::Elvis unless defined?(WwElvis)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
###################################################
|
2
|
+
###
|
3
|
+
## File: rest.rb
|
4
|
+
## Desc: REST API definitions for WoodWing's Elvis
|
5
|
+
#
|
6
|
+
|
7
|
+
module WoodWing
|
8
|
+
class Elvis
|
9
|
+
|
10
|
+
module Rest
|
11
|
+
|
12
|
+
require_relative 'rest/authorization_keys'
|
13
|
+
require_relative 'rest/browse'
|
14
|
+
require_relative 'rest/checkout'
|
15
|
+
require_relative 'rest/create'
|
16
|
+
require_relative 'rest/create_elvislink'
|
17
|
+
require_relative 'rest/login_logout'
|
18
|
+
require_relative 'rest/relations'
|
19
|
+
require_relative 'rest/search'
|
20
|
+
require_relative 'rest/stub'
|
21
|
+
|
22
|
+
end # module WoodWing::Elvis::Rest
|
23
|
+
|
24
|
+
include Rest
|
25
|
+
|
26
|
+
end # class Elvis
|
27
|
+
end # module WoodWing
|
28
|
+
|
29
|
+
WW = WoodWing unless defined?(WW)
|
30
|
+
WwElvis = WoodWing::Elvis unless defined?(WwElvis)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module WoodWing
|
2
|
+
class Elvis
|
3
|
+
module Rest
|
4
|
+
|
5
|
+
|
6
|
+
# https://elvis.tenderapp.com/kb/api/rest-createauthkey
|
7
|
+
def create_auth_key(options={})
|
8
|
+
url = base_url + "create_auth_key"
|
9
|
+
response = get_response(url, options)
|
10
|
+
end # create_auth_key
|
11
|
+
|
12
|
+
|
13
|
+
# https://elvis.tenderapp.com/kb/api/rest-update_auth_key
|
14
|
+
def update_auth_key(options={})
|
15
|
+
url = base_url + "update_auth_key"
|
16
|
+
response = get_response(url, options)
|
17
|
+
end # update_auth_key
|
18
|
+
|
19
|
+
alias :replace_auth_key :update_auth_key
|
20
|
+
|
21
|
+
|
22
|
+
# https://elvis.tenderapp.com/kb/api/rest-revokeauthkeys
|
23
|
+
def revoke_auth_keys(options={})
|
24
|
+
url = base_url + "revoke_auth_keys"
|
25
|
+
response = get_response(url, options)
|
26
|
+
end # revoke_auth_keys
|
27
|
+
|
28
|
+
|
29
|
+
end # module Rest
|
30
|
+
end # class Elvis
|
31
|
+
end # module WoodWing
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module WoodWing
|
2
|
+
class Elvis
|
3
|
+
module Rest
|
4
|
+
|
5
|
+
|
6
|
+
# https://elvis.tenderapp.com/kb/api/rest-browse
|
7
|
+
#
|
8
|
+
# browse folders and show their subfolders and collections,
|
9
|
+
# similar to how folder browsing works in the Elvis desktop client.
|
10
|
+
#
|
11
|
+
# Note: Even though it is possible to return the assets in folders,
|
12
|
+
# doing so is not advised. The browse call does not limit the
|
13
|
+
# number of results, so if there are 10000 assets in a folder
|
14
|
+
# it will return all of them. It is better to use a search to
|
15
|
+
# find the assets in a folder and fetch them in pages.
|
16
|
+
#
|
17
|
+
# http://yourserver.com/services/browse
|
18
|
+
# ?path=<assetPath>
|
19
|
+
# &fromRoot=<folderPath>
|
20
|
+
# &includeFolders=<true|false>
|
21
|
+
# &includeAssets=<true|false>
|
22
|
+
# &includeExtensions=<comma-delimited extensions>
|
23
|
+
#
|
24
|
+
# Options
|
25
|
+
# path (Required) The path to the folder in Elvis you want to list.
|
26
|
+
# Make sure the URL is properly URL-encoded, for example: spaces should
|
27
|
+
# often be represented as %20.
|
28
|
+
#
|
29
|
+
# fromRoot Allows returning multiple levels of folders with their
|
30
|
+
# children. When specified, this path is listed, and all folders
|
31
|
+
# below it up to the 'path' will have their children returned as well.
|
32
|
+
#
|
33
|
+
# This ability can be used to initialize an initial path in a
|
34
|
+
# column tree folder browser with one server call.
|
35
|
+
#
|
36
|
+
# Optional. When not specified, only the children of the specified
|
37
|
+
# 'path' will be returned.
|
38
|
+
#
|
39
|
+
# Available since Elvis 2.6
|
40
|
+
#
|
41
|
+
# includeFolders Indicates if folders should be returned.
|
42
|
+
# Optional. Default is true.
|
43
|
+
#
|
44
|
+
# includeAsset Indicates if files should be returned.
|
45
|
+
# Optional. Default is true, but filtered to
|
46
|
+
# only include 'container' assets.
|
47
|
+
#
|
48
|
+
# includeExtensions A comma separated list of file extensions to
|
49
|
+
# be returned. Specify 'all' to return all file types.
|
50
|
+
# Optional. Default includes all 'container'
|
51
|
+
# assets: .collection, .dossier, .task
|
52
|
+
|
53
|
+
def browse(options={})
|
54
|
+
|
55
|
+
Utilities.demand_required_options!( :browse, options )
|
56
|
+
|
57
|
+
url = base_url + "browse"
|
58
|
+
response = get_response(url, options)
|
59
|
+
|
60
|
+
end # browse
|
61
|
+
|
62
|
+
|
63
|
+
end # module Rest
|
64
|
+
end # class Elvis
|
65
|
+
end # module WoodWing
|