platanus 0.1.6 → 0.1.7
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.
- data/lib/platanus/serializers/tag_set.rb +22 -0
- data/lib/platanus/tag_set.rb +81 -0
- data/lib/platanus/version.rb +1 -1
- data/lib/platanus.rb +18 -7
- metadata +4 -2
@@ -0,0 +1,22 @@
|
|
1
|
+
# tag_set.rb : word search optimized list serialization
|
2
|
+
#
|
3
|
+
# TODO: make notation compatible with fulltext-search.
|
4
|
+
#
|
5
|
+
# Copyright October 2012, Ignacio Baixas +mailto:ignacio@platan.us+.
|
6
|
+
|
7
|
+
module Platanus
|
8
|
+
module Serializers
|
9
|
+
class TagSet
|
10
|
+
|
11
|
+
def self.load(_str)
|
12
|
+
return [] if _str.nil?
|
13
|
+
return [] if _str == '::::'
|
14
|
+
_str.split('::')[1..-1]
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.dump(_data)
|
18
|
+
"::#{_data.join('::')}::"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# tag_set_attr.rb : searchable tag sets.
|
2
|
+
#
|
3
|
+
# usage:
|
4
|
+
#
|
5
|
+
# class Model
|
6
|
+
# include Platanus::TagSetAttr
|
7
|
+
#
|
8
|
+
# attr_tagset :demo
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# t = Model.create
|
12
|
+
# t.demo << 'tag1'
|
13
|
+
# t.demo << 'tag2'
|
14
|
+
# t.save!
|
15
|
+
#
|
16
|
+
# t.demo # returns ['tag1', 'tag2']
|
17
|
+
#
|
18
|
+
# #searching
|
19
|
+
# Model.search_by_demo(all: 'tag1') # returns [t]
|
20
|
+
# Model.search_by_demo(all: 'tag1', none: 'tag2') # returns []
|
21
|
+
#
|
22
|
+
# # TODO: provide fulltext search support.
|
23
|
+
#
|
24
|
+
# Copyright February 2013, Ignacio Baixas +mailto:ignacio@platan.us+.
|
25
|
+
|
26
|
+
module Platanus::TagSetAttr
|
27
|
+
|
28
|
+
def self.included(base)
|
29
|
+
base.extend ClassMethods
|
30
|
+
end
|
31
|
+
|
32
|
+
module ClassMethods
|
33
|
+
|
34
|
+
# Adds a tag list attribute to the model.
|
35
|
+
def attr_tagset(_name, _options={})
|
36
|
+
|
37
|
+
_name = _name.to_s
|
38
|
+
|
39
|
+
send :serialize, _name, Platanus::Serializers::TagSet
|
40
|
+
|
41
|
+
klass = class << self; self; end
|
42
|
+
|
43
|
+
klass.send :define_method, "search_by_#{_name.singularize}" do |_opt={}|
|
44
|
+
|
45
|
+
target = self
|
46
|
+
|
47
|
+
# The 'any' filter matches if one of the tokens match
|
48
|
+
if _opt.has_key? :any
|
49
|
+
params = []; any_sql = []
|
50
|
+
Array(_opt[:any]).collect do |token|
|
51
|
+
params << "%::#{token}::%"
|
52
|
+
any_sql << "#{_name} LIKE ?"
|
53
|
+
end
|
54
|
+
target = target.where("(#{or_sql.join(' OR ')})", *params) if params.length > 0
|
55
|
+
end
|
56
|
+
|
57
|
+
# The 'all' filter matches if all of the tokens match
|
58
|
+
if _opt.has_key? :all
|
59
|
+
params = []; and_sql = []
|
60
|
+
Array(_opt[:all]).each do |token|
|
61
|
+
params << "%::#{token}::%"
|
62
|
+
and_sql << "#{_name} LIKE ?"
|
63
|
+
end
|
64
|
+
target = target.where("#{and_sql.join(' AND ')}", *params) if params.length > 0
|
65
|
+
end
|
66
|
+
|
67
|
+
# The 'none' filter matches if none of the tokens match
|
68
|
+
if _opt.has_key? :none
|
69
|
+
params = []; ex_sql = []
|
70
|
+
Array(_opt[:none]).each do |token|
|
71
|
+
params << "%::#{token}::%"
|
72
|
+
ex_sql << "#{_name} is NULL OR #{_name} NOT LIKE ?"
|
73
|
+
end
|
74
|
+
target = target.where("#{ex_sql.join(' AND ')}", *params) if params.length > 0
|
75
|
+
end
|
76
|
+
|
77
|
+
return target
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/platanus/version.rb
CHANGED
data/lib/platanus.rb
CHANGED
@@ -1,21 +1,32 @@
|
|
1
1
|
require "platanus/version"
|
2
2
|
|
3
|
-
require 'platanus/canned'
|
4
|
-
|
3
|
+
require 'platanus/canned' # TODO: deprecated, remove
|
4
|
+
|
5
|
+
# Serializers
|
6
|
+
require 'platanus/serializers/tag_set'
|
7
|
+
require 'platanus/serializers/json_sym'
|
8
|
+
|
9
|
+
# active record behaviors
|
10
|
+
require 'platanus/stacked' # TODO: deprecated, remove
|
5
11
|
require 'platanus/activable'
|
6
12
|
require 'platanus/traceable'
|
7
|
-
require 'platanus/layered'
|
13
|
+
require 'platanus/layered' # TODO: deprecated, remove
|
14
|
+
|
15
|
+
# active record attribute related
|
16
|
+
require 'platanus/tag_set'
|
8
17
|
require 'platanus/enum'
|
9
|
-
require 'platanus/http_helpers'
|
10
18
|
require 'platanus/model_shims'
|
19
|
+
# require 'platanus/onetime' # TODO: deprecated, remove
|
20
|
+
|
21
|
+
# boilerplate
|
22
|
+
require 'platanus/http_helpers' # TODO: deprecate in favor of api_boilerplate => first improve boilerplate
|
11
23
|
|
12
|
-
# require 'platanus/onetime'
|
13
24
|
# require 'platanus/gcontroller'
|
25
|
+
|
26
|
+
# Template engines connectors
|
14
27
|
# require 'platanus/template/spreadsheet'
|
15
28
|
# require 'platanus/template/prawn'
|
16
29
|
|
17
|
-
require 'platanus/serializers/json_sym'
|
18
|
-
|
19
30
|
module Platanus
|
20
31
|
# Your code goes here...
|
21
32
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: platanus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-07-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|
@@ -68,8 +68,10 @@ files:
|
|
68
68
|
- lib/platanus/model_shims.rb
|
69
69
|
- lib/platanus/onetime.rb
|
70
70
|
- lib/platanus/serializers/json_sym.rb
|
71
|
+
- lib/platanus/serializers/tag_set.rb
|
71
72
|
- lib/platanus/stacked.rb
|
72
73
|
- lib/platanus/stacked2.rb
|
74
|
+
- lib/platanus/tag_set.rb
|
73
75
|
- lib/platanus/templates/prawn.rb
|
74
76
|
- lib/platanus/templates/spreadsheet.rb
|
75
77
|
- lib/platanus/traceable.rb
|