rstore 0.3.2 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,8 @@
1
+ ## Version 0.3.4 (February 14, 2012)
2
+
3
+ ### Other
4
+ * Update dependencies in gemspec.
5
+
1
6
  ## Version 0.3.2 (December 12, 2011)
2
7
 
3
8
  ### Bugfixes
data/Rakefile CHANGED
@@ -1,6 +1,7 @@
1
1
  # require 'spec/rake/spectask' # depreciated
2
2
  require 'rspec/core/rake_task'
3
- require 'rake/gempackagetask'
3
+ # require 'rake/gempackagetask' # depreciated
4
+ require 'rubygems/package_task'
4
5
  require 'rdoc/task'
5
6
 
6
7
  # Build gem: rake gem
@@ -27,7 +28,7 @@ end
27
28
 
28
29
  gem_spec = eval(File.read('rstore.gemspec'))
29
30
 
30
- Rake::GemPackageTask.new( gem_spec ) do |t|
31
+ Gem::PackageTask.new( gem_spec ) do |t|
31
32
  t.need_zip = true
32
33
  end
33
34
 
@@ -36,5 +37,5 @@ end
36
37
  #end
37
38
 
38
39
  task :push => :gem do |t|
39
- sh "gem push pkg/#{gem_spec.name}-#{gem_spec.version}.gem"
40
+ sh "gem push -v pkg/#{gem_spec.name}-#{gem_spec.version}.gem"
40
41
  end
@@ -7,7 +7,7 @@ module RStore
7
7
 
8
8
  class << self
9
9
  # A Hash holding subclasses of {RStore::BaseDB}
10
- # @return [Hash{Symbol=>BaseDB}] All subclasses of {RStore::BaseDB} defined in the current namespace.
10
+ # @return [Hash{Symbol=>BaseDB}] All subclasses of {RStore::BaseDB} defined in the current namespace.
11
11
  # Subclasses are added automatically via _self.inherited_.
12
12
  # @example
13
13
  # class CompanyDB < RStore::BaseDB
@@ -30,17 +30,17 @@ module RStore
30
30
  BaseDB.db_classes[subclass.name] = subclass
31
31
  end
32
32
 
33
-
33
+
34
34
  # Define the database connection.
35
35
  # @note To be called when defining a _subclass_ of {RStore::BaseDB}
36
36
  # Accepts the same _one_ _arity_ parameters as [Sequel.connect](http://sequel.rubyforge.org/rdoc/files/doc/opening_databases_rdoc.html)
37
37
  # @overload info(options)
38
38
  # @param [String, Hash] connection_info Either a connection string such as _postgres://user:password@localhost/blog_, or a `Hash` with the following options:
39
- # @option options [String] :adapter The SQL database used, such as _mysql_ or _postgres_
39
+ # @option options [String] :adapter The SQL database used, such as _mysql_ or _postgres_
40
40
  # @option options [String] :host Example: 'localhost'
41
- # @option options [String] :user
42
- # @option options [String] :password
43
- # @option options [String] :database The database name. You don't need to provide this option, as its value will be inferred from the class name.
41
+ # @option options [String] :user
42
+ # @option options [String] :password
43
+ # @option options [String] :database The database name. You don't need to provide this option, as its value will be inferred from the class name.
44
44
  # @return [void]
45
45
  # @example
46
46
  # # Using a connection string
@@ -50,29 +50,33 @@ module RStore
50
50
  #
51
51
  # # Using an options hash
52
52
  # class CompanyDB < RStore::BaseDB
53
- # info(adapter: 'mysql',
54
- # host: 'localhost',
55
- # user: 'root',
53
+ # info(adapter: 'mysql',
54
+ # host: 'localhost',
55
+ # user: 'root',
56
56
  # password: 'xxx')
57
57
  # end
58
58
  def self.info hash_or_string
59
- class << self # self = #<Class:CompanyDB>
59
+ # self = CompanyDB
60
+
61
+ class << self
62
+ # self = #<Class:CompanyDB>
60
63
  attr_reader :connection_info
61
64
  end
62
- # self = CompanyDB
65
+
66
+ # Instance variables always belong to self.
63
67
  @connection_info = hash_or_string.is_a?(Hash) ? hash_or_string.merge(:database => self.name.to_s): hash_or_string
64
68
  end
65
69
 
66
70
 
67
- # Uses the connection info from {.info} to connect to the database.
71
+ # Uses the connection info from {.info} to connect to the database.
68
72
  # @note To be called when defining a _subclass_ of {RStore::BaseDB}
69
73
  # @yieldparam [Sequel::Database] db The opened Sequel {http://sequel.rubyforge.org/rdoc/classes/Sequel/Database.html Database} object, which is closed when the block exits.
70
74
  # @return [void]
71
75
  # @example
72
76
  # class CompanyDB < RStore::BaseDB
73
- # info(adapter: 'mysql',
74
- # host: 'localhost',
75
- # user: 'root',
77
+ # info(adapter: 'mysql',
78
+ # host: 'localhost',
79
+ # user: 'root',
76
80
  # password: 'xxx')
77
81
  # end
78
82
  #
@@ -110,10 +114,10 @@ module RStore
110
114
  #
111
115
  # CompanyDB.name
112
116
  # #=> :company
113
- def self.name
117
+ def self.name
114
118
  super.gsub!(/DB/,'').downcase.to_sym
115
119
  end
116
120
 
117
121
  end
118
122
  end
119
-
123
+
@@ -36,6 +36,9 @@ module RStore
36
36
 
37
37
  @path = path
38
38
  self.options = new_options
39
+ # options= deletes all valid options already processed from new_options,
40
+ # leaving only options that are not valid.
41
+ # Therefore, new_options.size > 0 indicates that options not recognized where passed.
39
42
  raise ArgumentError, arg_error_message(@path, new_options) if new_options.size > 0
40
43
 
41
44
  @file_options = extract_with(Configuration.default_file_options)
@@ -34,9 +34,10 @@ module RStore
34
34
  # where the error occured.
35
35
  Converters = Hash.new {|h,k| h[k] = lambda { |field| field }}.
36
36
  merge!({string: lambda { |field| field },
37
- date: lambda { |field| Date.parse(field).to_s },
37
+ date: lambda { |field| Date.parse(field).strftime("%Y-%m-%d") },
38
38
  datetime: lambda { |field| DateTime.parse(field).to_s },
39
39
  # Convert to DateTime, because DateTime also checks if the argument is valid
40
+ # Sequel handles Time as DateTime
40
41
  time: lambda { |field| DateTime.parse(field).to_s },
41
42
  integer: lambda { |field| Integer(field) },
42
43
  float: lambda { |field| Float(field) },
@@ -20,14 +20,14 @@ module RStore
20
20
 
21
21
  def initialize path, content, state, options
22
22
  error_message = "#{path}: The following options are not valid as an argument to #{self.class}:\n#{options}"
23
- raise ArgumentError, error_message unless options.is_a?(Hash)
23
+ raise ArgumentError, error_message unless options.is_a?(Hash)
24
24
  @path = path
25
25
  @content = content
26
26
  self.state = state
27
27
  @options = options
28
28
  end
29
29
 
30
-
30
+
31
31
  #def extract_type path
32
32
  # path, filename = File.split(path)
33
33
  # filename.match(/\.(?<type>.*)$/)[:type].to_sym
@@ -41,9 +41,9 @@ module RStore
41
41
 
42
42
  begin
43
43
  csv = CSVWrapper.parse(@content, parse_options)
44
- csv = csv.drop(1) if file_options[:has_headers] == true # drop the first row if it is a header
44
+ csv = csv.drop(1) if file_options[:has_headers] == true # drop the first row if it is a header
45
45
  rescue => e
46
- Logger.new(@options).print(@data.path, :parse, e)
46
+ Logger.new(@options).print(@path, :parse, e)
47
47
  end
48
48
 
49
49
  @state = :parsed
@@ -64,7 +64,7 @@ module RStore
64
64
 
65
65
 
66
66
  def state= state
67
- error_message = "#{state.inspect} is not a valid state. The following states are valid: #{print_valid_states}"
67
+ error_message = "#{state.inspect} is not a valid state. The following states are valid: #{print_valid_states}"
68
68
  raise ArgumentError, error_message unless KnownStates.include?(state)
69
69
  @state = state
70
70
  end
@@ -76,5 +76,5 @@ module RStore
76
76
  end
77
77
 
78
78
  end
79
- end
80
-
79
+ end
80
+
@@ -11,7 +11,7 @@ module RStore
11
11
  #attr_reader :file_options_hash
12
12
  attr_reader :data_hash
13
13
 
14
- attr_reader :file_options, :parse_options
14
+ attr_reader :file_options, :parse_options
15
15
  attr_reader :path
16
16
  attr_reader :file_paths, :file_type
17
17
  attr_reader :config
@@ -31,7 +31,7 @@ module RStore
31
31
 
32
32
 
33
33
  def file_paths= path
34
- return @file_paths unless @file_paths.nil?
34
+ return @file_paths unless @file_paths.nil? # @file_path can only be set once on initialization
35
35
 
36
36
  @file_paths = []
37
37
  files = []
@@ -45,7 +45,7 @@ module RStore
45
45
  end
46
46
  else # Either a file or a non-existing directory path
47
47
  file = File.expand_path(path)
48
- raise ArgumentError, "'#{path}' is not a valid path" unless File.exists?(file)
48
+ raise ArgumentError, "'#{path}' is not a valid path" unless File.exists?(file) # File.exist?(“/path/to/file_or_dir”)
49
49
 
50
50
  error_message = <<-MESSAGE.gsub(/^\s+/,'')
51
51
  Not a #{@file_type} file.
@@ -79,8 +79,6 @@ module RStore
79
79
 
80
80
 
81
81
  def file_options_hash= file_paths
82
- @file_options_hash unless @file_options_hash.nil?
83
-
84
82
  hash = Hash.new {|h,k| h[k] = Hash.new {|h,k| h[k] = nil}}
85
83
  file_paths.each do |path|
86
84
  hash[path][:file_options] = @file_options
@@ -122,10 +120,10 @@ module RStore
122
120
  when /^www/ # open-uri does not recognize URLs starting with 'www'
123
121
  address = 'http://' + address
124
122
  retry
125
- when /^http:/ # open-uri does not redirect from http to https on a valid https URL
123
+ when /^http:/ # open-uri does not redirect from http to https on a valid https URL
126
124
  address = address.gsub(/http/,'https')
127
125
  retry
128
- else
126
+ else
129
127
  raise ArgumentError, "Could not connect to #{url}. Please check if this URL is correct."
130
128
  end
131
129
  end
@@ -7,10 +7,10 @@ module RStore
7
7
 
8
8
  attr_accessor :data
9
9
  attr_accessor :message
10
-
11
10
 
12
- KnownStates =
13
- {:fetch => "loading files",
11
+
12
+ KnownStates =
13
+ {:fetch => "loading files",
14
14
  :parse => "parsing file content",
15
15
  :convert => "converting field values into their corresponding datatypes",
16
16
  :store => "storing file content into database"}
@@ -24,19 +24,19 @@ module RStore
24
24
 
25
25
 
26
26
  def log state, error, loc={}
27
- raise ArgumentError "#{state} is an invalid state vor #{self.class}" unless valid_state? state
27
+ raise ArgumentError "#{state} is an invalid state for #{self.class}" unless valid_state? state
28
28
 
29
29
  loc = correct_location(loc)
30
30
 
31
31
  type_of_error = error.class
32
32
  error_message = error.to_s
33
- location = "Location : #{location_to_s(loc)}"
33
+ location = "Location : #{location_to_s(loc)}"
34
34
  location = loc.empty? ? '' : location
35
35
 
36
36
  report = <<-TEXT.gsub(/^\s+/, '')
37
37
  An error occured while #{KnownStates[state]}:
38
- File : #{@data.path}
39
- Type of error: #{type_of_error}
38
+ File : #{@data.path}
39
+ Type of error: #{type_of_error}
40
40
  Error message: #{error_message}
41
41
  #{location}
42
42
  =============
@@ -61,9 +61,9 @@ module RStore
61
61
  end
62
62
 
63
63
 
64
-
64
+
65
65
  def correct_location location
66
-
66
+
67
67
  if location[:row] # row_index
68
68
  row = correct_row(location[:row])
69
69
  if location[:col] # col_index
@@ -88,7 +88,7 @@ module RStore
88
88
 
89
89
 
90
90
  def valid_state? state
91
- KnownStates.keys.any? { |val| val == state }
91
+ KnownStates.keys.any? { |val| val == state }
92
92
  end
93
93
 
94
94
 
@@ -1,3 +1,3 @@
1
1
  module RStore
2
- VERSION = "0.3.2"
2
+ VERSION = "0.3.4"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rstore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,30 +9,38 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-08 00:00:00.000000000Z
12
+ date: 2012-02-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: nokogiri
16
- requirement: &23883620 !ruby/object:Gem::Requirement
15
+ type: :runtime
16
+ name:
17
+ - open-uri
18
+ - nokogiri
19
+ - bigdecimal
20
+ - sequel
21
+ - csv
22
+ prerelease: false
23
+ requirement: &16180 !ruby/object:Gem::Requirement
17
24
  none: false
18
25
  requirements:
19
26
  - - ! '>='
20
27
  - !ruby/object:Gem::Version
21
28
  version: '0'
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: *23883620
29
+ version_requirements: *16180
25
30
  - !ruby/object:Gem::Dependency
26
- name: rspec
27
- requirement: &23883160 !ruby/object:Gem::Requirement
31
+ type: :development
32
+ name:
33
+ - rspec
34
+ - mysql
35
+ - sqlite3-ruby
36
+ prerelease: false
37
+ requirement: &16244 !ruby/object:Gem::Requirement
28
38
  none: false
29
39
  requirements:
30
40
  - - ! '>='
31
41
  - !ruby/object:Gem::Version
32
42
  version: '0'
33
- type: :development
34
- prerelease: false
35
- version_requirements: *23883160
43
+ version_requirements: *16244
36
44
  description: ! " RStore makes batch processing of csv files a breeze.\n Automatically
37
45
  fetches data files, directories, URLs\n :: Customizable using additional options\n
38
46
  \ :: Validation of field values\n :: Descriptive error messages\n :: Safe and
@@ -42,6 +50,7 @@ executables: []
42
50
  extensions: []
43
51
  extra_rdoc_files: []
44
52
  files:
53
+ - lib/rstore.rb
45
54
  - lib/rstore/version.rb
46
55
  - lib/rstore/csv.rb
47
56
  - lib/rstore/configuration.rb
@@ -52,13 +61,12 @@ files:
52
61
  - lib/rstore/logger.rb
53
62
  - lib/rstore/storage.rb
54
63
  - lib/rstore/base_table.rb
64
+ - lib/rstore/exceptions.rb
55
65
  - lib/rstore/core_ext/hash.rb
56
66
  - lib/rstore/core_ext/csv_wrapper.rb
57
67
  - lib/rstore/core_ext/string.rb
58
68
  - lib/rstore/core_ext/object.rb
59
- - lib/rstore/exceptions.rb
60
69
  - lib/rstore/modules/helper_methods.rb
61
- - lib/rstore.rb
62
70
  - ChangeLog.md
63
71
  - README.md
64
72
  - Rakefile
@@ -83,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
91
  version: '0'
84
92
  requirements: []
85
93
  rubyforge_project: rstore
86
- rubygems_version: 1.8.11
94
+ rubygems_version: 1.8.16
87
95
  signing_key:
88
96
  specification_version: 3
89
97
  summary: RStore - A library for easy batch storage of csv data into a database