fossil 0.4.26 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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