fossil 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.5
1
+ 0.2.6
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{fossil}
8
- s.version = "0.2.5"
8
+ s.version = "0.2.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Patrick Lardin, Daniel Sudol"]
12
- s.date = %q{2010-01-15}
12
+ s.date = %q{2010-01-24}
13
13
  s.description = %q{Access FOS/betrieve db with this Sequel based orm wrapper}
14
14
  s.email = %q{plardin@xojet.com}
15
15
  s.files = [
@@ -11,44 +11,66 @@ class Date
11
11
  end
12
12
  end
13
13
 
14
- class Time
15
- DATE_FORMATS[:hm] = "%H:%M"
14
+ module TimeFunctions
16
15
 
17
- alias :original_to_s :to_s
18
- def to_s(args=nil)
19
- args = :hm unless args
20
- self.original_to_s(args)
16
+ def self.included(klass)
17
+ klass.send(:include,TimeFunctions::InstanceMethods)
18
+ klass.send(:extend,TimeFunctions::ClassMethods)
21
19
  end
22
20
 
23
- # creates utc time from minutes
24
- def self.from_fos_time(minutes)
25
- DateTime.new(2000,1,1).advance(:minutes=>minutes).to_time
26
- end
21
+ module InstanceMethods
22
+ def as_minutes
23
+ hour*60 + min
24
+ end
27
25
 
28
- def as_minutes
29
- hour*60 + min
30
- end
26
+ def in_hundredths
27
+ return 0 if hour + min == 0
28
+ minutes = hour*60 + min
29
+ val = "#{minutes/60}.#{((100*(minutes.modulo(60)))/60).to_s.rjust(2, '0')}"
30
+ BigDecimal.new(val, 2).round(1).to_s
31
+ end
32
+
33
+ def in_hundredths_rounded_XOJET_style
34
+ return 0 if hour + min == 0
35
+ # It was determined that "ODD" increments of .05 (ie .15, .35, .55, .75, .95) of an hour (ie. 9,21,33,45,57 minutes) rounded UP whereas even increments of .05 rounded DOWN - sn
36
+ minutes = hour*60 + min
37
+ (minutes/60.0 + ([9, 21, 33, 45, 57].include?( min ) ? 0.001 : -0.001)).round(2)
38
+ #minutes/60.0
39
+ end
31
40
 
32
- def in_hundredths
33
- return 0 if hour + min == 0
34
- minutes = hour*60 + min
35
- val = "#{minutes/60}.#{((100*(minutes.modulo(60)))/60).to_s.rjust(2,'0')}"
36
- BigDecimal.new(val, 2).round(1).to_s
41
+ def in_tenths_rounded_XOJET_style
42
+ return 0 if hour + min == 0
43
+ # It was determined that "ODD" increments of .05 (ie .15, .35, .55, .75, .95) of an hour (ie. 9,21,33,45,57 minutes) rounded UP whereas even increments of .05 rounded DOWN - sn
44
+ minutes = hour*60 + min
45
+ (minutes/60.0 + ([9, 21, 33, 45, 57].include?( min ) ? 0.01 : -0.01)).round(1)
46
+ end
37
47
  end
38
-
39
- def in_hundredths_rounded_XOJET_style
40
- return 0 if hour + min == 0
41
- # It was determined that "ODD" increments of .05 (ie .15, .35, .55, .75, .95) of an hour (ie. 9,21,33,45,57 minutes) rounded UP whereas even increments of .05 rounded DOWN - sn
42
- minutes = hour*60 + min
43
- (minutes/60.0 + ([9, 21, 33, 45, 57].include?( min ) ? 0.001 : -0.001)).round(2)
44
- #minutes/60.0
48
+
49
+ module ClassMethods
50
+ # creates utc time from days and minutes
51
+ def from_fos_date_time(days, minutes)
52
+ from_fos_time(days*1440 + minutes)
53
+ end
54
+
55
+ # creates utc time from minutes
56
+ def from_fos_time(minutes)
57
+ DateTime.new(1899, 12, 31).advance(:minutes=>minutes)
58
+ end
45
59
  end
60
+ end
61
+
62
+ class Time
63
+ include TimeFunctions
64
+ DATE_FORMATS[:hm] = "%H:%M"
65
+
66
+ alias :original_to_s :to_s
46
67
 
47
- def in_tenths_rounded_XOJET_style
48
- return 0 if hour + min == 0
49
- # It was determined that "ODD" increments of .05 (ie .15, .35, .55, .75, .95) of an hour (ie. 9,21,33,45,57 minutes) rounded UP whereas even increments of .05 rounded DOWN - sn
50
- minutes = hour*60 + min
51
- (minutes/60.0 + ([9, 21, 33, 45, 57].include?( min ) ? 0.01 : -0.01)).round(1)
68
+ def to_s(args=nil)
69
+ args = :hm unless args
70
+ self.original_to_s(args)
52
71
  end
53
-
72
+ end
73
+
74
+ class DateTime
75
+ include TimeFunctions
54
76
  end
@@ -5,27 +5,16 @@ class Sequel::Model
5
5
  self.use_transactions=false
6
6
  plugin :validation_helpers
7
7
 
8
- def fill_hash(arr)
9
- arr.inject({}) do |hash,column|
10
- hash[column]= self.send(column) if self.respond_to?(column)
11
- hash
8
+ # passing in an array of attribute names, fills a hash with values from the model.
9
+ def fill_hash(attributes)
10
+ attributes.inject({}) do |hash,attribute|
11
+ hash[attribute]= values[attribute] if values.has_key?(attribute)
12
+ hash
12
13
  end
13
14
  end
14
15
 
15
16
  class << self
16
17
 
17
- def pk_for_select(options={})
18
- table = options[:table] || table_name
19
- use_alias = options[:alias]
20
- primary_key.collect do |k|
21
- if use_alias
22
- k.qualify(table).as("#{table}_#{k}")
23
- else
24
- k.qualify(table)
25
- end
26
- end
27
- end
28
-
29
18
  attr_accessor :datatypes, :aliases
30
19
 
31
20
  def clear_schema
@@ -50,61 +39,13 @@ class Sequel::Model
50
39
  key = primary_key
51
40
  graph_conditions = { :"#{prefix} kid - date" => :'kid - date', :"#{prefix} kid - time" => :'kid - time', :"#{prefix} kid - user" => :'kid - user', :"#{prefix} kid - mult" => :'kid - mult', :"#{prefix} kid - comm" => :'kid - comm' }
52
41
  dataset_filter = proc { class_name.to_s.constantize.filter( :"#{prefix} kid - date"=>self[:'kid - date'], :"#{prefix} kid - time"=>self[:'kid - time'], :"#{prefix} kid - user"=>self[:'kid - user'], :"#{prefix} kid - mult"=>self[:'kid - mult'], :"#{prefix} kid - comm"=>self[:'kid - comm']) }
53
- eager_load_proc =
54
- proc do |key_hash, parents, associations|
55
- id_map = {}
56
- filter_args = Hash.new{|k,v| k[v]=[]}
57
- parents.each do |p|
58
- key_arr = []
59
- primary_key.each do |k|
60
- key_arr << p[k]
61
- filter_args[k] << p[k]
62
- end
63
- id_map[key_arr] = p
64
- end
65
- parent_keys = graph_conditions.keys
66
- filter_expr = Sequel::SQL::BooleanExpression.new(
67
- :OR,
68
- *id_map.keys.map{|k| [ [graph_conditions.keys[0], k[0]], [graph_conditions.keys[1], k[1]], [graph_conditions.keys[2], k[2]], [graph_conditions.keys[3], k[3]], [graph_conditions.keys[4], k[4]] ].sql_expr}
69
- )
70
- class_name.to_s.constantize.filter(filter_expr).all do |h|
71
- parent_key_values = parent_keys.collect{|k| h[k]}
72
- if d = id_map[parent_key_values]
73
- d.associations[assoc_name] = [] unless d.associations[assoc_name]
74
- d.associations[assoc_name] << h
75
- end
76
- end
77
- end
78
-
79
42
  when :many_to_one
80
43
  key = nil
81
44
  graph_conditions = { :'kid - date'=>:"#{prefix} kid - date", :'kid - time'=>:"#{prefix} kid - time", :'kid - user'=>:"#{prefix} kid - user", :'kid - mult'=>:"#{prefix} kid - mult", :'kid - comm'=>:"#{prefix} kid - comm" }
82
45
  dataset_filter = proc { class_name.to_s.constantize.filter( :"kid - date"=>self[:"#{prefix} kid - date"], :"kid - time"=>self[:"#{prefix} kid - time"], :"kid - user"=>self[:"#{prefix} kid - user"], :"kid - mult"=>self[:"#{prefix} kid - mult"], :"kid - comm"=>self[:"#{prefix} kid - comm"]) }
83
- eager_load_proc =
84
- proc do |key_hash, parents, associations|
85
- id_map = {}
86
- filter_args = Hash.new{|k,v| k[v]=[]}
87
- parents.each do |p|
88
- key_arr = []
89
- primary_key.each do |k|
90
- key_arr << p[k]
91
- filter_args[k] << p[k]
92
- end
93
- id_map[key_arr] = p
94
- end
95
- parent_to_child_keys = graph_conditions.keys
96
- filter_expr = Sequel::SQL::BooleanExpression.new(
97
- :OR,
98
- *id_map.keys.map{|k| [ [parent_to_child_keys[0], k[0]], [parent_to_child_keys[1], k[1]], [parent_to_child_keys[2], k[2]], [parent_to_child_keys[3], k[3]], [parent_to_child_keys[4], k[4]] ].sql_expr}
99
- )
100
- class_name.to_s.constantize.filter(filter_expr).all do |h|
101
- parent_key_values = parent_to_child_keys.collect{|k| h[k]}
102
- id_map[parent_key_values].associations[assoc_name] = h
103
- end
104
- end
105
46
  end
106
47
  graph_conditions.merge!(options[:graph_only_conditions]) if options[:graph_only_conditions]
107
- send(assoc_type, assoc_name, :key=> key, :class => class_name, :dataset=> dataset_filter, :graph_only_conditions=>graph_conditions, :eager_loader => eager_load_proc )
48
+ send(assoc_type, assoc_name, :key=> key, :class => class_name, :dataset=> dataset_filter, :graph_only_conditions=>graph_conditions)
108
49
  end
109
50
 
110
51
  # for creating an association to the 'Codes' table
@@ -129,14 +70,12 @@ class Sequel::Model
129
70
  delegate :description, :to=> assoc_name, :prefix=>true, :allow_nil => true
130
71
  end
131
72
 
73
+ # date_column,time_column should be a Fixnum because fos stores dates,times as numbers
132
74
  def column_def_datetime(datetime_column_name, date_column, time_column)
133
75
  inst_def datetime_column_name do
134
- date = send(:[], date_column)
135
- time = send(:[], time_column)
136
- date = Date.from_fos_days(date) if date.is_a? Fixnum
137
- loc_time = date.to_time
138
- time_utc = Time.gm(loc_time.year, loc_time.month, loc_time.day)
139
- time_utc + time.minutes
76
+ days = send(:[], date_column) || 0 # nil defaults to 0 days
77
+ minutes = send(:[], time_column) || 0 # nil defaults to 0 minutes
78
+ Time.from_fos_date_time(days, minutes) # returns utc time
140
79
  end
141
80
  end
142
81
 
@@ -2,12 +2,22 @@ require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  describe "fos_dates" do
4
4
 
5
+ it "Time and DateTime have proper class methods included from TimeFunctions" do
6
+ Time.should respond_to(:from_fos_time)
7
+ DateTime.should respond_to(:from_fos_time)
8
+ end
9
+
10
+ it "Time and DateTime have proper class methods included from TimeFunctions" do
11
+ Time.new.should respond_to(:as_minutes)
12
+ DateTime.new.should respond_to(:as_minutes)
13
+ end
14
+
5
15
  it "converts fos date number to a Ruby Date" do
6
16
  Date.from_fos_days(10).should == Date.new(1900,1,10)
7
17
  end
8
18
 
9
19
  it "converts fos time number to a Ruby Time" do
10
- Time.from_fos_time(100).should == Time.utc(2000,"jan",1,1,40,0)
20
+ Time.from_fos_time(100).should == DateTime.new(1899,12,31,1,40,0)
11
21
  end
12
22
 
13
23
  it "converts a Ruby Time to hundredths" do
@@ -21,5 +31,4 @@ describe "fos_dates" do
21
31
  it "Time view defaults to M:H" do
22
32
  Time.parse('Sept 9, 2009 07:10').to_s.should == "07:10"
23
33
  end
24
-
25
34
  end
@@ -1,8 +1,8 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require File.dirname(__FILE__) + '/spec_helper_tables' unless metaclass.class_variable_defined? :@@set_up_demo_tables
3
-
3
+
4
4
  describe "Sequel::Model extentions" do
5
-
5
+
6
6
  it "has fill_hash method" do
7
7
  Dude.first.should respond_to(:fill_hash)
8
8
  Dude.first.fill_hash([:'kid - date']).should == {:'kid - date'=>1}
@@ -100,9 +100,9 @@ describe "Sequel::Model extentions" do
100
100
  @record.my_special_name_view.should == "01:00"
101
101
  end
102
102
 
103
- it "shows correct currency view" do
104
- @record.price_currency.should == "12.15"
105
- @record.price_precision.should == "12.15"
103
+ it "shows correct currency view" do
104
+ @record.price_currency.should == 12.15
105
+ @record.price_precision.should == 12.15
106
106
  end
107
107
 
108
108
  it "shows correct currency view" do
@@ -206,14 +206,22 @@ describe "Sequel::Model extentions" do
206
206
  describe "column_def" do
207
207
 
208
208
  before do
209
- add_test_table_data({:date_col => 39992, :time_col=>60})
210
- end
211
-
212
- it "datetime" do
213
209
  TestTable.column_def_datetime :datetime_col, :date_col, :time_col
210
+ end
214
211
 
212
+ it "datetime makes method to represent datetime" do
213
+ add_test_table_data({:date_col => 39992, :time_col => 60})
215
214
  TestTable.first.should respond_to(:datetime_col)
216
- TestTable.first.datetime_col.should == Time.parse("2009-06-29 01:00 UTC")
215
+ end
216
+
217
+ it "datetime can parse valid dates" do
218
+ add_test_table_data({:date_col => 39992, :time_col => 60})
219
+ TestTable.first.datetime_col.should == DateTime.new(2009,6,29,1,0,0)
220
+ end
221
+
222
+ it "datetime can handle nil date or time" do
223
+ add_test_table_data({:date_col => nil, :time_col => nil})
224
+ TestTable.first.datetime_col.should == DateTime.new(1899,12,31,0,0,0)
217
225
  end
218
226
 
219
227
  end
@@ -1,12 +1,8 @@
1
- RAILS_ENV = "test"
2
-
3
- require 'rubygems'
4
-
5
1
  require 'lib/fossil'
6
2
  require 'spec'
7
3
  require 'rr'
8
4
 
9
- unless defined?(DB_DEMO) #and defined?(DB_FOS)
5
+ unless defined?(DB_DEMO)
10
6
  DB_DEMO = Sequel.odbc('demodata')#, :loggers=>[Logger.new($stdout)])
11
7
  DB_DEMO.extend(Sequel::Pervasive::DatabaseMethods)
12
8
 
@@ -19,16 +15,17 @@ require File.dirname(__FILE__) + "/helper_classes"
19
15
  ##### custom matchers #####
20
16
  require File.dirname(__FILE__) + "/be_model_with_values_matcher"
21
17
 
22
-
23
18
  Spec::Runner.configure do |config|
24
19
  config.include(HelperMethods)
25
20
  config.mock_with :rr
26
21
  config.include(BeModelWithValuesMatcher)
27
22
  end
28
23
 
29
- ################ these are special modifictations for testing with mysql db on non win platform ###################
24
+ # These are special modifictations for testing with mysql db instead of pervasive
25
+ # if its not windows or linux where pervasive db is running ) .. modify the
26
+ # pervasive adapter to act more like mysql, so that the tests can still run.
27
+ # This is not ideal, but it works
30
28
  unless RUBY_PLATFORM =~ /mswin32|linux/
31
- # if its not windows ( pervasive db ) .. modify the pervasive adapter to act more like mysql for certain things
32
29
 
33
30
  module Sequel::Pervasive::DatabaseMethods
34
31
  def auto_increment_sql; "AUTO_INCREMENT" end
@@ -52,4 +49,4 @@ unless RUBY_PLATFORM =~ /mswin32|linux/
52
49
  end
53
50
 
54
51
  end
55
- ################ end of special section ###################
52
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fossil
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick Lardin, Daniel Sudol
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-15 00:00:00 -08:00
12
+ date: 2010-01-24 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency