PredicateLiteralKit4Ruby 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in PredicateLiteralKit4Ruby.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Udo Schneider
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'PredicateLiteralKit4Ruby/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "PredicateLiteralKit4Ruby"
8
+ spec.version = PredicateLiteralKit4Ruby::VERSION
9
+ spec.authors = ["Udo Schneider"]
10
+ spec.email = ["Udo.Schneider@homeaddress.de"]
11
+ spec.description = %q{Parse Cappuccino Literal predicated and sort descriptors to arel expressions}
12
+ spec.summary = %q{Parse Cappuccino Literal predicated and sort descriptors to arel expressions}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+
24
+ spec.add_development_dependency "activerecord"
25
+ spec.add_development_dependency "sqlite3"
26
+
27
+ spec.add_dependency "arel"
28
+ spec.add_dependency "json"
29
+ spec.add_dependency "msgpack"
30
+ end
@@ -0,0 +1,29 @@
1
+ # PredicateLiteralKit4Ruby
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'PredicateLiteralKit4Ruby'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install PredicateLiteralKit4Ruby
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+ require "json"
5
+ require 'msgpack'
6
+ require 'active_record'
7
+ require "arel"
8
+ require "PredicateLiteralKit4Ruby"
9
+ require "zlib"
10
+
11
+ require "cgi"
12
+
13
+ # Connect to the database
14
+ ActiveRecord::Base.establish_connection(
15
+ :adapter => 'sqlite3',
16
+ :host => "localhost",
17
+ :username => "user",
18
+ :password => "pwd",
19
+ :database => "test.db"
20
+ )
21
+
22
+ # Setup the engine for Arel
23
+ Arel::Table.engine = Arel::Sql::Engine.new(ActiveRecord::Base)
24
+
25
+
26
+ YESTERDAY = "abc123"
27
+
28
+ json_string = ARGF.read
29
+ puts "JSON String: #{json_string.size()}"
30
+ # puts json_string
31
+ # puts
32
+
33
+ compressed_json_string = Zlib::Deflate.deflate(json_string)
34
+ puts "Compressed JSON String: #{compressed_json_string.size()}"
35
+ # puts compressed_json_string
36
+ # puts
37
+
38
+ escaped_json_string = CGI.escape(json_string)
39
+ puts "Escaped JSON String: #{escaped_json_string.size()}"
40
+ # puts escaped_json_string
41
+ # puts
42
+
43
+ escaped_compressed_json_string = CGI.escape(compressed_json_string)
44
+ puts "Compressed Escaped JSON String: #{escaped_compressed_json_string.size()}"
45
+ # puts escaped_compressed_json_string
46
+ # puts
47
+
48
+
49
+ property_literals = JSON.parse(json_string)
50
+
51
+ msgpack_string = property_literals.to_msgpack()
52
+ puts "MsgPack String: #{msgpack_string.size()}"
53
+ # puts msgpack_string
54
+ # puts
55
+
56
+ compressed_msgpack_string = Zlib::Deflate.deflate(msgpack_string)
57
+ puts "Compressed MsgPack String: #{compressed_msgpack_string.size()}"
58
+ # puts compressed_msgpack_string
59
+ # puts
60
+
61
+ escaped_msgpack_string = CGI.escape(msgpack_string)
62
+ puts "Escaped MsgPack String: #{escaped_msgpack_string.size()}"
63
+ # puts escaped_msgpack_string
64
+ # puts
65
+
66
+ escaped_compressed_msgpack_string = CGI.escape(compressed_msgpack_string)
67
+ puts "Compressed Escaped MsgPack String: #{escaped_compressed_msgpack_string.size()}"
68
+ # puts escaped_compressed_msgpack_string
69
+ # puts
70
+
71
+ puts
72
+
73
+ predicate = PredicateLiteral.parse(property_literals)
74
+ table = Arel::Table.new(:user)
75
+
76
+ puts predicate.build_arel(table).to_sql
77
+ puts
@@ -0,0 +1,80 @@
1
+ require "PredicateLiteralKit4Ruby/version"
2
+
3
+ LITERAL_KEY_MAPPING = {}
4
+
5
+ module PredicateLiteral
6
+
7
+ require "expression"
8
+ require "predicate"
9
+
10
+ def self.parse(array)
11
+ type = array[0]
12
+ case (type)
13
+ when "cmd"
14
+ return CompoundPredicate.parse(array)
15
+ when "cmp"
16
+ return ComparisonPredicate.parse(array)
17
+ when "agr"
18
+ return AggregateExpression.parse(array)
19
+ when "key"
20
+ return KeypathExpression.parse(array)
21
+ when "con"
22
+ return ConstantExpression.parse(array)
23
+ when true
24
+ return BooleanExpression::TRUE
25
+ when false
26
+ return BooleanExpression::FALSE
27
+ when "slf"
28
+ return SelfExpression::singleton
29
+ when "fn"
30
+ return FunctionExpression.parse(array)
31
+ when "var"
32
+ return VariableExpression.parse(array)
33
+ else
34
+ raise "Unknown Predicate type (#{array.inspect})!"
35
+ end
36
+ end
37
+
38
+ end
39
+
40
+ module SortDescriptorLiteral
41
+
42
+ def self.parse(array)
43
+ array.map do |each|
44
+ SortDescriptor.parse(each)
45
+ end
46
+ end
47
+
48
+ class SortDescriptor
49
+
50
+ attr_reader :key, :selector, :ascending
51
+
52
+ def self.parse(array)
53
+ self.new(array[0], array[1], array[2])
54
+ end
55
+
56
+ def initialize(key, selector, ascending)
57
+ @key = key
58
+ @selector = selector
59
+ @ascending = ascending
60
+ end
61
+
62
+ def underscore(camel_cased_word)
63
+ camel_cased_word.to_s.gsub(/::/, '/').
64
+ gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
65
+ gsub(/([a-z\d])([A-Z])/, '\1_\2').
66
+ tr("-", "_").
67
+ downcase
68
+ end
69
+
70
+ def build_arel(arel_table)
71
+ key = underscore(@key) unless (key = LITERAL_KEY_MAPPING[@key])
72
+ key = key.to_sym
73
+ puts "KEY: #{key}"
74
+ return arel_table[key].asc if @ascending
75
+ return arel_table[key].desc
76
+ end
77
+
78
+ end
79
+
80
+ end
@@ -0,0 +1,3 @@
1
+ module PredicateLiteralKit4Ruby
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,15 @@
1
+ class Expression
2
+
3
+ def build_arel(arel_table)
4
+ raise "Subclass"
5
+ end
6
+
7
+ end
8
+
9
+ require "expressions/keypath_expression"
10
+ require "expressions/variable_expression"
11
+ require "expressions/constant_expression"
12
+ require "expressions/function_expression"
13
+ require "expressions/self_expression"
14
+ require "expressions/boolean_expression"
15
+ require "expressions/aggregate_expression"
@@ -0,0 +1,15 @@
1
+ class AggregateExpression < Object
2
+
3
+ def self.parse(array)
4
+ self.new(array[1..-1])
5
+ end
6
+
7
+ def initialize(collection)
8
+ @collection = collection.map { |each| PredicateLiteral.parse(each) }
9
+ end
10
+
11
+ def build_arel(arel_table)
12
+ @collection.map { |each| each.build_arel(arel_table) }
13
+ end
14
+
15
+ end
@@ -0,0 +1,15 @@
1
+ class BooleanExpression < Object
2
+
3
+ def initialize(value)
4
+ @value = value
5
+ end
6
+
7
+ def build_arel(arel_table)
8
+ # return @value ? Arel::Nodes::True.new() : Arel::Nodes::False.new()
9
+ return @value ? 1 : 0
10
+ end
11
+
12
+ TRUE = BooleanExpression.new(true)
13
+ FALSE = BooleanExpression.new(false)
14
+
15
+ end
@@ -0,0 +1,15 @@
1
+ class ConstantExpression < Object
2
+
3
+ def self.parse(array)
4
+ self.new(array[1])
5
+ end
6
+
7
+ def initialize(value)
8
+ @value = value
9
+ end
10
+
11
+ def build_arel(arel_table)
12
+ @value
13
+ end
14
+
15
+ end
@@ -0,0 +1,68 @@
1
+ class FunctionExpression
2
+
3
+ def self.parse(array)
4
+ self.new(array[1], array[2..-1])
5
+ end
6
+
7
+ def initialize(function, arguments)
8
+ @function = function
9
+ @arguments = arguments.map { |each| PredicateLiteral.parse(each) }
10
+ end
11
+
12
+ def build_arel(arel_table)
13
+ arguments = @arguments.map { |each| each.build_arel(arel_table) }
14
+ case @function
15
+ # when "sum:"
16
+ when "count:"
17
+ return arguments.first.count()
18
+ # when "min:"
19
+ # when "max:"
20
+ # when "average:"
21
+ when "first:"
22
+ object = @arguments.first.build_arel(arel_table)
23
+ raise "first:(#{object}) not supported by Arel"
24
+ return object
25
+
26
+ when "last:"
27
+ object = @arguments.first.build_arel(arel_table)
28
+ raise "last::(#{object}) not supported by Arel"
29
+ return object
30
+
31
+ when "fromObject:index:"
32
+ object = @arguments.first.build_arel(arel_table)
33
+ index = @arguments.second.build_arel (arel_table)
34
+ raise "fromObject:(#{object})index:(#{index}) not supported by Arel"
35
+ return object[index]
36
+
37
+ when "add:to:"
38
+ return arguments.reduce(:+)
39
+
40
+ when "from:substract:"
41
+ return arguments.reduce(:-)
42
+
43
+ when "multiply:by:"
44
+ return arguments.reduce(:*)
45
+
46
+ when "divide:by:"
47
+ return arguments.reduce(:/)
48
+
49
+ # when "sqrt:"
50
+
51
+ when "raise:to:"
52
+ return arguments.reduce(:**)
53
+
54
+ # when "abs:"
55
+ # when "now:"
56
+ # when "ln:"
57
+ # when "exp:"
58
+ # when "ceiling:"
59
+ # when "random:"
60
+ # when "modulus:by:"
61
+ # when "chs:"
62
+
63
+ else
64
+ raise "Unknown function #{@function} #{arguments}"
65
+ end
66
+ end
67
+
68
+ end
@@ -0,0 +1,23 @@
1
+ class KeypathExpression < Object
2
+
3
+ def self.parse(array)
4
+ self.new(array[1])
5
+ end
6
+
7
+ def initialize(keypath)
8
+ @keypath = keypath
9
+ end
10
+
11
+ def build_arel(arel_table)
12
+ result = arel_table
13
+ @keypath.split(".").each do |path|
14
+ result = result[path]
15
+ end
16
+ result
17
+ end
18
+
19
+ def keypath
20
+ @keypath
21
+ end
22
+
23
+ end
@@ -0,0 +1,11 @@
1
+ class SelfExpression
2
+
3
+ def self.singleton()
4
+ @@singleton ||= self.new()
5
+ end
6
+
7
+ def build_arel(arel_table)
8
+ raise "SELF not supported in arel"
9
+ end
10
+
11
+ end
@@ -0,0 +1,15 @@
1
+ class VariableExpression < Object
2
+
3
+ def self.parse(json)
4
+ self.new(json[1])
5
+ end
6
+
7
+ def initialize(variable)
8
+ @variable = variable
9
+ end
10
+
11
+ def build_arel(arel_table)
12
+ Object.const_get(@variable)
13
+ end
14
+
15
+ end
@@ -0,0 +1,9 @@
1
+ class Predicate
2
+
3
+ def build_arel(arel_table)
4
+ raise "Subclass"
5
+ end
6
+
7
+ require "predicates/compound_predicate"
8
+ require "predicates/comparison_predicate"
9
+ end
@@ -0,0 +1,73 @@
1
+ class ComparisonPredicate < Object
2
+
3
+ def self.parse(array)
4
+ self.new(array[1], array[2], array[3], array[4], array[5])
5
+ end
6
+
7
+ def initialize(operator, lhs, rhs, options = [], modifier = "")
8
+ @operator = operator
9
+ @lhs = PredicateLiteral.parse(lhs)
10
+ @rhs = PredicateLiteral.parse(rhs)
11
+ @options = options
12
+ @modifer = modifier
13
+ end
14
+
15
+ def build_arel(arel_table)
16
+ lhs = @lhs.build_arel(arel_table)
17
+ rhs = @rhs.build_arel(arel_table)
18
+ case @operator
19
+ when "=="
20
+ # The left-hand expression is equal to the right-hand expression.
21
+ return lhs.eq(rhs)
22
+
23
+ when ">="
24
+ # The left-hand expression is greater than or equal to the right-hand expression.
25
+ return lhs.gteq(rhs)
26
+
27
+ when "<="
28
+ # The left-hand expression is less than or equal to the right-hand expression.
29
+ return lhs.lteq(rhs)
30
+
31
+ when ">"
32
+ # The left-hand expression is greater than the right-hand expression.
33
+ return lhs.gt(rhs)
34
+
35
+ when "<"
36
+ # The left-hand expression is less than the right-hand expression.
37
+ return lhs.lt(rhs)
38
+
39
+ when "!="
40
+ # The left-hand expression is not equal to the right-hand expression.
41
+ return lhs.not_eq(rhs)
42
+
43
+ when "BEGINSWITH"
44
+ # The left-hand expression begins with the right-hand expression.
45
+ return lhs.matches("%#{rhs}")
46
+
47
+ when "CONTAINS"
48
+ # The left-hand expression contains the right-hand expression.
49
+ return lhs.matches("%#{rhs}%")
50
+
51
+ when "ENDSWITH"
52
+ # The left-hand expression ends with the right-hand expression.
53
+ return lhs.matches("#{rhs}%")
54
+
55
+ when "LIKE"
56
+ # The left hand expression equals the right-hand expression: ? and * are allowed as wildcard characters,
57
+ # where ? matches 1 character and * matches 0 or more characters.
58
+ return lhs.matches(rhs.tr("*?", "%_"))
59
+
60
+ when "MATCHES"
61
+ # The left hand expression equals the right hand expression using a regex-style comparison according to
62
+ # ICU v3 (for more details see the ICU User Guide for Regular Expressions).
63
+ raise "MATCHES Operator (RegExps) not supported!"
64
+
65
+ when "IN"
66
+ return lhs.in(rhs)
67
+
68
+ else
69
+ raise "Unknown Operator #{@operator}"
70
+ end
71
+ end
72
+
73
+ end
@@ -0,0 +1,34 @@
1
+ class CompoundPredicate < Object
2
+
3
+ def self.parse(array)
4
+ self.new(array[1], array[2..-1])
5
+ end
6
+
7
+ def initialize(operator, subpredicates)
8
+ @operator = operator
9
+ @subpredicates = subpredicates.map { |each| PredicateLiteral.parse(each) }
10
+ end
11
+
12
+ def build_arel(arel_table)
13
+ return BooleanExpression::TRUE.build_arel(arel_table) if @subpredicates.empty?
14
+
15
+ lhs = @subpredicates.first.build_arel(arel_table)
16
+ case @operator
17
+ when "&"
18
+ @subpredicates[1..-1].each do |each|
19
+ rhs = each.build_arel(arel_table)
20
+ lhs = lhs.and(rhs)
21
+ end
22
+ when "|"
23
+ @subpredicates[1..-1].each do |each|
24
+ rhs = each.build_arel(arel_table)
25
+ lhs = lhs.or(rhs)
26
+ end
27
+ when "!"
28
+ lhs = lhs.not()
29
+ else
30
+ raise "Unknown operator #{@operator}"
31
+ end
32
+ lhs
33
+ end
34
+ end
metadata ADDED
@@ -0,0 +1,180 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: PredicateLiteralKit4Ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Udo Schneider
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-12-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: activerecord
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: sqlite3
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: arel
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: json
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: msgpack
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: Parse Cappuccino Literal predicated and sort descriptors to arel expressions
127
+ email:
128
+ - Udo.Schneider@homeaddress.de
129
+ executables:
130
+ - sample.rb
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - .gitignore
135
+ - Gemfile
136
+ - LICENSE.txt
137
+ - PredicateLiteralKit4Ruby.gemspec
138
+ - README.md
139
+ - Rakefile
140
+ - bin/sample.rb
141
+ - lib/PredicateLiteralKit4Ruby.rb
142
+ - lib/PredicateLiteralKit4Ruby/version.rb
143
+ - lib/expression.rb
144
+ - lib/expressions/aggregate_expression.rb
145
+ - lib/expressions/boolean_expression.rb
146
+ - lib/expressions/constant_expression.rb
147
+ - lib/expressions/function_expression.rb
148
+ - lib/expressions/keypath_expression.rb
149
+ - lib/expressions/self_expression.rb
150
+ - lib/expressions/variable_expression.rb
151
+ - lib/predicate.rb
152
+ - lib/predicates/comparison_predicate.rb
153
+ - lib/predicates/compound_predicate.rb
154
+ homepage: ''
155
+ licenses:
156
+ - MIT
157
+ post_install_message:
158
+ rdoc_options: []
159
+ require_paths:
160
+ - lib
161
+ required_ruby_version: !ruby/object:Gem::Requirement
162
+ none: false
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ none: false
169
+ requirements:
170
+ - - ! '>='
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ requirements: []
174
+ rubyforge_project:
175
+ rubygems_version: 1.8.24
176
+ signing_key:
177
+ specification_version: 3
178
+ summary: Parse Cappuccino Literal predicated and sort descriptors to arel expressions
179
+ test_files: []
180
+ has_rdoc: