fluent_conditions 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - rbx-2.0
6
+ - jruby
7
+ - ruby-head
8
+ - ree
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'rake'
4
+
5
+ gemspec
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2011 Tomasz Lipinski
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,100 @@
1
+ #Fluent Conditions
2
+ Simplify your conditional expressions.
3
+
4
+ [![Build Status](https://secure.travis-ci.org/pplcanfly/fluent_conditions.png)](http://travis-ci.org/pplcanfly/fluent_conditions)
5
+
6
+ ##Installation
7
+ gem install fluent_conditions
8
+
9
+ ##Examples
10
+
11
+ ###Basic usage with boolean fields
12
+
13
+ class User
14
+ include FluentConditions
15
+
16
+ attr_accessor :admin, :logged_in
17
+
18
+ fluent :admin
19
+ fluent :logged_in
20
+ end
21
+
22
+ user = User.new
23
+ user.admin = true
24
+ user.logged_in = true
25
+
26
+ And instead of:
27
+
28
+ user.logged_in && user.admin
29
+
30
+ Write it more fluently and DRY:
31
+
32
+ user.is.logged_in.admin? #=> true
33
+
34
+ User class with FluentConditions module included provides *is* method and *is_not* method as well. It returns negated result of an expression. As an expression methods you may also use negated versions of *admin* and *logged_in* methods - *not_admin*, *not_logged_in*.
35
+
36
+ *and* method is optional and in fact it does nothing except increasing readability in some cases.
37
+
38
+ user.is_not.logged_in.admin? #=> false
39
+ user.is.logged_in.and.not_admin? #=> false
40
+
41
+ Only last method in expression should be followed by question mark.
42
+
43
+ ###:values
44
+
45
+ This option defines a set of expression methods. It may be useful for fields with limited set of possible values:
46
+
47
+ class Product
48
+ include FluentConditions
49
+
50
+ attr_accessor :color
51
+
52
+ fluent :color, :values => [:red, :green, :blue]
53
+ end
54
+
55
+ product = Product.new
56
+ product.color = :red
57
+ product.is.red? # => true
58
+
59
+ You can also use *or operator* in expressions:
60
+
61
+ product.is.red.or.green? #=> true
62
+ product.is.blue.or.green? #=> false
63
+
64
+ *or operator* can be placed anywhere between two expression methods and it affects only them.
65
+
66
+ So in the case below:
67
+
68
+ product.is.red.green.or.blue?
69
+
70
+ Expression will be interpreted like:
71
+
72
+ product.color == :red && (product.color == :green || product.color == :blue)
73
+
74
+ ###:if
75
+
76
+ The :if option allows you to define custom methods checking some conditions:
77
+
78
+ class Product
79
+ include FluentConditions
80
+
81
+ attr_accessor :price
82
+
83
+ fluent :price, :as => :cheap, :if => lambda {|price| price < 100}
84
+ end
85
+
86
+ product = Product.new
87
+ product.price = 1000
88
+ product.is.cheap? #=> false
89
+
90
+ ###OR
91
+
92
+ With *big OR* you can build even more complex expressions. The difference between *OR* and *or* is how expression will be interpreted.
93
+
94
+ For instance if we had a Fruit class with :name and :color attributes, each having some set of possible values, we could write expression like:
95
+
96
+ fruit.is.red.apple.OR.yellow.banana?
97
+
98
+ This expression would be interpreted like:
99
+
100
+ (fruit.color == :red && fruit.name == :apple) || (fruit.color == :yellow && fruit.name == :banana)
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ desc 'Default: run specs.'
5
+ task :default => :spec
6
+
7
+ desc "Run specs"
8
+ RSpec::Core::RakeTask.new do |t|
9
+ t.pattern = "./spec/**/*_spec.rb"
10
+ end
@@ -0,0 +1,20 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+ require 'fluent_conditions/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "fluent_conditions"
6
+ s.version = FluentConditions::VERSION
7
+ s.required_ruby_version = '>= 1.8.7'
8
+
9
+ s.summary = "Simplifies complex conditions"
10
+
11
+ s.author = "pplcanfly"
12
+ s.homepage = "http://github.com/pplcanfly/fluent_conditions"
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+
19
+ s.add_development_dependency "rspec"
20
+ end
@@ -1,7 +1,10 @@
1
+ require File.expand_path('../fluent_conditions/condition_builder.rb', __FILE__)
2
+ require File.expand_path('../fluent_conditions/accessor_definers.rb', __FILE__)
3
+
1
4
  module FluentConditions
2
5
 
3
6
  def self.included(base)
4
- base.instance_variable_set(:@builder, Class.new(Builder))
7
+ base.instance_variable_set(:@builder, Class.new(ConditionBuilder))
5
8
 
6
9
  base.class_eval do
7
10
  include InstanceMethods
@@ -20,131 +23,14 @@ module FluentConditions
20
23
  end
21
24
  end
22
25
 
23
- module ClassMethods
26
+ module ClassMethods
24
27
  def fluent(field, options = {})
25
- builder = instance_variable_get(:@builder)
26
-
27
- if options.include?(:values)
28
- options[:values].each do |value|
29
- builder.class_eval do
30
- define_method(value) do
31
- update_and_continue(instance_variable_get(:@object).send(field) == value)
32
- end
33
-
34
- define_method("#{value}?") do
35
- update_and_finish(instance_variable_get(:@object).send(field) == value)
36
- end
37
-
38
- define_method("not_#{value}") do
39
- update_and_continue(instance_variable_get(:@object).send(field) != value)
40
- end
41
-
42
- define_method("not_#{value}?") do
43
- update_and_finish(instance_variable_get(:@object).send(field) != value)
44
- end
45
- end
46
- end
47
- elsif options.include?(:if)
48
- field_name = options[:as]
49
- condition_check = options[:if]
50
-
51
- builder.class_eval do
52
- define_method(field_name) do
53
- update_and_continue(condition_check.call(instance_variable_get(:@object).send(field)))
54
- end
55
-
56
- define_method("#{field_name}?") do
57
- update_and_finish(condition_check.call(instance_variable_get(:@object).send(field)))
58
- end
59
-
60
- define_method("not_#{field_name}") do
61
- update_and_continue(!condition_check.call(instance_variable_get(:@object).send(field)))
62
- end
28
+ accessor_definer = AccessorDefinerFactory.make_for(options)
29
+ condition_builder = instance_variable_get(:@builder)
63
30
 
64
- define_method("not_#{field_name}?") do
65
- update_and_finish(!condition_check.call(instance_variable_get(:@object).send(field)))
66
- end
67
- end
68
- else
69
- builder.class_eval do
70
- define_method(field) do
71
- update_and_continue(instance_variable_get(:@object).send(field))
72
- end
73
-
74
- define_method("#{field}?") do
75
- update_and_finish(instance_variable_get(:@object).send(field))
76
- end
77
-
78
- define_method("not_#{field}") do
79
- update_and_continue(!instance_variable_get(:@object).send(field))
80
- end
81
-
82
- define_method("not_#{field}?") do
83
- update_and_finish(!instance_variable_get(:@object).send(field))
84
- end
85
- end
86
- end
31
+ accessor_definer.define(condition_builder, field)
87
32
  end
88
33
  end
89
34
 
90
-
91
- class Builder
92
- def initialize(object, type)
93
- @object = object
94
- @type = type
95
- @previous, @current, @big_or = true, true, false
96
- end
97
-
98
- def or
99
- @or_flag = true
100
- self
101
- end
102
-
103
- def OR
104
- @big_or = @big_or || result
105
- @big_or_flag = true
106
- @previous, @current = true, true
107
- self
108
- end
109
-
110
- def and
111
- self
112
- end
113
-
114
- private
115
-
116
- def update_and_continue(field_value)
117
- update_result(field_value)
118
- self
119
- end
120
-
121
- def update_and_finish(field_value)
122
- update_result(field_value)
123
- end_result
124
- end
125
-
126
- def update_result(field_value)
127
- if @or_flag
128
- @current = @current || field_value
129
- @or_flag = false
130
- else
131
- @previous, @current = @previous && @current, field_value
132
- end
133
- end
134
-
135
- def end_result
136
- if @big_or_flag
137
- return (@big_or || result) if @type == :positive
138
- return !(@big_or || result) if @type == :negative
139
- end
140
- return result if @type == :positive
141
- return !result if @type == :negative
142
- end
143
-
144
- def result
145
- @previous && @current
146
- end
147
-
148
- end
149
35
  end
150
36
 
@@ -0,0 +1,123 @@
1
+ module FluentConditions
2
+ class AccessorDefinerFactory
3
+ def self.make_for(options)
4
+ if options.include?(:values)
5
+ TextValueAccessorDefiner.new(options)
6
+ elsif options.include?(:if)
7
+ CustomAccessorDefiner.new(options)
8
+ else
9
+ BooleanAccessorDefiner.new(options)
10
+ end
11
+ end
12
+ end
13
+
14
+ class FluentAccessorMethod
15
+ def initialize(name)
16
+ @name = name
17
+ end
18
+
19
+ def positive_check
20
+ @name
21
+ end
22
+
23
+ def negative_check
24
+ "not_#{@name}"
25
+ end
26
+
27
+ def positive_check_with_result
28
+ "#{@name}?"
29
+ end
30
+
31
+ def negative_check_with_result
32
+ "not_#{@name}?"
33
+ end
34
+ end
35
+
36
+ class TextValueAccessorDefiner
37
+ def initialize(options)
38
+ @options = options
39
+ end
40
+
41
+ def define(builder, field)
42
+ @options[:values].each do |value|
43
+ accessor_method = FluentAccessorMethod.new(value)
44
+
45
+ builder.class_eval do
46
+ define_method(accessor_method.positive_check) do
47
+ update_and_continue(instance_variable_get(:@object).send(field) == value)
48
+ end
49
+
50
+ define_method(accessor_method.positive_check_with_result) do
51
+ update_and_finish(instance_variable_get(:@object).send(field) == value)
52
+ end
53
+
54
+ define_method(accessor_method.negative_check) do
55
+ update_and_continue(instance_variable_get(:@object).send(field) != value)
56
+ end
57
+
58
+ define_method(accessor_method.negative_check_with_result) do
59
+ update_and_finish(instance_variable_get(:@object).send(field) != value)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ class CustomAccessorDefiner
67
+ def initialize(options)
68
+ @options = options
69
+ end
70
+
71
+ def define(builder, field)
72
+ field_name = @options[:as]
73
+ condition_check = @options[:if]
74
+ accessor_method = FluentAccessorMethod.new(field_name)
75
+
76
+ builder.class_eval do
77
+ define_method(accessor_method.positive_check) do
78
+ update_and_continue(condition_check.call(instance_variable_get(:@object).send(field)))
79
+ end
80
+
81
+ define_method(accessor_method.positive_check_with_result) do
82
+ update_and_finish(condition_check.call(instance_variable_get(:@object).send(field)))
83
+ end
84
+
85
+ define_method(accessor_method.negative_check) do
86
+ update_and_continue(!condition_check.call(instance_variable_get(:@object).send(field)))
87
+ end
88
+
89
+ define_method(accessor_method.negative_check_with_result) do
90
+ update_and_finish(!condition_check.call(instance_variable_get(:@object).send(field)))
91
+ end
92
+ end
93
+ end
94
+ end
95
+
96
+ class BooleanAccessorDefiner
97
+ def initialize(options)
98
+ @options = options
99
+ end
100
+
101
+ def define(builder, field)
102
+ accessor_method = FluentAccessorMethod.new(field)
103
+
104
+ builder.class_eval do
105
+ define_method(accessor_method.positive_check) do
106
+ update_and_continue(instance_variable_get(:@object).send(field))
107
+ end
108
+
109
+ define_method(accessor_method.positive_check_with_result) do
110
+ update_and_finish(instance_variable_get(:@object).send(field))
111
+ end
112
+
113
+ define_method(accessor_method.negative_check) do
114
+ update_and_continue(!instance_variable_get(:@object).send(field))
115
+ end
116
+
117
+ define_method(accessor_method.negative_check_with_result) do
118
+ update_and_finish(!instance_variable_get(:@object).send(field))
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,64 @@
1
+ module FluentConditions
2
+ class ConditionBuilder
3
+ def initialize(object, type)
4
+ @object = object
5
+ @type = type
6
+ @previous, @current, @big_or = true, true, false
7
+ end
8
+
9
+ def or
10
+ @or_used = true
11
+ self
12
+ end
13
+
14
+ def OR
15
+ update_big_or_result
16
+ @big_or_used = true
17
+ self
18
+ end
19
+
20
+ def and
21
+ self
22
+ end
23
+
24
+ private
25
+
26
+ def update_and_continue(field_value)
27
+ update_current_result(field_value)
28
+ self
29
+ end
30
+
31
+ def update_and_finish(field_value)
32
+ update_current_result(field_value)
33
+ update_big_or_result if @big_or_used
34
+ end_result
35
+ end
36
+
37
+ def update_current_result(field_value)
38
+ if @or_used
39
+ @current = @current || field_value
40
+ @or_used = false
41
+ else
42
+ @previous, @current = @previous && @current, field_value
43
+ end
44
+ end
45
+
46
+ def update_big_or_result
47
+ @big_or = @big_or || current_result
48
+ @previous, @current = true, true
49
+ end
50
+
51
+ def current_result
52
+ @previous && @current
53
+ end
54
+
55
+ def end_result
56
+ @type == :positive ? sub_result : !sub_result
57
+ end
58
+
59
+ def sub_result
60
+ @big_or_used ? @big_or : current_result
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,3 @@
1
+ module FluentConditions
2
+ VERSION = "0.0.3"
3
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ module FluentConditions
4
+
5
+ describe BooleanAccessorDefiner do
6
+ it "should add accessor methods" do
7
+ clazz = Class.new do
8
+ include FluentConditions
9
+ attr_accessor :admin
10
+ fluent :admin
11
+ end
12
+ @obj = clazz.new
13
+
14
+ @obj.is.should respond_to(:admin)
15
+ @obj.is.should respond_to(:admin?)
16
+ @obj.is.should respond_to(:not_admin)
17
+ @obj.is.should respond_to(:not_admin?)
18
+ end
19
+ end
20
+
21
+ describe TextValueAccessorDefiner do
22
+ it "should add accessor methods" do
23
+ clazz = Class.new do
24
+ include FluentConditions
25
+ attr_accessor :color
26
+ fluent :color, :values => [:red, :green]
27
+ end
28
+ @product = clazz.new
29
+
30
+ @product.is.should respond_to(:red)
31
+ @product.is.should respond_to(:green)
32
+ @product.is.should respond_to(:not_red)
33
+ @product.is.should respond_to(:not_green)
34
+
35
+ @product.is.should respond_to(:red?)
36
+ @product.is.should respond_to(:green?)
37
+ @product.is.should respond_to(:not_red?)
38
+ @product.is.should respond_to(:not_green?)
39
+ end
40
+ end
41
+
42
+ describe CustomAccessorDefiner do
43
+ it "should add accessor methods" do
44
+ clazz = Class.new do
45
+ include FluentConditions
46
+ attr_accessor :length
47
+ fluent :length, :as => :long, :if => proc { |length| length >= 500 }
48
+ fluent :length, :as => :short, :if => proc { |length| length < 500 }
49
+ end
50
+ @post = clazz.new
51
+ @post.is.should respond_to(:long)
52
+ @post.is.should respond_to(:not_long)
53
+ @post.is.should respond_to(:long?)
54
+ @post.is.should respond_to(:not_long?)
55
+
56
+ @post.is.should respond_to(:short)
57
+ @post.is.should respond_to(:not_short)
58
+ @post.is.should respond_to(:short?)
59
+ @post.is.should respond_to(:not_short?)
60
+ end
61
+ end
62
+
63
+ end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  module FluentConditions
4
4
 
5
- describe Builder do
5
+ describe ConditionBuilder do
6
6
 
7
7
  describe "checking simple boolean conditions" do
8
8
  before(:each) do
@@ -14,13 +14,6 @@ module FluentConditions
14
14
  @obj = clazz.new
15
15
  end
16
16
 
17
- it "should respond to added methods" do
18
- @obj.is.should respond_to(:admin)
19
- @obj.is.should respond_to(:admin?)
20
- @obj.is.should respond_to(:not_admin)
21
- @obj.is.should respond_to(:not_admin?)
22
- end
23
-
24
17
  it "should check for admin user if it's admin or not" do
25
18
  @obj.admin = true
26
19
  @obj.is.admin?.should be_true
@@ -59,18 +52,27 @@ module FluentConditions
59
52
  @obj.good = true
60
53
  @obj.bad = true
61
54
  @obj.is.good.bad?.should be_true
55
+ @obj.is.not_good.bad?.should be_false
56
+ @obj.is.good.not_bad?.should be_false
57
+ @obj.is.not_good.not_bad?.should be_false
62
58
  end
63
59
 
64
60
  it "should check two true/false conditions" do
65
61
  @obj.good = true
66
62
  @obj.bad = false
67
63
  @obj.is.good.bad?.should be_false
64
+ @obj.is.not_good.bad?.should be_false
65
+ @obj.is.good.not_bad?.should be_true
66
+ @obj.is.not_good.not_bad?.should be_false
68
67
  end
69
68
 
70
69
  it "should check two false conditions" do
71
70
  @obj.good = false
72
71
  @obj.bad = false
73
72
  @obj.is.good.bad?.should be_false
73
+ @obj.is.not_good.bad?.should be_false
74
+ @obj.is.good.not_bad?.should be_false
75
+ @obj.is.not_good.not_bad?.should be_true
74
76
  end
75
77
  end
76
78
 
@@ -153,28 +155,21 @@ module FluentConditions
153
155
  @product = clazz.new
154
156
  end
155
157
 
156
- it "should respond to accesor methods" do
157
- @product.is.should respond_to(:red)
158
- @product.is.should respond_to(:green)
159
- @product.is.should respond_to(:not_red)
160
- @product.is.should respond_to(:not_green)
161
-
162
- @product.is.should respond_to(:red?)
163
- @product.is.should respond_to(:green?)
164
- @product.is.should respond_to(:not_red?)
165
- @product.is.should respond_to(:not_green?)
166
- end
167
-
168
158
  it "should check condition by value" do
169
159
  @product.color = :red
170
160
 
171
161
  @product.is.red?.should be_true
162
+ @product.is.not_red?.should be_false
163
+
172
164
  @product.is.green?.should be_false
165
+ @product.is.not_green?.should be_true
166
+
173
167
  @product.is.red.and.green?.should be_false
174
- @product.is.red.or.green?.should be_true
168
+ @product.is.not_red.and.green?.should be_false
169
+ @product.is.red.and.not_green?.should be_true
170
+ @product.is.not_red.and.not_green?.should be_false
175
171
 
176
- @product.is.not_red?.should be_false
177
- @product.is.not_green?.should be_true
172
+ @product.is.red.or.green?.should be_true
178
173
  end
179
174
  end
180
175
 
@@ -189,25 +184,19 @@ module FluentConditions
189
184
  @post = clazz.new
190
185
  end
191
186
 
192
- it "should respond to new methods" do
193
- @post.is.should respond_to(:long)
194
- @post.is.should respond_to(:not_long)
195
- @post.is.should respond_to(:long?)
196
- @post.is.should respond_to(:not_long?)
197
-
198
- @post.is.should respond_to(:short)
199
- @post.is.should respond_to(:not_short)
200
- @post.is.should respond_to(:short?)
201
- @post.is.should respond_to(:not_short?)
202
- end
203
-
204
187
  it "should check condition defined by user" do
205
188
  @post.length = 600
206
189
 
207
190
  @post.is.long?.should be_true
208
191
  @post.is.not_long?.should be_false
192
+
209
193
  @post.is.short?.should be_false
210
194
  @post.is.short.or.long?.should be_true
195
+
196
+ @post.is.long.and.short?.should be_false
197
+ @post.is.long.and.not_short?.should be_true
198
+ @post.is.not_long.and.short?.should be_false
199
+ @post.is.not_long.and.not_short?.should be_false
211
200
  end
212
201
  end
213
202
 
@@ -20,8 +20,8 @@ module FluentConditions
20
20
  @obj.should respond_to(:is)
21
21
  end
22
22
 
23
- it "should return Builder object when calling 'is'" do
24
- @obj.is.should be_kind_of(Builder)
23
+ it "should return ConditionBuilder object when calling 'is'" do
24
+ @obj.is.should be_kind_of(ConditionBuilder)
25
25
  end
26
26
 
27
27
  it "should return new builder each time" do
data/spec/spec_helper.rb CHANGED
@@ -1 +1,4 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
1
4
  require 'fluent_conditions'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent_conditions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,19 +9,42 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-18 00:00:00.000000000 +02:00
12
+ date: 2011-11-09 00:00:00.000000000 +01:00
13
13
  default_executable:
14
- dependencies: []
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ requirement: &15565060 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: *15565060
15
26
  description:
16
27
  email:
17
28
  executables: []
18
29
  extensions: []
19
30
  extra_rdoc_files: []
20
31
  files:
32
+ - .gitignore
33
+ - .rspec
34
+ - .travis.yml
35
+ - Gemfile
36
+ - MIT-LICENSE
37
+ - README.md
38
+ - Rakefile
39
+ - fluent_conditions.gemspec
21
40
  - lib/fluent_conditions.rb
22
- - spec/spec_helper.rb
41
+ - lib/fluent_conditions/accessor_definers.rb
42
+ - lib/fluent_conditions/condition_builder.rb
43
+ - lib/fluent_conditions/version.rb
44
+ - spec/fluent_conditions/accessor_definers_spec.rb
45
+ - spec/fluent_conditions/condition_builder_spec.rb
23
46
  - spec/fluent_conditions/fluent_conditions_spec.rb
24
- - spec/fluent_conditions/builder_spec.rb
47
+ - spec/spec_helper.rb
25
48
  has_rdoc: true
26
49
  homepage: http://github.com/pplcanfly/fluent_conditions
27
50
  licenses: []