vortex_client 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/Rakefile +1 -0
  2. data/VERSION +1 -1
  3. data/bin/vrtx-sync +94 -0
  4. data/lib/vortex_client.rb +211 -4
  5. metadata +5 -5
data/Rakefile CHANGED
@@ -10,6 +10,7 @@ begin
10
10
  gem.email = "thomas.flemming@usit.uio.no"
11
11
  gem.homepage = "http://github.com/thomasfl/vortex_client"
12
12
  gem.authors = ["Thomas Flemming"]
13
+ gem.executables = ["vrtx-sync"]
13
14
  gem.add_dependency "net_dav", ">= 0.4.1"
14
15
  gem.add_dependency "highline", ">= 1.5.1"
15
16
  gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.1
data/bin/vrtx-sync ADDED
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'uri'
4
+ require 'vortex_client'
5
+
6
+ # vrtx-sync: keep local files synced with webdav content
7
+ #
8
+ # Author: Thomas Flemming, thomasfl(at)usit.uio.no
9
+ # MIT License 2010
10
+
11
+ def print_usage
12
+ puts "usage: #{$0} URI [URI2 URI3..]"
13
+ puts ""
14
+ puts "Downloads resource from webdav server. File is "
15
+ puts "uploaded back to webdav server when file us updated"
16
+ puts "on local disk. "
17
+ exit
18
+ end
19
+
20
+ def download(url, vortex)
21
+ filename = url[/[^\/]*$/,0]
22
+ file = File.new(filename, "w")
23
+ begin
24
+ file.puts vortex.get(url).to_s
25
+ rescue Net::HTTPServerException => e
26
+ puts "Server error: " + e.to_s + " " + url
27
+ exit
28
+ end
29
+ path = file.path
30
+ file.close
31
+ return path
32
+ end
33
+
34
+
35
+ # Monitor files
36
+ class FileMon
37
+
38
+ def initialize(filenames)
39
+ @last_mtimes = { }
40
+ filenames.each do |filename|
41
+ raise "File does not exist: " + filename unless File.exist?(filename)
42
+ @last_mtimes[filename] = File.stat(filename).mtime
43
+ end
44
+ @filenames = filenames
45
+ end
46
+
47
+ def run(sleep=1, &on_update)
48
+ loop do
49
+ Kernel.sleep sleep until file_updated?
50
+ yield @updated_file
51
+ end
52
+ end
53
+
54
+ def file_updated?
55
+ @filenames.each do |filename|
56
+ mtime = File.stat(filename).mtime
57
+ updated = @last_mtimes[filename] < mtime
58
+ @last_mtimes[filename] = mtime
59
+ if(updated)
60
+ @updated_file = filename
61
+ return true
62
+ end
63
+ end
64
+ return false
65
+ end
66
+
67
+ end
68
+
69
+
70
+ if $*.size < 1
71
+ print_usage
72
+ end
73
+
74
+ url = $*[0]
75
+ if(ENV['DAVUSER'] and ENV['DAVPASS'])
76
+ vortex = Vortex::Connection.new(url, ENV['DAVUSER'], ENV['DAVPASS'])
77
+ else
78
+ vortex = Vortex::Connection.new(url)
79
+ end
80
+
81
+ downloaded_files = { }
82
+ $*.each do |url|
83
+ puts "Downloading: " + url
84
+ filename = download(url, vortex)
85
+ downloaded_files[filename] = url
86
+ end
87
+
88
+ FileMon.new(downloaded_files.keys).run do |filename|
89
+ url = downloaded_files[filename]
90
+ file = File.open(filename, "rb")
91
+ contents = file.read
92
+ puts "Uploading " + filename + " => " + url
93
+ vortex.put_string(url, contents)
94
+ end
data/lib/vortex_client.rb CHANGED
@@ -63,10 +63,9 @@ module Vortex
63
63
  def publish(object)
64
64
  if(object.is_a? HtmlArticle)
65
65
  uri = @uri.merge(object.url)
66
- # puts "URL: '" + uri.to_s
66
+ # puts "DEBUG: '" + object.properties
67
67
  self.put_string(uri, object.content)
68
68
  self.proppatch(uri, object.properties)
69
- # puts object.properties
70
69
  return uri.to_s
71
70
  else
72
71
  warn "Unknown vortex resource: " + object.class.to_s
@@ -83,6 +82,7 @@ module Vortex
83
82
  def create(object)
84
83
  if(object.is_a? ArticleListingCollection)
85
84
  uri = @uri.merge(object.url)
85
+ # puts "DEBUG: uri: " + uri.to_s
86
86
  self.mkdir(uri)
87
87
  self.proppatch(uri, object.properties)
88
88
  return uri.to_s
@@ -128,6 +128,213 @@ module Vortex
128
128
  if(@url)
129
129
  @url
130
130
  else
131
+ if(filename)
132
+ filename
133
+ end
134
+ if(title)
135
+ StringUtils.create_filename(title) + ".html"
136
+ else
137
+ warn "Article must have either a full url or title. "
138
+ end
139
+ end
140
+ end
141
+
142
+ def properties
143
+ props = '<v:resourceType xmlns:v="vrtx">article</v:resourceType>' +
144
+ '<v:xhtml10-type xmlns:v="vrtx">article</v:xhtml10-type>' +
145
+ '<v:userSpecifiedCharacterEncoding xmlns:v="vrtx">utf-8</v:userSpecifiedCharacterEncoding>'
146
+
147
+ if(@publishedDate and @publishedDate != "")
148
+ if(@publishedDate.kind_of? Time)
149
+ @publishedDate = @publishedDate.httpdate.to_s
150
+ end
151
+ props += '<v:published-date xmlns:v="vrtx">' + @publishedDate + '</v:published-date>'
152
+ end
153
+
154
+ if(date and date != "")
155
+ if(date.kind_of? Time)
156
+ date = @date.httpdate.to_s
157
+ end
158
+ if(@publishedDate == nil or @publishedDate != "")
159
+ props += '<v:published-date xmlns:v="vrtx">' + date + '</v:published-date>'
160
+ end
161
+ props += '<d:getlastmodified>' + date + '</d:getlastmodified>' +
162
+ '<v:contentLastModified xmlns:v="vrtx">' + date + '</v:contentLastModified>' +
163
+ '<v:propertiesLastModified xmlns:v="vrtx">' + date + '</v:propertiesLastModified>' +
164
+ '<v:creationTime xmlns:v="vrtx">' + date + '</v:creationTime>'
165
+ end
166
+ if(title)
167
+ props += '<v:userTitle xmlns:v="vrtx">' + title + '</v:userTitle>'
168
+ end
169
+ if(owner)
170
+ props += '<owner xmlns="vrtx">' + owner + '</owner>'
171
+ end
172
+ if(introduction and introduction != "")
173
+ props += '<introduction xmlns="vrtx">' + introduction + '</introduction>'
174
+ end
175
+ if(author and author != "")
176
+ props += '<v:authors xmlns:v="vrtx">' +
177
+ '<vrtx:values xmlns:vrtx="http://vortikal.org/xml-value-list">' +
178
+ '<vrtx:value>' + author + '</vrtx:value>' +
179
+ '</vrtx:values>' +
180
+ '</v:authors>'
181
+ end
182
+
183
+ if(tags and tags.kind_of?(Array) and tags.size > 0)
184
+ props += '<v:tags xmlns:v="vrtx">' +
185
+ '<vrtx:values xmlns:vrtx="http://vortikal.org/xml-value-list">'
186
+ tags.each do |tag|
187
+ props += "<vrtx:value>#{tag}</vrtx:value>"
188
+ end
189
+ props += '</vrtx:values></v:tags>'
190
+ end
191
+
192
+ return props
193
+ end
194
+
195
+ def content
196
+ content = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ' +
197
+ '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' +
198
+ '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>' + title + '</title>' +
199
+ ' <link href="http://www.uio.no/profil/kupu/kupucontentstyles.css" type="text/css" rel="stylesheet"/>' +
200
+ '</head><body>'
201
+ if(body)
202
+ content += body
203
+ end
204
+ content += '</body></html>'
205
+ end
206
+
207
+ end
208
+
209
+
210
+ # Plain HTML files with title, introduction and keywords set as webdav properties.
211
+ #
212
+ # Examples:
213
+ #
214
+ # article = HtmlArticle.new(:title => "Sample Title",
215
+ # :introduction => "Introduction",
216
+ # :body => "<p>Hello world</p>")
217
+ # vortex.publish(article)
218
+ class HtmlArticle < PlainFile
219
+
220
+ attr_accessor :title, :introduction, :body, :filename, :modifiedDate, :publishedDate, :owner, :url, :author, :date, :tags
221
+
222
+ # Create a new article of type html-article: plain html file with introduction stored as a webdav property.
223
+ def initialize(options={})
224
+ options.each{|k,v|send("#{k}=",v)}
225
+ end
226
+
227
+ def url
228
+ if(@url)
229
+ @url
230
+ else
231
+ if(filename)
232
+ filename
233
+ end
234
+ if(title)
235
+ StringUtils.create_filename(title) + ".html"
236
+ else
237
+ warn "Article must have either a full url or title. "
238
+ end
239
+ end
240
+ end
241
+
242
+ def properties
243
+ props = '<v:resourceType xmlns:v="vrtx">article</v:resourceType>' +
244
+ '<v:xhtml10-type xmlns:v="vrtx">article</v:xhtml10-type>' +
245
+ '<v:userSpecifiedCharacterEncoding xmlns:v="vrtx">utf-8</v:userSpecifiedCharacterEncoding>'
246
+
247
+ if(@publishedDate and @publishedDate != "")
248
+ if(@publishedDate.kind_of? Time)
249
+ @publishedDate = @publishedDate.httpdate.to_s
250
+ end
251
+ props += '<v:published-date xmlns:v="vrtx">' + @publishedDate + '</v:published-date>'
252
+ end
253
+
254
+ if(date and date != "")
255
+ if(date.kind_of? Time)
256
+ date = @date.httpdate.to_s
257
+ end
258
+ if(@publishedDate == nil or @publishedDate != "")
259
+ props += '<v:published-date xmlns:v="vrtx">' + date + '</v:published-date>'
260
+ end
261
+ props += '<d:getlastmodified>' + date + '</d:getlastmodified>' +
262
+ '<v:contentLastModified xmlns:v="vrtx">' + date + '</v:contentLastModified>' +
263
+ '<v:propertiesLastModified xmlns:v="vrtx">' + date + '</v:propertiesLastModified>' +
264
+ '<v:creationTime xmlns:v="vrtx">' + date + '</v:creationTime>'
265
+ end
266
+ if(title)
267
+ props += '<v:userTitle xmlns:v="vrtx">' + title + '</v:userTitle>'
268
+ end
269
+ if(owner)
270
+ props += '<owner xmlns="vrtx">' + owner + '</owner>'
271
+ end
272
+ if(introduction and introduction != "")
273
+ props += '<introduction xmlns="vrtx">' + introduction + '</introduction>'
274
+ end
275
+ if(author and author != "")
276
+ props += '<v:authors xmlns:v="vrtx">' +
277
+ '<vrtx:values xmlns:vrtx="http://vortikal.org/xml-value-list">' +
278
+ '<vrtx:value>' + author + '</vrtx:value>' +
279
+ '</vrtx:values>' +
280
+ '</v:authors>'
281
+ end
282
+
283
+ if(tags and tags.kind_of?(Array) and tags.size > 0)
284
+ props += '<v:tags xmlns:v="vrtx">' +
285
+ '<vrtx:values xmlns:vrtx="http://vortikal.org/xml-value-list">'
286
+ tags.each do |tag|
287
+ props += "<vrtx:value>#{tag}</vrtx:value>"
288
+ end
289
+ props += '</vrtx:values></v:tags>'
290
+ end
291
+
292
+ return props
293
+ end
294
+
295
+ def content
296
+ content = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ' +
297
+ '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' +
298
+ '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>' + title + '</title>' +
299
+ ' <link href="http://www.uio.no/profil/kupu/kupucontentstyles.css" type="text/css" rel="stylesheet"/>' +
300
+ '</head><body>'
301
+ if(body)
302
+ content += body
303
+ end
304
+ content += '</body></html>'
305
+ end
306
+
307
+ end
308
+
309
+
310
+
311
+ # Event
312
+ #
313
+ # Examples:
314
+ #
315
+ # event = HtmlEvent.new(:title => "Sample Event",
316
+ # :introduction => "Introduction",
317
+ # :body => "<p>Hello world</p>",
318
+ # :startDatetime => Time.now,
319
+ # :endDatetime => Time.now + (60*60*60),
320
+ # :venue => "Vilhelm Bjerkes hus, Rom 207" )
321
+ # vortex.publish(article)
322
+ class HtmlEvent < PlainFile
323
+
324
+ attr_accessor :title, :introduction, :body, :filename, :modifiedDate, :publishedDate, :owner, :url, :author, :date, :tags
325
+
326
+ # Create a new article of type html-article: plain html file with introduction stored as a webdav property.
327
+ def initialize(options={})
328
+ options.each{|k,v|send("#{k}=",v)}
329
+ end
330
+
331
+ def url
332
+ if(@url)
333
+ @url
334
+ else
335
+ if(filename)
336
+ filename
337
+ end
131
338
  if(title)
