togostanza 1.0.6 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/togostanza/application.rb +16 -0
- data/lib/togostanza/stanza/base.rb +11 -2
- data/lib/togostanza/stanza/search_query.rb +87 -0
- data/lib/togostanza/stanza/text_search.rb +39 -0
- data/lib/togostanza/version.rb +1 -1
- data/lib/togostanza.rb +16 -4
- data/spec/dummy/foo_stanza/template.hbs +2 -0
- data/spec/spec_helper.rb +7 -3
- data/togostanza.gemspec +1 -0
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c89132e4c11121e7e06b99cdafbaff9afa086b0
|
4
|
+
data.tar.gz: 0e8c151c4ee36a69fca7c805081c688281382cad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9421058afe1ba8dca550255ccd4d3db8e7b7a4fa1570de0831275582b2da4eba80b9f40e779ab16a5439aefb720e4887a5c8fe40c1e90e644e982837b4897d9
|
7
|
+
data.tar.gz: 5624ff06623b6f5d3ed83e611100fb5f37b00379850afb1b832d6be171775a93d2d23eaf6324afd8fd6fc63a838a6f0b6c94ab8e96fc65f7a2b3472fb72ba93f
|
@@ -44,5 +44,21 @@ module TogoStanza
|
|
44
44
|
|
45
45
|
render :html, @stanza.help, layout_engine: :haml
|
46
46
|
end
|
47
|
+
|
48
|
+
get '/:id/text_search' do |id|
|
49
|
+
@stanza = Stanza.find(id).new
|
50
|
+
stanza_uri = request.env['REQUEST_URI'].gsub(/\/text_search.*/, '')
|
51
|
+
|
52
|
+
begin
|
53
|
+
identifiers = @stanza.text_search(params[:q]).map {|param_hash|
|
54
|
+
parameters = Rack::Utils.build_query(param_hash)
|
55
|
+
"#{stanza_uri}?#{parameters}"
|
56
|
+
}
|
57
|
+
|
58
|
+
json enabled: true, count: identifiers.size, urls: identifiers
|
59
|
+
rescue NoSearchDeclarationError
|
60
|
+
json enabled: false, count: 0, urls: []
|
61
|
+
end
|
62
|
+
end
|
47
63
|
end
|
48
64
|
end
|
@@ -13,14 +13,23 @@ end
|
|
13
13
|
|
14
14
|
module TogoStanza::Stanza
|
15
15
|
autoload :ExpressionMap, 'togostanza/stanza/expression_map'
|
16
|
+
autoload :Grouping, 'togostanza/stanza/grouping'
|
16
17
|
autoload :Markdown, 'togostanza/stanza/markdown'
|
17
18
|
autoload :Querying, 'togostanza/stanza/querying'
|
18
|
-
autoload :
|
19
|
+
autoload :TextSearch, 'togostanza/stanza/text_search'
|
20
|
+
|
21
|
+
class Context < Hashie::Mash
|
22
|
+
def respond_to_missing?(*)
|
23
|
+
# XXX It looks ugly, but we need use not pre-defined properties
|
24
|
+
true
|
25
|
+
end
|
26
|
+
end
|
19
27
|
|
20
28
|
class Base
|
21
29
|
extend ExpressionMap::Macro
|
22
30
|
include Querying
|
23
31
|
include Grouping
|
32
|
+
include TextSearch
|
24
33
|
|
25
34
|
define_expression_map :properties
|
26
35
|
define_expression_map :resources
|
@@ -51,7 +60,7 @@ module TogoStanza::Stanza
|
|
51
60
|
attr_reader :params
|
52
61
|
|
53
62
|
def context
|
54
|
-
|
63
|
+
Context.new(properties.resolve_all_in_parallel(self, params))
|
55
64
|
end
|
56
65
|
|
57
66
|
def resource(name)
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'strscan'
|
2
|
+
|
3
|
+
module TogoStanza::Stanza
|
4
|
+
class SearchQuery
|
5
|
+
def initialize(query)
|
6
|
+
@raw = query
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :raw
|
10
|
+
|
11
|
+
def to_filter(method, var_name)
|
12
|
+
"FILTER (#{to_clause(method, var_name)})"
|
13
|
+
end
|
14
|
+
|
15
|
+
def tokens
|
16
|
+
@tokens ||= begin
|
17
|
+
scanner = StringScanner.new(@raw)
|
18
|
+
scanner.skip /\s+/
|
19
|
+
|
20
|
+
parse(scanner)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def to_clause(method, var_name)
|
27
|
+
case method.to_s
|
28
|
+
when 'regex', 'contains'
|
29
|
+
tokens.each_with_object('') {|token, acc|
|
30
|
+
case token
|
31
|
+
when :lparen
|
32
|
+
acc << '('
|
33
|
+
when :rparen
|
34
|
+
acc << ')'
|
35
|
+
when :or
|
36
|
+
acc << ' || '
|
37
|
+
when :and
|
38
|
+
acc << ' && '
|
39
|
+
else
|
40
|
+
acc << "#{method}(?#{var_name}, #{token.inspect})"
|
41
|
+
end
|
42
|
+
}
|
43
|
+
when 'bif_contains'
|
44
|
+
clause = tokens.each_with_object('') {|token, acc|
|
45
|
+
case token
|
46
|
+
when :lparen
|
47
|
+
acc << '('
|
48
|
+
when :rparen
|
49
|
+
acc << ')'
|
50
|
+
when :or
|
51
|
+
acc << ' OR '
|
52
|
+
when :and
|
53
|
+
acc << ' AND '
|
54
|
+
else
|
55
|
+
acc << token.inspect
|
56
|
+
end
|
57
|
+
}
|
58
|
+
|
59
|
+
"bif:contains(?#{var_name}, '#{clause}')"
|
60
|
+
else
|
61
|
+
raise ArgumentError, method
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def parse(scanner, tokens = [])
|
66
|
+
scanner.skip /\s+\z/
|
67
|
+
|
68
|
+
return tokens if scanner.eos?
|
69
|
+
|
70
|
+
if scanner.scan(/"((?:[^\\"]|\\.)*)"/)
|
71
|
+
tokens << scanner[1].gsub(/\\(.)/, '\1')
|
72
|
+
elsif scanner.scan(/\(\s*/)
|
73
|
+
tokens << :lparen
|
74
|
+
elsif scanner.scan(/\s*\)/)
|
75
|
+
tokens << :rparen
|
76
|
+
elsif scanner.scan(/\s*OR\s*/)
|
77
|
+
tokens << :or
|
78
|
+
elsif scanner.scan(/\s*AND\s*|\s+/)
|
79
|
+
tokens << :and
|
80
|
+
else
|
81
|
+
tokens << scanner.scan(/\S+(?<!\))/)
|
82
|
+
end
|
83
|
+
|
84
|
+
parse(scanner, tokens)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'togostanza/stanza/search_query'
|
2
|
+
|
3
|
+
class TogoStanza::NoSearchDeclarationError < StandardError; end
|
4
|
+
|
5
|
+
module TogoStanza::Stanza
|
6
|
+
module TextSearch
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
def text_search_filter(var_name, query)
|
10
|
+
query.to_filter(TogoStanza.text_search_method, var_name)
|
11
|
+
end
|
12
|
+
|
13
|
+
def text_search(input)
|
14
|
+
raise TogoStanza::NoSearchDeclarationError unless self.class.method_defined?(:search_declarations)
|
15
|
+
|
16
|
+
query = SearchQuery.new(input)
|
17
|
+
|
18
|
+
return [] if query.tokens.empty?
|
19
|
+
|
20
|
+
search_declarations.each_value.flat_map {|block|
|
21
|
+
instance_exec(query, &block)
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
module ClassMethods
|
26
|
+
def search(symbol, &block)
|
27
|
+
unless method_defined?(:search_declarations)
|
28
|
+
# テキスト検索宣言の初期化
|
29
|
+
instance_eval do
|
30
|
+
class_attribute :search_declarations
|
31
|
+
self.search_declarations = {}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
search_declarations[symbol] = block
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/togostanza/version.rb
CHANGED
data/lib/togostanza.rb
CHANGED
@@ -7,9 +7,21 @@ module TogoStanza
|
|
7
7
|
autoload :Markdown, 'togostanza/markdown'
|
8
8
|
autoload :Stanza, 'togostanza/stanza'
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
class << self
|
11
|
+
attr_accessor :text_search_method
|
12
|
+
|
13
|
+
def configure
|
14
|
+
yield self
|
15
|
+
end
|
16
|
+
|
17
|
+
def sprockets
|
18
|
+
@sprockets ||= Sprockets::Environment.new.tap {|sprockets|
|
19
|
+
sprockets.append_path File.expand_path('../../assets', __FILE__)
|
20
|
+
}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
configure do |config|
|
25
|
+
config.text_search_method = :regex
|
14
26
|
end
|
15
27
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
ENV['RACK_ENV'] ||= 'test'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
require 'rspec/its'
|
5
4
|
require 'capybara'
|
6
5
|
|
6
|
+
require_relative 'dummy/app'
|
7
|
+
|
7
8
|
RSpec.configure do |config|
|
8
|
-
config.
|
9
|
+
config.expect_with :rspec do |c|
|
10
|
+
c.syntax = %i(should expect)
|
11
|
+
end
|
12
|
+
|
9
13
|
config.run_all_when_everything_filtered = true
|
10
14
|
config.filter_run :focus
|
11
15
|
|
data/togostanza.gemspec
CHANGED
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_development_dependency 'capybara'
|
34
34
|
spec.add_development_dependency 'rake'
|
35
35
|
spec.add_development_dependency 'rspec'
|
36
|
+
spec.add_development_dependency 'rspec-its'
|
36
37
|
|
37
38
|
spec.required_ruby_version = '>= 1.9.3'
|
38
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: togostanza
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keita Urashima
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -234,6 +234,20 @@ dependencies:
|
|
234
234
|
- - ">="
|
235
235
|
- !ruby/object:Gem::Version
|
236
236
|
version: '0'
|
237
|
+
- !ruby/object:Gem::Dependency
|
238
|
+
name: rspec-its
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - ">="
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
version: '0'
|
244
|
+
type: :development
|
245
|
+
prerelease: false
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - ">="
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: '0'
|
237
251
|
description:
|
238
252
|
email:
|
239
253
|
- ursm@esm.co.jp
|
@@ -271,6 +285,8 @@ files:
|
|
271
285
|
- lib/togostanza/stanza/grouping.rb
|
272
286
|
- lib/togostanza/stanza/markdown.rb
|
273
287
|
- lib/togostanza/stanza/querying.rb
|
288
|
+
- lib/togostanza/stanza/search_query.rb
|
289
|
+
- lib/togostanza/stanza/text_search.rb
|
274
290
|
- lib/togostanza/version.rb
|
275
291
|
- spec/dummy/app.rb
|
276
292
|
- spec/dummy/bar_stanza/help.md
|
@@ -347,4 +363,3 @@ test_files:
|
|
347
363
|
- spec/lib/togostanza/stanza/base_spec.rb
|
348
364
|
- spec/lib/togostanza/stanza/grouping_spec.rb
|
349
365
|
- spec/spec_helper.rb
|
350
|
-
has_rdoc:
|