rstore 0.3.2 → 0.3.4

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.
@@ -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