132
339
  StringUtils.create_filename(title) + ".html"
133
340
  else
@@ -177,7 +384,7 @@ module Vortex
177
384
  '</v:authors>'
178
385
  end
179
386
 
180
- if(tags and tags.kind_of?(Array))
387
+ if(tags and tags.kind_of?(Array) and tags.size > 0)
181
388
  props += '<v:tags xmlns:v="vrtx">' +
182
389
  '<vrtx:values xmlns:vrtx="http://vortikal.org/xml-value-list">'
183
390
  tags.each do |tag|
@@ -204,7 +411,7 @@ module Vortex
204
411
  end
205
412
 
206
413
 
207
- # Vortex article stored as JSON data.
414
+ # Vortex article stored as JSON data. This is just a stub.
208
415
  class StructuredArticle < PlainFile
209
416
 
210
417
  attr_accessor :title, :introduction, :content, :filename, :modifiedDate, :publishedDate, :owner, :url
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vortex_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Flemming
@@ -9,8 +9,8 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-08 00:00:00 +01:00
13
- default_executable:
12
+ date: 2010-01-21 00:00:00 +01:00
13
+ default_executable: vrtx-sync
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: net_dav
@@ -44,8 +44,8 @@ dependencies:
44
44
  version:
45
45
  description: Utility for managing content on Vortex web content management system through webdav
46
46
  email: thomas.flemming@usit.uio.no
47
- executables: []
48
-
47
+ executables:
48
+ - vrtx-sync
49
49
  extensions: []
50
50
 
51
51
  extra_rdoc_files: