pho 0.6.2 → 0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/CHANGES +12 -0
  2. data/Rakefile +1 -1
  3. data/bin/talis_store +98 -24
  4. data/doc/rdoc/classes/Pho.html +15 -0
  5. data/doc/rdoc/classes/Pho/CommandLine.html +353 -91
  6. data/doc/rdoc/classes/Pho/DatatypeProperty.html +12 -12
  7. data/doc/rdoc/classes/Pho/Enrichment/StoreEnricher.html +29 -29
  8. data/doc/rdoc/classes/Pho/Etags.html +36 -36
  9. data/doc/rdoc/classes/Pho/Facet/Results.html +19 -19
  10. data/doc/rdoc/classes/Pho/Facet/Term.html +6 -6
  11. data/doc/rdoc/classes/Pho/FieldPredicateMap.html +105 -106
  12. data/doc/rdoc/classes/Pho/FieldWeighting.html +12 -12
  13. data/doc/rdoc/classes/Pho/FileManagement/RDFManager.html +31 -8
  14. data/doc/rdoc/classes/Pho/Job.html +64 -64
  15. data/doc/rdoc/classes/Pho/Jobs.html +60 -60
  16. data/doc/rdoc/classes/Pho/QueryProfile.html +60 -60
  17. data/doc/rdoc/classes/Pho/RDF/Parser.html +28 -26
  18. data/doc/rdoc/classes/Pho/ResourceHash/Converter.html +36 -36
  19. data/doc/rdoc/classes/Pho/ResourceHash/SetAlgebra.html +12 -12
  20. data/doc/rdoc/classes/Pho/Snapshot.html +35 -35
  21. data/doc/rdoc/classes/Pho/Status.html +26 -26
  22. data/doc/rdoc/classes/Pho/Store.html +289 -245
  23. data/doc/rdoc/classes/Pho/StoreSparqlClient.html +14 -14
  24. data/doc/rdoc/classes/String.html +1 -1
  25. data/doc/rdoc/created.rid +1 -1
  26. data/doc/rdoc/files/CHANGES.html +35 -1
  27. data/doc/rdoc/files/lib/pho/command_line_rb.html +1 -1
  28. data/doc/rdoc/files/lib/pho/converter_rb.html +1 -1
  29. data/doc/rdoc/files/lib/pho/field_predicate_map_rb.html +1 -1
  30. data/doc/rdoc/files/lib/pho/rdf_collection_rb.html +1 -1
  31. data/doc/rdoc/files/lib/pho/rdf_rb.html +1 -1
  32. data/doc/rdoc/files/lib/pho/store_rb.html +1 -1
  33. data/doc/rdoc/files/lib/pho_rb.html +2 -1
  34. data/doc/rdoc/fr_class_index.html +3 -0
  35. data/doc/rdoc/fr_file_index.html +1 -0
  36. data/doc/rdoc/fr_method_index.html +153 -141
  37. data/lib/pho.rb +3 -0
  38. data/lib/pho/command_line.rb +139 -14
  39. data/lib/pho/field_predicate_map.rb +1 -2
  40. data/lib/pho/oai.rb +58 -0
  41. data/lib/pho/rdf.rb +2 -0
  42. data/lib/pho/rdf_collection.rb +16 -4
  43. data/lib/pho/store.rb +23 -5
  44. data/tests/tc_command_line.rb +229 -0
  45. data/tests/tc_field_predicate_map.rb +5 -1
  46. data/tests/tc_metabox.rb +29 -1
  47. data/tests/tc_oai.rb +31 -0
  48. data/tests/tc_rdf_collection.rb +80 -15
  49. data/tests/ts_pho.rb +3 -1
  50. metadata +5 -2
data/lib/pho.rb CHANGED
@@ -24,6 +24,7 @@ require 'pho/command_line'
24
24
  #Following depend on redland
25
25
  require 'pho/converter'
26
26
  require 'pho/rdf'
27
+ require 'pho/oai'
27
28
 
28
29
  if RUBY_VERSION < "1.8.7"
29
30
  class String
@@ -39,6 +40,8 @@ module Pho
39
40
  ACCEPT_JSON = { "Accept" => "application/json" }.freeze
40
41
 
41
42
  RDF_XML = {"Content-Type"=>"application/rdf+xml"}.freeze
