conditioner 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,55 +4,44 @@
4
4
 
5
5
  == DESCRIPTION:
6
6
 
7
- Simple conditions builder for active_resource
7
+ Simple conditions builder for active_record
8
8
 
9
- == SYNOPSIS:
9
+ == INSTALL:
10
10
 
11
- def test_conditioner_creation
12
- cnd = User.conditioner
13
- assert_not_nil(cnd)
14
- params={:name=>'nicola',:email=>'nicola@mail.com'}
15
- cnd = User.conditioner(params)
16
- assert_not_nil(cnd)
17
- end
11
+ in config/environment.rb:
18
12
 
19
- def test_extraction
20
- cnd=User.conditioner(:updated_at=>'2009-01-01', :email=>'nicola@mail.com',:unexisting=>'value')
21
- assert_match(/"users"."email"\s*=\s*E'nicola@mail.com'/, cnd)
22
- assert_match(/users.updated_at BETWEEN E'2009-01-01 00:00' AND E'2009-01-01 23:59:59.999'/, cnd)
23
- assert_no_match(/unexisting/, cnd)
24
- end
13
+ config.gem 'conditioner'
25
14
 
26
- def test_extract_from_and_to_prefixed_date_fields
27
- cnd = User.conditioner :to_updated_at =>'2010-02-02', :from_updated_at=>'2009-01-01'
28
- assert_match(/updated_at <= E'2010-02-02 23:59:59.999'/, cnd)
29
- assert_match(/updated_at >= E'2009-01-01 00:00:00.000'/, cnd)
30
- end
15
+ and then
31
16
 
32
- def test_ilike
33
- cnd = User.conditioner :name=>'*nicola*'
34
- assert_match(/name ILIKE E'%nicola%'/, cnd)
35
- end
17
+ sudo rake gems:install
36
18
 
37
- == TODO:
19
+ To override Conditioner configurations create config/initializers/conditioner.rb with:
38
20
 
39
- * Add pluguble rules for extactions
40
21
 
41
- Example:
22
+ Conditioner.configure do
42
23
 
43
- Conditioner.configure do
44
24
  extraction_rule do |key,value|
45
25
  if /.*_gt/ =~ key
46
26
  ["#{table_name}.#{key.gsub(/_gt$/,'')} > ?",value]
47
27
  end
48
28
  end
49
- end
29
+ end
50
30
 
51
- == INSTALL:
31
+ == USAGE
52
32
 
53
- in config/environmen.rb
54
- gem 'conditioner'
55
- sudo rake gems:install
33
+ #this create conditions from params using extract rules
34
+ cnd = YourModel.conditioner(params)
35
+ #<b>and</b> and <b>or</b> eat same parameters as :conditions option in ActiveRecord.find
36
+ cnd.and :field=>'value'
37
+ cnd.and ['field='?',value]
38
+
39
+ #here we pass condition into find methods
40
+ YourModel.all(:conditions=>cnd)
41
+
42
+ == CHANGE LIST:
43
+
44
+ * 0.0.2 Add configurable rules for extactions
56
45
 
57
46
  == LICENSE:
58
47
 
data/Rakefile CHANGED
@@ -1,35 +1,46 @@
1
- require 'rubygems'
2
- gem 'hoe', '>= 2.1.0'
3
- require 'hoe'
4
- require 'fileutils'
5
- require './lib/conditioner'
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+ require 'rake/gempackagetask'
6
5
 
7
- Hoe.plugin :newgem
8
- # Hoe.plugin :website
9
- # Hoe.plugin :cucumberfeatures
6
+ desc 'Default: run unit tests.'
7
+ task :default => :test
10
8
 
11
- # Generate all the Rake tasks
12
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
13
- $hoe = Hoe.spec 'conditioner' do
14
- self.developer 'niquola', 'niquola@gmail.com'
15
- self.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
16
- self.rubyforge_name = self.name # TODO this is default value
17
- self.extra_deps = [['activerecord','>= 2.3.5']]
9
+ desc 'Test the pg_gnostic plugin.'
10
+ Rake::TestTask.new(:test) do |t|
11
+ t.libs << 'lib'
12
+ t.libs << 'test'
13
+ t.pattern = 'test/**/*_test.rb'
14
+ t.verbose = true
15
+ end
18
16
 
17
+ desc 'Generate documentation for the pg_gnostic plugin.'
18
+ Rake::RDocTask.new(:rdoc) do |rdoc|
19
+ rdoc.rdoc_dir = 'rdoc'
20
+ rdoc.title = 'Conditioner'
21
+ rdoc.options << '--line-numbers' << '--inline-source'
22
+ rdoc.rdoc_files.include('README.rdoc')
23
+ rdoc.rdoc_files.include('lib/**/*.rb')
19
24
  end
20
25
 
21
- require 'newgem/tasks'
22
- Dir['tasks/**/*.rake'].each { |t| load t }
23
26
 
27
+ PKG_FILES = FileList[ '[a-zA-Z]*', 'generators/**/*', 'lib/**/*', 'rails/**/*', 'tasks/**/*', 'test/**/*' ]
28
+
29
+ spec = Gem::Specification.new do |s|
30
+ s.name = "conditioner"
31
+ s.version = "0.0.2"
32
+ s.author = "niquola"
33
+ s.email = "niquola@gmail.com"
34
+ s.homepage = "http://github.com/niquola/conditioner"
35
+ s.platform = Gem::Platform::RUBY
36
+ s.summary = "Simple conditions builder for active_record"
37
+ s.files = PKG_FILES.to_a
38
+ s.require_path = "lib"
39
+ s.has_rdoc = false
40
+ s.extra_rdoc_files = ["README.rdoc"]
41
+ end
24
42
 
25
- desc 'push gem to medapp'
26
- namespace :medapp do
27
- task :push do
28
- gem_name = File.basename(Dir['pkg/*.gem'].max)
29
- last_gem = File.join(File.dirname(__FILE__),'pkg',gem_name);
30
- server = 'demo'
31
- gem_copy_path = "/tmp/#{gem_name}"
32
- system "scp #{last_gem} #{server}:#{gem_copy_path}"
33
- system "ssh -t #{server} sudo gem install #{gem_copy_path}"
34
- end
43
+ desc 'Turn this plugin into a gem.'
44
+ Rake::GemPackageTask.new(spec) do |pkg|
45
+ pkg.gem_spec = spec
35
46
  end
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'conditioner'
@@ -5,14 +5,24 @@ module Conditioner
5
5
  VERSION = '0.0.1'
6
6
  autoload :ActiveRecordMixin, 'conditioner/active_record_mixin'
7
7
  autoload :Condition, 'conditioner/condition'
8
+ autoload :Configurator, 'conditioner/configurator'
8
9
 
9
10
  class << self
10
11
  def enable
11
12
  ActiveRecord::Base.send :extend, ActiveRecordMixin
13
+ Conditioner.config.activate_default_rules!
12
14
  end
13
15
 
14
16
  def condition(table_name,fields)
15
17
  end
18
+
19
+ def config
20
+ @config ||= Configurator.new
21
+ end
22
+
23
+ def configure
24
+ yield config
25
+ end
16
26
  end
17
27
  end
18
28
 
@@ -25,6 +25,7 @@ module Conditioner
25
25
  end
26
26
 
27
27
  def add_condition(unit,*args)
28
+ @condition_called_flag= true
28
29
  result= []
29
30
  unless @first_condition
30
31
  result<<' '<<unit
@@ -37,37 +38,22 @@ module Conditioner
37
38
  end
38
39
 
39
40
  def is_field?(field)
40
- @column_names.include?(field.to_s) || (field.to_s =~ /^(from|to)_(\w*_(datetime|at))/ && @column_names.include?($2))
41
+ @column_names.include?(field)
41
42
  end
42
43
 
43
- def c(field_name)
44
+ def with_table_name(field_name)
44
45
  %Q[#{@model.table_name}.#{field_name}]
45
46
  end
46
47
 
47
- #FIXME: document conventions
48
- #add more conventions like
49
- #name_start_from
50
- #field_end_with
51
- #field_in_range
52
- #field_gt
53
- #field_mt
54
48
  def extract(hash)
55
49
  hash.each do |k,v|
56
- next unless is_field?(k)
57
- if v =~ /(\*$|^\*)/
58
- _and(["#{c(k)} ILIKE ?",v.gsub(/(\*$|^\*)/,'%')])
59
- elsif v =~ /(%$|^%)/
60
- _and(["upper(#{c(k)}) like upper(?)",v])
61
- #FIXME: add logic for ranges
62
- elsif k.to_s =~ /^from_(\w*_(datetime|at))/
63
- _and(["#{c($1)} >= ?","#{v} 00:00:00.000"])
64
- elsif k.to_s =~ /^to_(\w*_(datetime|at))/
65
- _and(["#{c($1)} <= ?","#{v} 23:59:59.999"])
66
- elsif k.to_s.include?('_datetime') || k.to_s.include?('_at')
67
- _and(["(#{c(k)} BETWEEN ? AND ?)","#{v} 00:00","#{v} 23:59:59.999"])
68
- else
69
- _and(k=>v)
50
+ field = k.to_s
51
+ Conditioner.config.extract_rules.each do |rule|
52
+ rule.call(field,v,self)
53
+ break if @condition_called_flag
70
54
  end
55
+ _and(field=>v) if is_field?(field) and !@condition_called_flag
56
+ @condition_called_flag = false
71
57
  end
72
58
  self
73
59
  end
@@ -0,0 +1,34 @@
1
+ module Conditioner
2
+ class Configurator
3
+
4
+ def extract_rules
5
+ @rules ||= []
6
+ end
7
+
8
+ def add_rule(&rule)
9
+ extract_rules<< rule
10
+ end
11
+
12
+ #You can clear default rules with
13
+ def clear_rules!
14
+ @rules = []
15
+ end
16
+
17
+ def activate_default_rules!
18
+ add_rule do |field, v, cnd|
19
+ if cnd.is_field?(field) && v =~ /(\*$|^\*)/
20
+ cnd.and(["#{cnd.with_table_name(field)} ILIKE ?",v.gsub(/(\*$|^\*)/,'%')])
21
+ elsif cnd.is_field?(field) && v =~ /(%$|^%)/
22
+ cnd.and(["upper(#{cnd.with_table_name(field)}) like upper(?)",v])
23
+ #FIXME: add logic for ranges
24
+ elsif field=~ /^from_(\w*_(datetime|at))/ and cnd.is_field?($1)
25
+ cnd.and(["#{cnd.with_table_name($1)} >= ?","#{v} 00:00:00.000"])
26
+ elsif field=~ /^to_(\w*_(datetime|at))/ and cnd.is_field?($1)
27
+ cnd.and(["#{cnd.with_table_name($1)} <= ?","#{v} 23:59:59.999"])
28
+ elsif cnd.is_field?(field) && (field.include?('_datetime') || field.include?('_at'))
29
+ cnd.and(["(#{cnd.with_table_name(field)} BETWEEN ? AND ?)","#{v} 00:00","#{v} 23:59:59.999"])
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,5 +1,17 @@
1
1
  require File.dirname(__FILE__) + '/test_helper.rb'
2
2
 
3
+ Conditioner.configure do |cfg|
4
+ #Must be activated by default
5
+ #cfg.activate_default_rules!
6
+ #You can clear default rules with
7
+ #cfg.clear_rules!
8
+
9
+ cfg.add_rule do |key, value, cnd|
10
+ if /(.\w*)_gt/ =~ key.to_s && cnd.is_field?($1)
11
+ cnd.and(["#{key.gsub(/_gt$/,'')} > ?",value])
12
+ end
13
+ end
14
+ end
3
15
 
4
16
  class TestConditioner < Test::Unit::TestCase
5
17
 
@@ -11,12 +23,6 @@ class TestConditioner < Test::Unit::TestCase
11
23
  assert_not_nil(cnd)
12
24
  end
13
25
 
14
- def test_without_model_conditioner
15
- #table_name = 'roles'
16
- #fields = %w{name created_at}
17
- #Conditioner.condition(table_name,fields)
18
- end
19
-
20
26
  def test_extraction
21
27
  cnd=User.conditioner(:updated_at=>'2009-01-01', :email=>'nicola@mail.com',:unexisting=>'value')
22
28
  assert_match(/"users"."email"\s*=\s*E'nicola@mail.com'/, cnd)
@@ -33,5 +39,11 @@ class TestConditioner < Test::Unit::TestCase
33
39
  def test_ilike
34
40
  cnd = User.conditioner :name=>'*nicola*'
35
41
  assert_match(/name ILIKE E'%nicola%'/, cnd)
42
+ assert_no_match(/\*nicola\*/, cnd,'Rule must work only once!')
43
+ end
44
+
45
+ def test_configurator
46
+ cnd = User.conditioner :created_at_gt => '2010-01-01'
47
+ assert_match(/created_at > E'2010-01-01'/, cnd)
36
48
  end
37
49
  end
@@ -1,6 +1,6 @@
1
1
  require 'stringio'
2
- require 'test/unit'
3
2
  require File.dirname(__FILE__) + '/../lib/conditioner'
3
+ require "test/unit"
4
4
  require 'rubygems'
5
5
  require 'active_record'
6
6
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: conditioner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - niquola
@@ -9,82 +9,38 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-03-03 00:00:00 +03:00
12
+ date: 2010-03-04 00:00:00 +03:00
13
13
  default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: activerecord
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 2.3.5
24
- version:
25
- - !ruby/object:Gem::Dependency
26
- name: rubyforge
27
- type: :development
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 2.0.3
34
- version:
35
- - !ruby/object:Gem::Dependency
36
- name: gemcutter
37
- type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- version: 0.3.0
44
- version:
45
- - !ruby/object:Gem::Dependency
46
- name: hoe
47
- type: :development
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- version: 2.5.0
54
- version:
55
- description: Simple conditions builder for active_resource
56
- email:
57
- - niquola@gmail.com
14
+ dependencies: []
15
+
16
+ description:
17
+ email: niquola@gmail.com
58
18
  executables: []
59
19
 
60
20
  extensions: []
61
21
 
62
22
  extra_rdoc_files:
63
- - History.txt
64
- - Manifest.txt
65
- - PostInstall.txt
23
+ - README.rdoc
66
24
  files:
67
- - History.txt
25
+ - init.rb
68
26
  - Manifest.txt
69
27
  - PostInstall.txt
70
- - README.rdoc
71
28
  - Rakefile
29
+ - README.rdoc
30
+ - History.txt
72
31
  - lib/conditioner.rb
73
- - lib/conditioner/active_record_mixin.rb
74
32
  - lib/conditioner/condition.rb
75
- - script/console
76
- - script/destroy
77
- - script/generate
78
- - test/test_conditioner.rb
33
+ - lib/conditioner/active_record_mixin.rb
34
+ - lib/conditioner/configurator.rb
35
+ - test/conditioner_test.rb
79
36
  - test/test_helper.rb
80
37
  has_rdoc: true
81
38
  homepage: http://github.com/niquola/conditioner
82
39
  licenses: []
83
40
 
84
- post_install_message: PostInstall.txt
85
- rdoc_options:
86
- - --main
87
- - README.rdoc
41
+ post_install_message:
42
+ rdoc_options: []
43
+
88
44
  require_paths:
89
45
  - lib
90
46
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -101,11 +57,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
57
  version:
102
58
  requirements: []
103
59
 
104
- rubyforge_project: conditioner
60
+ rubyforge_project:
105
61
  rubygems_version: 1.3.5
106
62
  signing_key:
107
63
  specification_version: 3
108
- summary: Simple conditions builder for active_resource
109
- test_files:
110
- - test/test_conditioner.rb
111
- - test/test_helper.rb
64
+ summary: Simple conditions builder for active_record
65
+ test_files: []
66
+
@@ -1,10 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # File: script/console
3
- irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
-
5
- libs = " -r irb/completion"
6
- # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
- # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
- libs << " -r #{File.dirname(__FILE__) + '/../lib/conditioner.rb'}"
9
- puts "Loading conditioner gem"
10
- exec "#{irb} #{libs} --simple-prompt"
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
- APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
-
4
- begin
5
- require 'rubigen'
6
- rescue LoadError
7
- require 'rubygems'
8
- require 'rubigen'
9
- end
10
- require 'rubigen/scripts/destroy'
11
-
12
- ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
- RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
- RubiGen::Scripts::Destroy.new.run(ARGV)
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
- APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
-
4
- begin
5
- require 'rubigen'
6
- rescue LoadError
7
- require 'rubygems'
8
- require 'rubigen'
9
- end
10
- require 'rubigen/scripts/generate'
11
-
12
- ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
- RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
- RubiGen::Scripts::Generate.new.run(ARGV)