fossil 0.4.26 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -10,7 +10,7 @@
10
10
  gemspec.email = "plardin@xojet.com"
11
11
  gemspec.homepage = ""
12
12
  gemspec.add_dependency('sequel', '= 3.13.0')
13
- gemspec.add_dependency('activesupport', '= 2.3.5')
13
+ # gemspec.add_dependency('activesupport', '= 2.3.5')
14
14
  gemspec.add_development_dependency('rspec')
15
15
  gemspec.authors = ["Patrick Lardin, Daniel Sudol"]
16
16
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.26
1
+ 0.5.0
@@ -1,21 +1,23 @@
1
1
  # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{fossil}
8
- s.version = "0.4.26"
8
+ s.version = "0.5.0"
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-09-27}
12
+ s.date = %q{2010-10-04}
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 = [
16
16
  "Rakefile",
17
17
  "VERSION",
18
18
  "fossil.gemspec",
19
+ "lib/date_extentions.rb",
20
+ "lib/delegate_method.rb",
19
21
  "lib/fos_schema/FOS_SCHEMA_3.8.22.r3.csv",
20
22
  "lib/fos_schema/FOS_SCHEMA_3.8.27.r1.csv",
21
23
  "lib/fos_schema/FOS_SCHEMA_3.9.0.csv",
@@ -146,13 +148,12 @@ Gem::Specification.new do |s|
146
148
  "spec/sequel/serializer/json_serializer_spec.rb",
147
149
  "spec/sequel/serializer/xml_serializer_spec.rb",
148
150
  "spec/sequel/spec_helper_tables.rb",
149
- "spec/spec.opts",
150
151
  "spec/spec_helper.rb"
151
152
  ]
152
153
  s.homepage = %q{}
153
154
  s.rdoc_options = ["--charset=UTF-8"]
154
155
  s.require_paths = ["lib"]
155
- s.rubygems_version = %q{1.3.6}
156
+ s.rubygems_version = %q{1.3.7}
156
157
  s.summary = %q{Sequel orm wrapper to FOS}
157
158
  s.test_files = [
158
159
  "spec/hash_extentions_spec.rb",
@@ -180,19 +181,15 @@ Gem::Specification.new do |s|
180
181
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
181
182
  s.specification_version = 3
182
183
 
183
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
184
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
184
185
  s.add_runtime_dependency(%q<sequel>, ["= 3.13.0"])
185
- s.add_runtime_dependency(%q<activesupport>, ["= 2.3.5"])
186
186
  s.add_development_dependency(%q<rspec>, [">= 0"])
187
187
  else
188
188
  s.add_dependency(%q<sequel>, ["= 3.13.0"])
189
- s.add_dependency(%q<activesupport>, ["= 2.3.5"])
190
189
  s.add_dependency(%q<rspec>, [">= 0"])
191
190
  end
192
191
  else
193
192
  s.add_dependency(%q<sequel>, ["= 3.13.0"])
194
- s.add_dependency(%q<activesupport>, ["= 2.3.5"])
195
193
  s.add_dependency(%q<rspec>, [">= 0"])
196
194
  end
197
195
  end
198
-
@@ -0,0 +1,26 @@
1
+ p require 'date'
2
+
3
+ class DateTime
4
+ # Converts self to a Ruby Date object; time portion is discarded
5
+ def to_date
6
+ ::Date.new(year, month, day)
7
+ end unless method_defined?(:to_date)
8
+ end
9
+
10
+
11
+ class Numeric
12
+ def minutes
13
+ self * 60
14
+ end
15
+ alias :minute :minutes
16
+
17
+ def hours
18
+ self * 3600
19
+ end
20
+ alias :hour :hours
21
+
22
+ def days
23
+ self * 24.hours
24
+ end
25
+ alias :day :days
26
+ end
@@ -0,0 +1,84 @@
1
+ class Module
2
+ # Patching delegate to take default value as option, which means that instead of
3
+ # returning nil in any situation it will return the default value. So if the
4
+ # object you delegate to does not exist or the method on that object does not exist
5
+ # or the method returns nil then the default value is returned.
6
+ # Note that if you use a default value then the allow nil is automatically set to false,
7
+ # since you will always return the default if there is nil value
8
+ #
9
+ # class Invoice < Struct.new(:client)
10
+ # delegate :name, :to => :client, :default => 'Dano'
11
+ # end
12
+ #
13
+ # Example 1:
14
+ # invoice = Invoice.new(nil) # no client
15
+ # invoice.client_name # => "Dano"
16
+ #
17
+ # Example 2:
18
+ # Client = Struct.new(:address) # client does not have attribute called name
19
+ # john_doe = Client.new("1 park avenue")
20
+ # invoice = Invoice.new(john_doe)
21
+ # invoice.client_name # => "Dano"
22
+ #
23
+ # Example 3:
24
+ # Client = Struct.new(:name, :address)
25
+ # john_doe = Client.new(nil, "1 park avenue") # client name is nil
26
+ # invoice = Invoice.new(john_doe)
27
+ # invoice.client_name # => "Dano"
28
+ #
29
+ #
30
+ def delegate(*methods)
31
+ options = methods.pop
32
+
33
+ unless options.is_a?(Hash) && to = options[:to]
34
+ raise ArgumentError, "Delegation needs a target. Supply an options hash with a :to key as the last argument (e.g. delegate :hello, :to => :greeter)."
35
+ end
36
+
37
+ if options[:prefix] == true && options[:to].to_s =~ /^[^a-z_]/
38
+ raise ArgumentError, "Can only automatically set the delegation prefix when delegating to a method."
39
+ end
40
+
41
+ prefix = options[:prefix] && "#{options[:prefix] == true ? to : options[:prefix]}_"
42
+
43
+ default = options[:default]
44
+
45
+ allow_nil = (options[:allow_nil] || default) && "#{to} && "
46
+
47
+ methods.each do |method|
48
+
49
+ writer(method, to, prefix) if options[:writer]
50
+
51
+ module_eval(<<-EOS, "(__DELEGATION__)", 1)
52
+ def #{prefix}#{method}(*args, &block) # def customer_name(*args, &block)
53
+ val = #{allow_nil}#{to}.__send__(#{method.inspect}, *args, &block) # val = client && client.__send__(:name, *args, &block)
54
+ return "#{default}" if val.nil? and #{!default.blank?} # return default if val.nil? and !default.blank?
55
+ val # val
56
+ end # end
57
+ EOS
58
+ end
59
+ end
60
+
61
+ #####################################################################
62
+ # writer :tail_number, :aircraft
63
+ #
64
+ # creates a method like this:
65
+ #
66
+ # def tail_number=(tail_number)
67
+ # self.aircraft = Aircraft.find_by_tail_number(tail_number)
68
+ # end
69
+ #
70
+ # in this case the setter_attribute is the same as the attribute name
71
+ # but in a case like this:
72
+ #
73
+ # setter :pic_xojet_id, :pilot, :pic_pilot
74
+ #
75
+ # you are saying set the attribue pic_pilot to a pilot
76
+ #
77
+ def writer(setter_attribute, model, prefix)
78
+ define_method "#{prefix}#{setter_attribute.to_s}=" do |value|
79
+ found_model = model.to_s.capitalize.constantize.find(:first, :conditions=> {setter_attribute => value})
80
+ self.send("#{model.to_s}=", found_model)
81
+ end
82
+ end
83
+
84
+ end
@@ -7,21 +7,24 @@ rescue LoadError => e
7
7
  raise("To use Fossil you need the sequel gem:\n '$ sudo gem install sequel -v=3.13.0'")
8
8
  end
9
9
 
10
- begin
11
- gem 'activesupport', '=2.3.5'
12
- require('active_support')
13
- rescue LoadError => e
14
- p e.message
15
- raise "To use Fossil you need the active_support gem: '$ sudo gem install active_support -v=2.3.5'"
16
- end
10
+ #begin
11
+ # gem 'activesupport', '=2.3.5'
12
+ # require('active_support')
13
+ #rescue LoadError => e
14
+ # p e.message
15
+ # raise "To use Fossil you need the active_support gem: '$ sudo gem install active_support -v=2.3.5'"
16
+ #end
17
17
 
18
18
  dir = File.dirname(__FILE__)
19
19
  files = [File.join(dir,'number_helper.rb')] +
20
20
  [File.join(dir,'hash_extentions.rb')] +
21
+ [File.join(dir,'date_extentions.rb')] +
22
+ [File.join(dir,'delegate_method.rb')] +
21
23
  [File.join(dir,'sequel','serializer','serializer.rb')] +
22
24
  Dir.glob(File.join(dir,'sequel','*.rb')) +
23
25
  Dir.glob(File.join(dir,'models','*.rb'))
24
26
 
27
+ Sequel.extension(:blank, :inflector)
25
28
 
26
29
  class MockDataset < Sequel::Dataset
27
30
  def insert(*args); end
@@ -1,4 +1,28 @@
1
- class Hash
1
+ require 'json'
2
+ class Hash
3
+ XML_TYPE_NAMES =
4
+ {
5
+ "Symbol" => "symbol",
6
+ "Fixnum" => "integer",
7
+ "Bignum" => "integer",
8
+ "BigDecimal" => "decimal",
9
+ "Float" => "float",
10
+ "TrueClass" => "boolean",
11
+ "FalseClass" => "boolean",
12
+ "Date" => "date",
13
+ "DateTime" => "datetime",
14
+ "Time" => "datetime",
15
+ "ActiveSupport::TimeWithZone" => "datetime"
16
+ }
17
+
18
+ XML_FORMATTING =
19
+ {
20
+ "symbol" => Proc.new { |symbol| symbol.to_s },
21
+ "date" => Proc.new { |date| date.strftime('%d/%m/%Y') },
22
+ "datetime" => Proc.new { |time| time.xmlschema },
23
+ "yaml" => Proc.new { |yaml| yaml.to_yaml }
24
+ }
25
+
2
26
  def limit_to_keys(limit_keys)
3
27
  dup.limit_to_keys!(limit_keys)
4
28
  end
@@ -17,4 +41,32 @@ class Hash
17
41
  def deep_clone
18
42
  Marshal::load(Marshal.dump(self))
19
43
  end
44
+
45
+ # Return a new hash with all keys converted to strings.
46
+ def stringify_keys
47
+ dup.stringify_keys!
48
+ end
49
+
50
+ # Destructively convert all keys to strings.
51
+ def stringify_keys!
52
+ keys.each do |key|
53
+ self[key.to_s] = delete(key)
54
+ end
55
+ self
56
+ end
57
+
58
+ # Return a new hash with all keys converted to symbols, as long as
59
+ # they respond to +to_sym+.
60
+ def symbolize_keys
61
+ dup.symbolize_keys!
62
+ end
63
+
64
+ # Destructively convert all keys to symbols, as long as they respond
65
+ # to +to_sym+.
66
+ def symbolize_keys!
67
+ keys.each do |key|
68
+ self[(key.to_sym rescue key) || key] = delete(key)
69
+ end
70
+ self
71
+ end
20
72
  end
@@ -663,9 +663,9 @@ class TripLeg < Sequel::Model(:'trip legs')
663
663
  column_def_datetime :actual_departure_date_time_gmt, :'dept date act gmt', :'dept time act gmt'
664
664
 
665
665
  def actual_takeoff_date_time_gmt
666
- date = actual_departure_date_gmt
667
- date += 1.day if t_o_time_act_gmt < dept_time_act_gmt
668
- date.to_datetime.advance(:minutes=>t_o_time_act_gmt)
666
+ time = t_o_time_act_gmt
667
+ time += 60*24 if t_o_time_act_gmt < dept_time_act_gmt
668
+ DateTime.from_fos_date_time(dept_date_act_gmt, time)
669
669
  end
670
670
 
671
671
  column_view :arrival_date_gmt, :date, :actual_arrival_date_gmt
@@ -673,9 +673,9 @@ class TripLeg < Sequel::Model(:'trip legs')
673
673
  column_def_datetime :actual_arrival_date_time_gmt, :'arrival date gmt', :'arriv time act gmt'
674
674
 
675
675
  def actual_land_date_time_gmt
676
- date = actual_arrival_date_gmt
677
- date -= 1.day if land_time_act_gmt > arriv_time_act_gmt
678
- date.to_datetime.advance(:minutes=>land_time_act_gmt)
676
+ time = land_time_act_gmt
677
+ time -= 60*24 if land_time_act_gmt > arriv_time_act_gmt
678
+ DateTime.from_fos_date_time(arrival_date_gmt, time)
679
679
  end
680
680
 
681
681
  column_view :dept_date_act_local, :date, :actual_departure_date_local
@@ -705,12 +705,16 @@ class TripLeg < Sequel::Model(:'trip legs')
705
705
  column_view :dept_date_act_home, :date, :actual_departure_date_base
706
706
  column_view :depart_time_act_home, :time, :actual_departure_time_base
707
707
  column_def_datetime :actual_departure_date_time_base_old, :'dept date act home', :'depart time act home'
708
- def actual_departure_date_time_base() actual_departure_date_time_gmt + (home_tz_gmt_offset/10).hours; end
708
+ def actual_departure_date_time_base
709
+ (actual_departure_date_time_gmt.to_time + (home_tz_gmt_offset/10).hours).to_datetime
710
+ end
709
711
 
710
712
  column_view :arr_date_act_home, :date, :actual_arrival_date_base
711
713
  column_view :arrival_time_act_hom, :time, :actual_arrival_time_base
712
714
  column_def_datetime :actual_arrival_date_time_base_old, :'arr date act home', :'arrival time act hom'
713
- def actual_arrival_date_time_base() actual_arrival_date_time_gmt + (home_tz_gmt_offset/10).hours; end
715
+ def actual_arrival_date_time_base
716
+ (actual_arrival_date_time_gmt.to_time + (home_tz_gmt_offset/10).hours).to_datetime
717
+ end
714
718
 
715
719
  column_view :ete, :time
716
720
  column_view :eft, :time
@@ -1,6 +1,5 @@
1
1
  class Date
2
2
  FOS_JD_OFFSET_DAYS = Date.parse('1899-12-31').jd
3
- DATE_FORMATS[:mdy] = "%m/%d/%Y"
4
3
 
5
4
  def self.from_fos_days(days)
6
5
  self.jd(FOS_JD_OFFSET_DAYS + days)
@@ -9,10 +8,26 @@ class Date
9
8
  def to_fos_days
10
9
  jd - FOS_JD_OFFSET_DAYS
11
10
  end
11
+
12
+ ######## from Ruby Cookbook #########
13
+ def to_gm_time
14
+ to_time(new_offset, :gm)
15
+ end
16
+
17
+ def to_local_time
18
+ to_time(new_offset(DateTime.now.offset-offset), :local)
19
+ end
20
+
21
+ private
22
+ def to_time(dest, method)
23
+ #Convert a fraction of a day to a number of microseconds
24
+ usec = (dest.send(:sec_fraction) * 60 * 60 * 24 * (10**6)).to_i
25
+ Time.send(method, dest.year, dest.month, dest.day, dest.send(:hour), dest.send(:min),
26
+ dest.send(:sec), usec)
27
+ end
12
28
  end
13
29
 
14
30
  module TimeFunctions
15
-
16
31
  def as_minutes
17
32
  hour*60 + min
18
33
  end
@@ -21,7 +36,7 @@ module TimeFunctions
21
36
  return 0 if hour + min == 0
22
37
  minutes = hour*60 + min
23
38
  val = "#{minutes/60}.#{((100*(minutes.modulo(60)))/60).to_s.rjust(2, '0')}"
24
- BigDecimal.new(val, 2).round(2).to_s
39
+ BigDecimal.new(val, 2).round(2).to_f
25
40
  end
26
41
 
27
42
  # xos is rounding XOJET STYLE, which is a funky copy of how ipc did it
@@ -29,7 +44,7 @@ module TimeFunctions
29
44
  return 0 if hour + min == 0
30
45
  # 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
31
46
  minutes = as_minutes
32
- (minutes/60.0 + ([9, 21, 33, 45, 57].include?( min ) ? 0.001 : -0.001)).round(2)
47
+ (minutes/60.0 + ([9, 21, 33, 45, 57].include?(min) ? 0.001 : -0.001)).round(2)
33
48
  end
34
49
 
35
50
  # xos is rounding XOJET STYLE, which is a funky copy of how ipc did it
@@ -37,11 +52,11 @@ module TimeFunctions
37
52
  return 0 if hour + min == 0
38
53
  # 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
39
54
  minutes = as_minutes
40
- (minutes/60.0 + ([9, 21, 33, 45, 57].include?( min ) ? 0.01 : -0.01)).round(1)
55
+ (minutes/60.0 + ([9, 21, 33, 45, 57].include?(min) ? 0.01 : -0.01)).round(1)
41
56
  end
42
57
 
43
58
  def hm
44
- to_s(:hm)
59
+ strftime("%H:%M")
45
60
  end
46
61
 
47
62
  def to_fos_days
@@ -52,12 +67,10 @@ end
52
67
  class Time
53
68
  include TimeFunctions
54
69
 
55
- DATE_FORMATS[:hm] = "%H:%M"
56
-
57
70
  alias :original_to_s :to_s
58
71
 
59
72
  def to_s(args=nil)
60
- args = :hm unless args
73
+ return self.strftime('%H:%M') if args == :hm or !args
61
74
  self.original_to_s(args)
62
75
  end
63
76
 
@@ -68,7 +81,25 @@ class Time
68
81
  end
69
82
 
70
83
  class << self
71
- alias from_minutes from_fos_time
84
+ alias from_minutes from_fos_time
85
+ end
86
+
87
+ ######## from Ruby Cookbook #########
88
+ def to_datetime
89
+ # Convert seconds + microseconds into a fractional number of seconds
90
+ seconds = sec + Rational(usec, 10**6)
91
+
92
+ # Convert a UTC offset measured in minutes to one measured in a
93
+ # fraction of a day.
94
+ offset = Rational(utc_offset, 60 * 60 * 24)
95
+ DateTime.new(year, month, day, hour, min, seconds, offset)
96
+ end
97
+
98
+ # This is a view "February 01, 2010 01:40" that be parsed directly by javascript
99
+ # ie. in javascript you can say: Date.parse( "this to long view" ) and you
100
+ # will get a date object
101
+ def long_view
102
+ self.strftime('%B %d, %Y %H:%M')
72
103
  end
73
104
  end
74
105
 
@@ -79,16 +110,17 @@ class DateTime
79
110
  def self.from_fos_date_time(days, minutes)
80
111
  days = 0 unless days
81
112
  minutes = 0 unless minutes
82
- Date.from_fos_days(days).to_datetime.advance(:minutes=>minutes)
113
+ (Date.from_fos_days(days).to_gm_time + minutes.minutes).to_datetime
83
114
  end
84
115
 
85
116
  def view
86
117
  to_s
87
118
  end
88
119
 
89
- # This is a view that be parsed directly by javascript ie. in javascript
90
- # you can say: Date.parse( "this to long view" ) and you will get a date object
120
+ # This is a view "February 01, 2010 01:40" that be parsed directly by javascript
121
+ # ie. in javascript you can say: Date.parse( "this to long view" ) and you
122
+ # will get a date object
91
123
  def long_view
92
- to_s(:long)
124
+ self.strftime('%B %d, %Y %H:%M')
93
125
  end
94
126
  end