43
+ TURTLE = {"Content-Type"=>"text/turtle"}.freeze
44
+ NTRIPLES = {"Content-Type"=>"text/plain"}.freeze
42
45
 
43
46
  class Namespaces
44
47
 
@@ -3,20 +3,56 @@ module Pho
3
3
  #Class that implements the command-line behaviour
4
4
  class CommandLine
5
5
 
6
- def initialize(store, opts)
7
- @store = store
8
- @opts = opts
6
+ def initialize(opts, env, store=nil)
7
+ @opts = opts
8
+ @env = env
9
+
10
+ if username() == nil
11
+ raise "no <username>"
12
+ end
13
+ if password() == nil
14
+ raise "no <password>"
15
+ end
16
+ if storename() == nil && store == nil
17
+ raise "no <store>"
18
+ end
19
+
20
+ @store = Pho::Store.new(storename(), username(), password()) if store == nil
21
+ @store = store if store != nil
22
+
23
+ end
24
+
25
+ def username()
26
+ return @opts["username"] if @opts["username"]
27
+ return @env["TALIS_USER"] if @env["TALIS_USER"]
28
+ return nil
29
+ end
30
+
31
+ def password()
32
+ return @opts["password"] if @opts["password"]
33
+ return @env["TALIS_PASS"] if @env["TALIS_PASS"]
34
+ return nil
35
+ end
36
+
37
+ def storename()
38
+ store = nil
39
+ store = @env["TALIS_STORE"] if @env["TALIS_STORE"]
40
+ store = @opts["store"] if @opts["store"]
41
+ if store != nil && !store.start_with?("http")
42
+ store = "http://api.talis.com/stores/#{store}"
43
+ end
44
+ return store
9
45
  end
10
46
 
11
47
  def status()
12
48
  status = Pho::Status.read_from_store(@store)
13
- puts "Store Status:\nReadable: #{status.readable?}\nWritable: #{status.writeable?}"
49
+ puts "Status of Store #{@store.storeuri}:\nReadable: #{status.readable?}\nWritable: #{status.writeable?}"
14
50
  end
15
51
 
16
52
  def backup()
17
- puts "Submitting Snapshot Job"
53
+ puts "Submitting Snapshot Job to Store #{@store.storeuri}"
18
54
  resp = Pho::Jobs.submit_snapshot(@store, "Reindex", Time.now)
19
- puts "Monitoring Job"
55
+ puts "Monitoring Snapshot Job: #{resp.header["Location"].first}"
20
56
  job = Pho::Jobs.wait_for_submitted(resp, @store) do |job, message, time|
21
57
  puts "#{time} #{message}"
22
58
  end
@@ -29,9 +65,9 @@ module Pho
29
65
  end
30
66
 
31
67
  def snapshot()
32
- puts "Submitting Snapshot Job"
68
+ puts "Submitting Snapshot Job to Store #{@store.storeuri}"
33
69
  resp = Pho::Jobs.submit_snapshot(@store, "Reindex", Time.now)
34
- puts "Monitoring Job"
70
+ puts "Monitoring Snapshot Job #{resp.header["Location"].first}"
35
71
  job = Pho::Jobs.wait_for_submitted(resp, @store) do |job, message, time|
36
72
  puts "#{time} #{message}"
37
73
  end
@@ -39,7 +75,7 @@ module Pho
39
75
  end
40
76
 
41
77
  def reindex()
42
- puts "Submitting Reindex Job"
78
+ puts "Submitting Reindex Job to Store #{@store.storeuri}"
43
79
  resp = Pho::Jobs.submit_reindex(@store, "Reindex", Time.now)
44
80
  if resp.status == 201
45
81
  puts "Monitoring Reindex Job: #{resp.header["Location"].first}"
@@ -51,9 +87,9 @@ module Pho
51
87
  end
52
88
 
53
89
  def reset()
54
- puts "Resetting Store"
90
+ puts "Resetting Store #{@store.storeuri}"
55
91
  resp = Pho::Jobs.submit_reset(@store, "Reset", Time.now)
56
- puts "Monitoring Reset Job:"
92
+ puts "Monitoring Reset Job: #{resp.header["Location"].first}"
57
93
  job = Pho::Jobs.wait_for_submitted(resp, @store) do |job, message, time|
58
94
  puts "#{time} #{message}"
59
95
  end
@@ -63,12 +99,13 @@ module Pho
63
99
  def restore()
64
100
  url = @opts["url"]
65
101
  if url == nil
66
- puts "Restore from latest snapshot"
102
+ puts "Restoring #{@store.storeuri} from latest snapshot"
67
103
  snapshot = Pho::Snapshot.read_from_store(@store)
68
104
  url = snapshot.url
69
105
  end
70
106
  puts "Restoring from #{url}"
71
107
  resp = Pho::Jobs.submit_restore(@store, url, "Reset", Time.now)
108
+ puts "Monitoring Restore Job: #{resp.header["Location"].first}"
72
109
  job = Pho::Jobs.wait_for_submitted(resp, @store) do |job, message, time|
73
110
  puts "#{time} #{message}"
74
111
  end
@@ -105,7 +142,9 @@ module Pho
105
142
  puts "Storing local file: #{@opts["file"]}"
106
143
  f = File.new( @opts["file"] )
107
144
  if File.extname( @opts["file"] ) == ".nt"
108
- Pho::RDF::Parser.store_ntriples(f, @store)
145
+ resp = @store.store_file( f, nil, "text/plain" )
146
+ elsif File.extname( @opts["file"] ) == ".ttl"
147
+ resp = @store.store_file( f, nil, "text/turtle" )
109
148
  else
110
149
  resp = @store.store_file( f )
111
150
  end
@@ -133,7 +172,7 @@ module Pho
133
172
  if @opts["file"]
134
173
  f = File.new( @opts["file"] )
135
174
  uri = File.basename( @opts["file"] )
136
- uri = "#{opts["base"]}/#{uri}" if @opts["base"]
175
+ uri = "#{@opts["base"]}/#{uri}" if @opts["base"]
137
176
  mime = MIME::Types.type_for( @opts["file"] )[0].to_s
138
177
  puts "Uploading file: #{ @opts["file"] } to /items/#{ uri } as #{mime}"
139
178
  resp = @store.upload_item( f , mime , uri )
@@ -160,7 +199,93 @@ module Pho
160
199
  end
161
200
  end
162
201
  end
202
+
203
+ def fpmap(out=$stdout)
204
+
205
+ if @opts["raw"]
206
+ resp = @store.get_field_predicate_map(Pho::ACCEPT_RDF)
207
+ if resp.status != 200
208
+ out.puts "Unable to read Field Predicate Map from store. Response code was #{resp.status}"
209
+ else
210
+ out.puts resp.content
211
+ end
212
+ else
213
+ fpmap = Pho::FieldPredicateMap.read_from_store(@store)
214
+ mappings = fpmap.datatype_properties.sort { |x,y| x.name <=> y.name }
215
+ mappings.each do |mapping|
216
+ analyzer = mapping.analyzer
217
+ if analyzer != nil
218
+ Pho::Analyzers.constants.each do |c|
219
+ if analyzer == Pho::Analyzers.const_get(c)
220
+ analyzer = c
221
+ end
222
+ end
223
+ end
224
+ out.puts "#{mapping.name} -> #{mapping.property_uri}" if analyzer == nil
225
+ out.puts "#{mapping.name} -> #{mapping.property_uri} (#{mapping.analyzer})" if analyzer != nil
226
+ end
227
+
228
+ end
229
+
230
+ end
231
+
232
+ def queryprofile(out=$stdout)
233
+
234
+ if @opts["raw"]
235
+ resp = @store.get_query_profile(Pho::ACCEPT_RDF)
236
+ if resp.status != 200
237
+ out.puts "Unable to read Query Profile from store. Response code was #{resp.status}"
238
+ else
239
+ out.puts resp.content
240
+ end
241
+ else
242
+ queryprofile = Pho::QueryProfile.read_from_store(@store)
243
+ field_weights = queryprofile.field_weights()
244
+ field_weights = field_weights.sort { |x,y| x.name <=> y.name }
245
+ field_weights.each do |weighting|
246
+ out.puts "#{weighting.name} -> #{weighting.weight}"
247
+ end
248
+ end
249
+
250
+ end
251
+
252
+ def add_mapping(out=$stdout)
253
+ fpmap = Pho::FieldPredicateMap.read_from_store(@store)
254
+ mapping = Pho::FieldPredicateMap.create_mapping(@store, @opts["predicate"], @opts["field"], @opts["analyzer"])
255
+
256
+ removed = fpmap.remove_by_name(@opts["field"])
257
+ if removed != nil
258
+ out.puts("Replacing mapping for #{@opts["field"]}")
259
+ end
260
+ fpmap << mapping
261
+ resp = fpmap.upload(@store)
262
+ if resp.status != 200
263
+ out.puts "Unable to update FieldPredicate map in store. Response code was #{resp.status}"
264
+ else
265
+ out.puts "FieldPredicate map successfully updated"
266
+ end
267
+ end
163
268
 
269
+ def add_weight(out=$stdout)
270
+ qp = Pho::QueryProfile.read_from_store(@store)
271
+ weight = Pho::QueryProfile.create_weighting(@store, @opts["field"], @opts["weight"])
272
+
273
+ removed = qp.remove_by_name( @opts["field"] )
274
+ if removed != nil
275
+ out.puts("Replacing weighting for #{@opts["field"]}")
276
+ end
277
+ qp << weight
278
+ resp = qp.upload(@store)
279
+ if resp.status != 200
280
+ out.puts "Unable to update QueryProfile in store. Response code was #{resp.status}"
281
+ else
282
+ out.puts "QueryProfile successfully updated"
283
+ end
284
+ end
285
+
286
+ #TODO remove_mapping
287
+
288
+ #End CommandLine
164
289
  end
165
290
 
166
291
  end
@@ -113,9 +113,8 @@ module Pho
113
113
  end
114
114
 
115
115
  fpmap_uri = store.build_uri("/config/fpmaps/1")
116
-
116
+
117
117
  json = JSON.parse( resp.content )
118
-
119
118
  labels = json[fpmap_uri]["http:\/\/www.w3.org\/2000\/01\/rdf-schema#label"]
120
119
  label = ""
121
120
  if labels != nil
@@ -0,0 +1,58 @@
1
+ module Pho
2
+
3
+ #OAI-PMH Support
4
+ module OAI
5
+
6
+ class Record
7
+
8
+ attr_reader :identifier
9
+ attr_reader :timestamp
10
+
11
+ def initialize(identifier, timestamp)
12
+ @identifier = identifier
13
+ @timestamp = timestamp
14
+ end
15
+
16
+ end
17
+
18
+ #Collection of records
19
+ class Records
20
+
21
+ attr_reader :responseDate, :from, :to, :records, :token
22
+
23
+ def initialize(responseDate, token, from, to, records=[])
24
+ @responseDate = responseDate
25
+ @token = token
26
+ @from = from
27
+ @to = to
28
+ @records = records
29
+ end
30
+
31
+ def Records.parse(response)
32
+ doc = REXML::Document.new(response)
33
+ records = []
34
+ REXML::XPath.each( doc.root, "//oai:header", {"oai" => "http://www.openarchives.org/OAI/2.0/"} ) do |header|
35
+ uri = header.get_elements("identifier")[0].text
36
+ datestamp = header.get_elements("datestamp")[0].text
37
+ records << Record.new(uri, datestamp)
38
+ end
39
+ #FIXME
40
+ return Records.new(nil, nil, nil, nil, records)
41
+ end
42
+
43
+ #List records from a store
44
+ #TODO support for from/to dates
45
+ #TODO support for resumption tokens
46
+ def Records.read_from_store(store)
47
+ resp = store.list_records
48
+ if resp.status != 200
49
+ raise "Unable to list records"
50
+ end
51
+ return parse(resp.content)
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -51,6 +51,7 @@ module Pho
51
51
  # store:: the store to receive the data
52
52
  # base_uri:: base uri against which the data is parsed
53
53
  # graph_name:: uri of graph in store
54
+ # TODO: can now be submitted as turtle
54
55
  def Parser.store_ntriples(file, store, base_uri=nil, graph_name=nil)
55
56
  data = Parser.parse_ntriples(file, base_uri)
56
57
  return store.store_data(data, graph_name)
@@ -62,6 +63,7 @@ module Pho
62
63
  # store:: the store to receive the data
63
64
  # base_uri:: base uri against which the data is parsed
64
65
  # graph_name:: uri of graph in store
66
+ # TODO: can now be submitted as turtle
65
67
  def Parser.store_ntriples_from_string(string, store, base_uri, graph_name=nil)
66
68
  data = Parser.parse_ntriples_from_string(string, base_uri)
67
69
  return store.store_data(data, graph_name)
@@ -9,21 +9,33 @@ module Pho
9
9
  class RDFManager < AbstractFileManager
10
10
 
11
11
  RDF = "rdf".freeze
12
+ TTL = "ttl".freeze
13
+ NT = "nt".freeze
12
14
 
13
- def initialize(store, dir, rdf_suffix=RDF, ok_suffix=OK, fail_suffix=FAIL, sleep=1)
15
+ ALL_RDF = [RDF, TTL, NT]
16
+
17
+ def initialize(store, dir, rdf_suffixes=ALL_RDF, ok_suffix=OK, fail_suffix=FAIL, sleep=1)
14
18
  super(store, dir, ok_suffix, fail_suffix, sleep)
15
- @rdf_suffix = rdf_suffix
19
+ @rdf_suffixes = rdf_suffixes
16
20
  end
17
21
 
18
22
  #List files being managed
19
23
  def list(recursive=false)
20
- return Dir.glob( File.join(@dir, "*.#{@rdf_suffix}") )
24
+ return Dir.glob( File.join(@dir, "*.\{#{ @rdf_suffixes.join(",") }\}") )
21
25
  end
22
26
 
23
27
  protected
24
28
 
25
29
  def store_file(file, filename)
26
- response = @store.store_file(file)
30
+ ext = File.extname(filename)
31
+ if ext == ".ttl"
32
+ response = @store.store_file(file, nil, "text/turtle")
33
+ elsif ext == ".nt"
34
+ response = @store.store_file(file, nil, "text/turtle")
35
+ else
36
+ response = @store.store_file(file)
37
+ end
38
+
27
39
  if (response.status < 300 )
28
40
  File.open(get_ok_file_for(filename), "w") do |file|
29
41
  file.print( "OK" )
@@ -78,7 +78,8 @@ module Pho
78
78
 
79
79
  # data:: a String containing the data to store
80
80
  # graph_name:: name of a private graph in which to store the data. E.g. "1" or "private". Resolves to /meta/graphs/graph_name
81
- def store_data(data, graph_name=nil)
81
+ # format:: mimetype of RDF serialization
82
+ def store_data(data, graph_name=nil, format="application/rdf+xml")
82
83
  u = nil
83
84
  if graph_name == nil
84
85
  u = build_uri("/meta")
@@ -86,17 +87,24 @@ module Pho
86
87
  u = build_uri("/meta/graphs/#{graph_name}")
87
88
  end
88
89
 
89
- response = @client.post(u, data, RDF_XML )
90
+ if format == "text/plain"
91
+ format = "text/turtle"
92
+ end
93
+
94
+ content_type = {"Content-Type"=> format }
95
+ response = @client.post(u, data, content_type )
90
96
  return response
91
97
  end
92
98
 
93
99
  # Store the contents of a File (or any IO stream) in the Metabox associated with this store
94
100
  # The client does not support streaming submissions of data, so the stream will be fully read before data is submitted to the platform
95
- # file:: an IO object
96
- def store_file(file)
101
+ # file:: an IO object
102
+ # graph_name:: name of a private graph in which to store teh data. E.g. "1" or "private". Resolves to /meta/graphs/graph_name
103
+ # format:: mimetype of RDF serialization
104
+ def store_file(file, graph_name=nil, format="application/rdf+xml")
97
105
  data = file.read()
98
106
  file.close()
99
- return store_data(data)
107
+ return store_data(data, graph_name, format)
100
108
  end
101
109
 
102
110
  # Retrieve RDF data from the specified URL and store it in the Store Metabox
@@ -431,6 +439,16 @@ module Pho
431
439
  return response
432
440
  end
433
441
 
442
+ #############
443
+ # OAI
444
+ #############
445
+
446
+ def list_records
447
+ u = build_uri("/services/oai-pmh")
448
+ response = @client.get(u, {"verb" => "ListRecords", "metadataPrefix" => "oai_dc"})
449
+ return response
450
+ end
451
+
434
452
  #############
435
453
  # CONFIG
436
454
  #############
@@ -0,0 +1,229 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+ require 'pho'
3
+ require 'test/unit'
4
+ require 'mocha'
5
+
6
+ class CommandLineTest < Test::Unit::TestCase
7
+
8
+ TEST_FPMAP = <<-EOL
9
+ {
10
+ "http:\/\/api.talis.com\/stores\/testing\/config\/fpmaps\/1#description" : {
11
+ "http:\/\/schemas.talis.com\/2006\/frame\/schema#property" : [ { "value" : "http:\/\/purl.org\/dc\/elements\/1.1\/description", "type" : "uri" } ],
12
+ "http:\/\/schemas.talis.com\/2006\/frame\/schema#name" : [ { "value" : "description", "type" : "literal" } ]
13
+ },
14
+ "http:\/\/api.talis.com\/stores\/testing\/config\/fpmaps\/1" : {
15
+ "http:\/\/www.w3.org\/2000\/01\/rdf-schema#label" : [ { "value" : "default field\/predicate map", "type" : "literal" } ],
16
+ "http:\/\/www.w3.org\/1999\/02\/22-rdf-syntax-ns#type" : [ { "value" : "http:\/\/schemas.talis.com\/2006\/bigfoot\/configuration#FieldPredicateMap", "type" : "uri" } ],
17
+ "http:\/\/schemas.talis.com\/2006\/frame\/schema#mappedDatatypeProperty" : [
18
+ { "value" : "http:\/\/api.talis.com\/stores\/testing\/config\/fpmaps\/1#name", "type" : "uri" },
19
+ { "value" : "http:\/\/api.talis.com\/stores\/testing\/config\/fpmaps\/1#title", "type" : "uri" },
20
+ { "value" : "http:\/\/api.talis.com\/stores\/testing\/config\/fpmaps\/1#description", "type" : "uri" }
21
+ ]
22
+ },
23
+ "http:\/\/api.talis.com\/stores\/testing\/config\/fpmaps\/1#title" : {
24
+ "http:\/\/schemas.talis.com\/2006\/frame\/schema#property" : [ { "value" : "http:\/\/purl.org\/dc\/elements\/1.1\/title", "type" : "uri" } ],
25
+ "http:\/\/schemas.talis.com\/2006\/frame\/schema#name" : [ { "value" : "title", "type" : "literal" } ]
26
+ },
27
+ "http:\/\/api.talis.com\/stores\/testing\/config\/fpmaps\/1#name" : {
28
+ "http:\/\/schemas.talis.com\/2006\/frame\/schema#property" : [ { "value" : "http:\/\/xmlns.com\/foaf\/0.1\/name", "type" : "uri" } ],
29
+ "http:\/\/schemas.talis.com\/2006\/frame\/schema#name" : [ { "value" : "name", "type" : "literal" } ]
30
+ }
31
+ }
32
+ EOL
33
+
34
+ TEST_QP = <<-EOL
35
+ {
36
+ "http:\/\/api.talis.com\/stores\/testing\/config\/queryprofiles\/1" : {
37
+ "http:\/\/www.w3.org\/2000\/01\/rdf-schema#label" : [ { "value" : "default query profile", "type" : "literal" } ],
38
+ "http:\/\/www.w3.org\/1999\/02\/22-rdf-syntax-ns#type" : [ { "value" : "http:\/\/schemas.talis.com\/2006\/bigfoot\/configuration#QueryProfile", "type" : "uri" } ],
39
+ "http:\/\/schemas.talis.com\/2006\/bigfoot\/configuration#fieldWeight" : [
40
+ { "value" : "http:\/\/api.talis.com\/stores\/testing\/config\/queryprofiles\/1#name", "type" : "uri" },
41
+ { "value" : "http:\/\/api.talis.com\/stores\/testing\/config\/queryprofiles\/1#nick", "type" : "uri" }
42
+ ]
43
+ },
44
+ "http:\/\/api.talis.com\/stores\/testing\/config\/queryprofiles\/1#nick" : {
45
+ "http:\/\/schemas.talis.com\/2006\/bigfoot\/configuration#weight" : [ { "value" : "1.0", "type" : "literal" } ],
46
+ "http:\/\/schemas.talis.com\/2006\/frame\/schema#name" : [ { "value" : "nick", "type" : "literal" } ]
47
+ },
48
+ "http:\/\/api.talis.com\/stores\/testing\/config\/queryprofiles\/1#name" : {
49
+ "http:\/\/schemas.talis.com\/2006\/bigfoot\/configuration#weight" : [ { "value" : "2.0", "type" : "literal" } ],
50
+ "http:\/\/schemas.talis.com\/2006\/frame\/schema#name" : [ { "value" : "name", "type" : "literal" } ]
51
+ }
52
+ }
53
+ EOL
54
+
55
+ def setup
56
+ @opts = {}
57
+ @opts["username"] = "tester"
58
+ @opts["password"] = "pass"
59
+ @opts["store"] = "testing"
60
+
61
+ end
62
+
63
+ def teardown
64
+ end
65
+
66
+ def test_fpmap()
67
+ mc = mock()
68
+ mc.expects(:build_uri).returns( "http://api.talis.com/stores/testing/config/fpmaps/1" )
69
+ mc.expects(:get_field_predicate_map).returns( HTTP::Message.new_response(TEST_FPMAP) )
70
+
71
+ s = StringIO.new()
72
+ cmdline = Pho::CommandLine.new(@opts, {}, mc)
73
+ cmdline.fpmap(s)
74
+
75
+ lines = s.string().split("\n")
76
+ assert_equal("description -> http://purl.org/dc/elements/1.1/description", lines[0])
77
+ assert_equal("name -> http://xmlns.com/foaf/0.1/name", lines[1])
78
+ assert_equal("title -> http://purl.org/dc/elements/1.1/title", lines[2])
79
+ end
80
+
81
+ def test_fpmap_raw()
82
+ mc = mock()
83
+ mc.expects(:get_field_predicate_map).returns( HTTP::Message.new_response(TEST_FPMAP) )
84
+
85
+ s = StringIO.new()
86
+ @opts["raw"] = ""
87
+ cmdline = Pho::CommandLine.new(@opts, {}, mc)
88
+ cmdline.fpmap(s)
89
+ assert_equal(TEST_FPMAP, s.string)
90
+ end
91
+
92
+ def test_queryprofile_raw()
93
+ mc = mock()
94
+ mc.expects(:get_query_profile).returns( HTTP::Message.new_response(TEST_QP) )
95
+
96
+ s = StringIO.new()
97
+ @opts["raw"] = ""
98
+ cmdline = Pho::CommandLine.new(@opts, {}, mc )
99
+ cmdline.queryprofile(s)
100
+ assert_equal(TEST_QP, s.string)
101
+ end
102
+
103
+ def test_queryprofile()
104
+ mc = mock()
105
+ mc.expects(:build_uri).returns( "http://api.talis.com/stores/testing/config/queryprofiles/1" )
106
+ mc.expects(:get_query_profile).returns( HTTP::Message.new_response(TEST_QP) )
107
+
108
+ s = StringIO.new()
109
+ cmdline = Pho::CommandLine.new(@opts, {}, mc)
110
+ cmdline.queryprofile(s)
111
+
112
+ lines = s.string().split("\n")
113
+ assert_equal("name -> 2.0", lines[0])
114
+ assert_equal("nick -> 1.0", lines[1])
115
+ end
116
+
117
+ def test_username()
118
+ opts = {}
119
+ env = {}
120
+
121
+ assert_raise RuntimeError do
122
+ cmdline = Pho::CommandLine.new(opts, env, mock())
123
  end
124
+
125
+ opts["username"] = "tester"
126
+ opts["password"] = "pass"
127
+ cmdline = Pho::CommandLine.new(opts, env, mock())
128
+ assert_equal("tester", cmdline.username)
129
+
130
+ opts = {}
131
+ opts["password"] = "pass"
132
+ env["TALIS_USER"] = "tester"
133
+ cmdline = Pho::CommandLine.new(opts, env, mock())
134
+ assert_equal("tester", cmdline.username)
135
+
136
+ opts["username"] = "override"
137
+ cmdline = Pho::CommandLine.new(opts, env, mock())
138
+ assert_equal("override", cmdline.username)
139
+ end
140
+
141
+ def test_password()
142
+ opts = {}
143
+ env = {}
144
+
145
+ opts["username"] = "tester"
146
+ assert_raise RuntimeError do
147
+ cmdline = Pho::CommandLine.new(opts, env, mock())
148
+ end
149
+
150
+ opts["password"] = "pass"
151
+ cmdline = Pho::CommandLine.new(opts, env, mock())
152
+ assert_equal("pass", cmdline.password)
153
+
154
+ opts = {}
155
+ opts["username"] = "tester"
156
+ env["TALIS_PASS"] = "pass"
157
+ cmdline = Pho::CommandLine.new(opts, env, mock())
158
+ assert_equal("pass", cmdline.password)
159
+
160
+ opts["password"] = "override"
161
+ cmdline = Pho::CommandLine.new(opts, env, mock())
162
+ assert_equal("override", cmdline.password)
163
+ end
164
+
165
+ def test_store()
166
+ opts = {}
167
+ env = {}
168
+ opts["username"] = "tester"
169
+ opts["password"] = "pass"
170
+ cmdline = Pho::CommandLine.new(opts, env, mock())
171
+ assert_equal(nil, cmdline.storename)
172
+
173
+ opts["store"] = "http://api.talis.com/stores/testing"
174
+ cmdline = Pho::CommandLine.new(opts, env, mock())
175
+ assert_equal("http://api.talis.com/stores/testing", cmdline.storename)
176
+
177
+ opts["store"] = "testing"
178
+ cmdline = Pho::CommandLine.new(opts, env, mock())
179
+ assert_equal("http://api.talis.com/stores/testing", cmdline.storename)
180
+
181
+ opts = {}
182
+ opts["username"] = "tester"
183
+ opts["password"] = "pass"
184
+ env["TALIS_STORE"] = "http://api.talis.com/stores/testing"
185
+ cmdline = Pho::CommandLine.new(opts, env, mock())
186
+ assert_equal("http://api.talis.com/stores/testing", cmdline.storename)
187
+
188
+ env["TALIS_STORE"] = "testing"
189
+ cmdline = Pho::CommandLine.new(opts, env, mock())
190
+ assert_equal("http://api.talis.com/stores/testing", cmdline.storename)
191
+
192
+ opts["store"] = "override"
193
+ cmdline = Pho::CommandLine.new(opts, env, mock())
194
+ assert_equal("http://api.talis.com/stores/override", cmdline.storename)
195
+
196
+ end
197
+
198
+ def test_add_mapping()
199
+ mc = mock()
200
+ mc.expects(:build_uri).with("/config/fpmaps/1").returns( "http://api.talis.com/stores/testing/config/fpmaps/1" )
201
+ mc.expects(:get_field_predicate_map).returns( HTTP::Message.new_response(TEST_FPMAP) )
202
+ mc.expects(:build_uri).with("/config/fpmaps/1#test").returns( "http://api.talis.com/stores/testing/config/fpmaps/1#test" )
203
+ mc.expects(:put_field_predicate_map).returns( HTTP::Message.new_response("") )
204
+
205
+ @opts["field"] = "test"
206
+ @opts["predicate"] = "http://www.example.org/test"
207
+
208
+ s = StringIO.new()
209
+ cmdline = Pho::CommandLine.new(@opts, {}, mc)
210
+ cmdline.add_mapping(s)
211
+ assert_equal("FieldPredicate map successfully updated\n", s.string)
212
+ end
213
+
214
+ def test_add_weight()
215
+ mc = mock()
216
+ mc.expects(:build_uri).with("/config/queryprofiles/1").returns( "http://api.talis.com/stores/testing/config/queryprofiles/1")
217
+ mc.expects(:get_query_profile).returns( HTTP::Message.new_response(TEST_QP) )
218
+ mc.expects(:build_uri).with("/config/queryprofiles/1#test").returns("http://api.talis.com/stores/testing/config/queryprofiles/1#test" )
219
+ mc.expects(:put_query_profile).returns( HTTP::Message.new_response("") )
220
+
221
+ @opts["field"] = "test"
222
+ @opts["weight"] = "10.0"
223
+
224
+ s = StringIO.new()
225
+ cmdline = Pho::CommandLine.new(@opts, {}, mc)
226
+ cmdline.add_weight(s)
227
+ assert_equal("QueryProfile successfully updated\n", s.string)
228
+ end
229
+
230
+ end