daru_lite 0.1.2 → 0.2.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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +11 -0
  3. data/.github/workflows/ci.yml +2 -2
  4. data/.rubocop.yml +2 -2
  5. data/benchmarks/db_loading.rb +0 -1
  6. data/daru_lite.gemspec +10 -12
  7. data/daru_lite_test-shm +0 -0
  8. data/daru_lite_test-wal +0 -0
  9. data/lib/daru_lite/accessors/array_wrapper.rb +4 -4
  10. data/lib/daru_lite/core/merge.rb +8 -8
  11. data/lib/daru_lite/data_frame/calculatable.rb +2 -2
  12. data/lib/daru_lite/data_frame/filterable.rb +4 -4
  13. data/lib/daru_lite/data_frame/i_o_able.rb +17 -14
  14. data/lib/daru_lite/data_frame/iterable.rb +11 -11
  15. data/lib/daru_lite/data_frame/queryable.rb +5 -5
  16. data/lib/daru_lite/dataframe.rb +16 -14
  17. data/lib/daru_lite/date_time/index.rb +10 -10
  18. data/lib/daru_lite/extensions/which_dsl.rb +2 -2
  19. data/lib/daru_lite/index/index.rb +4 -4
  20. data/lib/daru_lite/index/multi_index.rb +13 -4
  21. data/lib/daru_lite/io/io.rb +10 -9
  22. data/lib/daru_lite/io/sql_data_source.rb +7 -24
  23. data/lib/daru_lite/maths/statistics/dataframe.rb +2 -2
  24. data/lib/daru_lite/maths/statistics/vector.rb +16 -16
  25. data/lib/daru_lite/vector/aggregatable.rb +2 -2
  26. data/lib/daru_lite/vector/filterable.rb +2 -2
  27. data/lib/daru_lite/vector/queryable.rb +4 -4
  28. data/lib/daru_lite/vector/sortable.rb +4 -4
  29. data/lib/daru_lite/vector.rb +4 -6
  30. data/lib/daru_lite/version.rb +1 -1
  31. data/spec/data_frame/filterable_example.rb +174 -15
  32. data/spec/index/categorical_index_spec.rb +27 -8
  33. data/spec/index/index_spec.rb +16 -3
  34. data/spec/index/multi_index_spec.rb +85 -76
  35. data/spec/io/io_spec.rb +0 -16
  36. data/spec/io/sql_data_source_spec.rb +0 -8
  37. data/spec/spec_helper.rb +1 -1
  38. data/spec/support/database_helper.rb +0 -1
  39. metadata +30 -65
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1fca8a59ee849230424502a8ffa2f986134ccf522d15d53ab3807c22b64b30f8
4
- data.tar.gz: 8c4e8048ea8171c463b048ac9dff8b86a8b19e3ec5dd62f16bf72311e7b03b38
3
+ metadata.gz: bebf18b1b341f84a4728386060168694ffb47fdd49af1c4621db8a4a3591aa44
4
+ data.tar.gz: 1f1bbf2e6ef445496d1f7c58a79e8b74054a78b6cfdcf1f8e4431870cddce437
5
5
  SHA512:
6
- metadata.gz: 403d6cfe869dcd152f083ea0878be37f6a8b40212f6ba5f80ece21bcadf51a4f13471f529bbddcf66b593568f31ec52f3e308c39160f0bd87bac9af6d95b30f6
7
- data.tar.gz: dfbc2d7b5e63c54980c704c0df3d96ae8d079b921fc0ff51a34f109126a2a382d531457321737e83a2b03bc114b741e3018d0beb9cb00554aa822345d94f3144
6
+ metadata.gz: e1a020700e73fb9a48bfefb225ab79d465658df60fd95bed92ad4053533a0f6f4d6ea1d4e7b5e4dd10a11b79d7f2a5ade80345a87a81efb2eea5124db29d77be
7
+ data.tar.gz: 148611db5a2ef6c16b2974131f1c7a1e8298f7537d9868d26a248181478266bae61ce2e1810f6d513391fbfa7deaf66c239491102eae56d698791da26665827a
@@ -0,0 +1,11 @@
1
+ # To get started with Dependabot version updates, you'll need to specify which
2
+ # package ecosystems to update and where the package manifests are located.
3
+ # Please see the documentation for all configuration options:
4
+ # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
5
+
6
+ version: 2
7
+ updates:
8
+ - package-ecosystem: "bundler" # See documentation for possible values
9
+ directory: "/" # Location of package manifests
10
+ schedule:
11
+ interval: "daily"
@@ -19,7 +19,7 @@ jobs:
19
19
  - name: Set up Ruby
20
20
  uses: ruby/setup-ruby@v1
21
21
  with:
22
- ruby-version: 3.1
22
+ ruby-version: 3.4
23
23
  bundler-cache: true # runs 'bundle install' and caches installed gems automatically
24
24
  - name: Run linters
25
25
  run: |
@@ -29,7 +29,7 @@ jobs:
29
29
  runs-on: ubuntu-latest
30
30
  strategy:
31
31
  matrix:
32
- ruby-version: ['3.1']
32
+ ruby-version: ['3.4']
33
33
 
34
34
  steps:
35
35
  - uses: actions/checkout@v3
data/.rubocop.yml CHANGED
@@ -16,10 +16,10 @@ AllCops:
16
16
  - 'profile/*'
17
17
  - 'tmp/*'
18
18
  DisplayCopNames: true
19
- TargetRubyVersion: 2.7
19
+ TargetRubyVersion: 3.4
20
20
  NewCops: enable
21
21
 
22
- require:
22
+ plugins:
23
23
  - rubocop-performance
24
24
  - rubocop-rspec
25
25
 
@@ -3,7 +3,6 @@ $:.unshift File.expand_path("../../lib", __FILE__)
3
3
  require 'benchmark'
4
4
  require 'daru_lite'
5
5
  require 'sqlite3'
6
- require 'dbi'
7
6
  require 'active_record'
8
7
 
9
8
  db_name = 'daru_lite_test.sqlite'
data/daru_lite.gemspec CHANGED
@@ -28,29 +28,27 @@ Gem::Specification.new do |spec|
28
28
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
29
29
  spec.require_paths = ["lib"]
30
30
 
31
- spec.add_development_dependency 'activerecord', '~> 6.0'
31
+ spec.add_development_dependency 'activerecord', '~> 8.0'
32
32
  spec.add_development_dependency 'awesome_print', '~> 1.9.2'
33
- spec.add_development_dependency 'bundler', '~> 2.1', '>= 2.1.4'
34
- spec.add_development_dependency 'dbd-sqlite3', '~> 1.2.5'
35
- spec.add_development_dependency 'dbi', '~> 0.4.5'
33
+ spec.add_development_dependency 'bundler', '~> 2.6'
34
+ spec.add_development_dependency 'csv', '~> 3.3.4'
35
+ spec.add_development_dependency 'debug', '>= 1.0.0'
36
36
  spec.add_development_dependency 'distribution', '~> 0.8'
37
37
  spec.add_development_dependency 'matrix', '~> 0.4.2'
38
- spec.add_development_dependency 'nokogiri', '~> 1.16.2'
38
+ spec.add_development_dependency 'nokogiri', '~> 1.18.0'
39
39
  spec.add_development_dependency 'prime', '~> 0.1.2'
40
- spec.add_development_dependency 'pry', '~> 0.14'
41
- spec.add_development_dependency 'pry-byebug', '~> 3.10.1'
42
40
  spec.add_development_dependency 'rake', '~> 13.0'
43
41
  spec.add_development_dependency 'rspec', '~> 3.11'
44
- spec.add_development_dependency 'rspec-its', '~> 1.3.0'
42
+ spec.add_development_dependency 'rspec-its', '~> 2.0.0'
45
43
  spec.add_development_dependency 'rubocop', '~> 1.60'
46
- spec.add_development_dependency 'rubocop-performance', '~> 1.20.2'
47
- spec.add_development_dependency 'rubocop-rspec', '~> 2.25'
44
+ spec.add_development_dependency 'rubocop-performance', '~> 1.25.0'
45
+ spec.add_development_dependency 'rubocop-rspec', '~> 3.6'
48
46
  spec.add_development_dependency 'ruby-prof', '~> 1.7.0'
49
47
  spec.add_development_dependency 'simplecov', '~> 0.22.0'
50
48
  spec.add_development_dependency 'simplecov_json_formatter', '~> 0.1.4'
51
49
  spec.add_development_dependency 'spreadsheet', '~> 1.3.0'
52
- spec.add_development_dependency 'sqlite3', '~> 1.7.2'
50
+ spec.add_development_dependency 'sqlite3', '~> 2.6.0'
53
51
  # issue : https://github.com/SciRuby/daru/issues/493 occured
54
52
  # with latest version of sqlite3
55
- spec.add_development_dependency 'webmock', '~> 3.20.0'
53
+ spec.add_development_dependency 'webmock', '~> 3.25.0'
56
54
  end
Binary file
File without changes
@@ -7,13 +7,13 @@ module DaruLite
7
7
 
8
8
  def_delegators :@data, :slice!
9
9
 
10
- def each(&block)
11
- @data.each(&block)
10
+ def each(&)
11
+ @data.each(&)
12
12
  self
13
13
  end
14
14
 
15
- def map!(&block)
16
- @data.map!(&block)
15
+ def map!(&)
16
+ @data.map!(&)
17
17
  self
18
18
  end
19
19
 
@@ -1,6 +1,14 @@
1
1
  module DaruLite
2
2
  module Core
3
3
  class MergeFrame
4
+ LEFT_RIGHT_COMBINATIONS = {
5
+ # left right
6
+ inner: [false, false],
7
+ left: [true, false],
8
+ right: [false, true],
9
+ outer: [true, true]
10
+ }.freeze
11
+
4
12
  class NilSorter
5
13
  include Comparable
6
14
 
@@ -55,14 +63,6 @@ module DaruLite
55
63
 
56
64
  attr_accessor :merge_key
57
65
 
58
- LEFT_RIGHT_COMBINATIONS = {
59
- # left right
60
- inner: [false, false],
61
- left: [true, false],
62
- right: [false, true],
63
- outer: [true, true]
64
- }.freeze
65
-
66
66
  def init_opts(opts)
67
67
  @on = opts[:on]
68
68
  @keep_left, @keep_right = extract_left_right(opts[:how])
@@ -110,8 +110,8 @@ module DaruLite
110
110
  # # 4 555
111
111
  # # 5 666
112
112
  # # 6 777
113
- def vector_by_calculation(&block)
114
- a = each_row.map { |r| r.instance_eval(&block) }
113
+ def vector_by_calculation(&)
114
+ a = each_row.map { |r| r.instance_eval(&) }
115
115
 
116
116
  DaruLite::Vector.new a, index: @index
117
117
  end
@@ -68,8 +68,8 @@ module DaruLite
68
68
  # df.filter(:row) do |row|
69
69
  # row[:a] + row[:d] < 100
70
70
  # end
71
- def filter(axis = :vector, &block)
72
- dispatch_to_axis_pl axis, :filter, &block
71
+ def filter(axis = :vector, &)
72
+ dispatch_to_axis_pl(axis, :filter, &)
73
73
  end
74
74
 
75
75
  # Returns a dataframe in which rows with any of the mentioned values
@@ -113,8 +113,8 @@ module DaruLite
113
113
  end
114
114
 
115
115
  # creates a new vector with the data of a given field which the block returns true
116
- def filter_vector(vec, &block)
117
- DaruLite::Vector.new(each_row.select(&block).map { |row| row[vec] })
116
+ def filter_vector(vec, &)
117
+ DaruLite::Vector.new(each_row.select(&).map { |row| row[vec] })
118
118
  end
119
119
 
120
120
  # Iterates over each row and retains it in a new DataFrame if the block returns
@@ -32,8 +32,8 @@ module DaruLite
32
32
  # :col_sep => ',',
33
33
  # :converters => :numeric
34
34
  # }
35
- def from_csv(path, opts = {}, &block)
36
- DaruLite::IO.from_csv path, opts, &block
35
+ def from_csv(path, opts = {}, &)
36
+ DaruLite::IO.from_csv(path, opts, &)
37
37
  end
38
38
 
39
39
  # Read data from an Excel file into a DataFrame.
@@ -45,28 +45,30 @@ module DaruLite
45
45
  # == Options
46
46
  #
47
47
  # *:worksheet_id - ID of the worksheet that is to be read.
48
- def from_excel(path, opts = {}, &block)
49
- DaruLite::IO.from_excel path, opts, &block
48
+ def from_excel(path, opts = {}, &)
49
+ DaruLite::IO.from_excel(path, opts, &)
50
50
  end
51
51
 
52
52
  # Read a database query and returns a Dataset
53
53
  #
54
- # @param dbh [DBI::DatabaseHandle, String] A DBI connection OR Path to a SQlite3 database.
54
+ # @param arh [ActiveRecord::ConnectionAdapters::AbstractAdapter, String] An ActiveRecord connection
55
+ # OR Path to a SQlite3 database.
55
56
  # @param query [String] The query to be executed
56
57
  #
57
58
  # @return A dataframe containing the data resulting from the query
58
59
  #
59
60
  # USE:
60
61
  #
61
- # dbh = DBI.connect("DBI:Mysql:database:localhost", "user", "password")
62
+ # ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: "path/to/sqlite.db")
63
+ # arh = ActiveRecord::Base.connection
62
64
  # DaruLite::DataFrame.from_sql(dbh, "SELECT * FROM test")
63
65
  #
64
66
  # #Alternatively
65
67
  #
66
- # require 'dbi'
68
+ # require 'active_record'
67
69
  # DaruLite::DataFrame.from_sql("path/to/sqlite.db", "SELECT * FROM test")
68
- def from_sql(dbh, query)
69
- DaruLite::IO.from_sql dbh, query
70
+ def from_sql(arh, query)
71
+ DaruLite::IO.from_sql arh, query
70
72
  end
71
73
 
72
74
  # Read a dataframe from AR::Relation
@@ -149,16 +151,17 @@ module DaruLite
149
151
  #
150
152
  # == Arguments
151
153
  #
152
- # * dbh - DBI database connection object.
154
+ # * arh - ActiveRecord database connection object.
153
155
  # * query - Query string.
154
156
  #
155
157
  # == Usage
156
158
  #
157
159
  # ds = DaruLite::DataFrame.new({:id=>DaruLite::Vector.new([1,2,3]), :name=>DaruLite::Vector.new(["a","b","c"])})
158
- # dbh = DBI.connect("DBI:Mysql:database:localhost", "user", "password")
159
- # ds.write_sql(dbh,"test")
160
- def write_sql(dbh, table)
161
- DaruLite::IO.dataframe_write_sql self, dbh, table
160
+ # ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: "path/to/sqlite.db")
161
+ # arh = ActiveRecord::Base.connection
162
+ # ds.write_sql(arh,"test")
163
+ def write_sql(arh, table)
164
+ DaruLite::IO.dataframe_write_sql self, arh, table
162
165
  end
163
166
 
164
167
  # Use marshalling to save dataframe to a file.
@@ -68,8 +68,8 @@ module DaruLite
68
68
  #
69
69
  # * +axis+ - The axis to iterate over. Can be :vector (or :column)
70
70
  # or :row. Default to :vector.
71
- def each(axis = :vector, &block)
72
- dispatch_to_axis axis, :each, &block
71
+ def each(axis = :vector, &)
72
+ dispatch_to_axis(axis, :each, &)
73
73
  end
74
74
 
75
75
  # Iterate over a row or vector and return results in a DaruLite::Vector.
@@ -87,8 +87,8 @@ module DaruLite
87
87
  #
88
88
  # * +axis+ - The axis to iterate over. Can be :vector (or :column)
89
89
  # or :row. Default to :vector.
90
- def collect(axis = :vector, &block)
91
- dispatch_to_axis_pl axis, :collect, &block
90
+ def collect(axis = :vector, &)
91
+ dispatch_to_axis_pl(axis, :collect, &)
92
92
  end
93
93
 
94
94
  # Map over each vector or row of the data frame according to
@@ -107,8 +107,8 @@ module DaruLite
107
107
  #
108
108
  # * +axis+ - The axis to map over. Can be :vector (or :column) or :row.
109
109
  # Default to :vector.
110
- def map(axis = :vector, &block)
111
- dispatch_to_axis_pl axis, :map, &block
110
+ def map(axis = :vector, &)
111
+ dispatch_to_axis_pl(axis, :map, &)
112
112
  end
113
113
 
114
114
  # Destructive map. Modifies the DataFrame. Each run of the block
@@ -119,11 +119,11 @@ module DaruLite
119
119
  #
120
120
  # * +axis+ - The axis to map over. Can be :vector (or :column) or :row.
121
121
  # Default to :vector.
122
- def map!(axis = :vector, &block)
122
+ def map!(axis = :vector, &)
123
123
  if %i[vector column].include?(axis)
124
- map_vectors!(&block)
124
+ map_vectors!(&)
125
125
  elsif axis == :row
126
- map_rows!(&block)
126
+ map_rows!(&)
127
127
  end
128
128
  end
129
129
 
@@ -144,8 +144,8 @@ module DaruLite
144
144
  #
145
145
  # * +axis+ - The axis to map over. Can be :vector (or :column) or :row.
146
146
  # Default to :vector.
147
- def recode(axis = :vector, &block)
148
- dispatch_to_axis_pl axis, :recode, &block
147
+ def recode(axis = :vector, &)
148
+ dispatch_to_axis_pl(axis, :recode, &)
149
149
  end
150
150
 
151
151
  # Replace specified values with given value
@@ -31,9 +31,9 @@ module DaruLite
31
31
  # df.any?(:row) do |row|
32
32
  # row[:a] < 3 and row[:b] == 'b'
33
33
  # end #=> true
34
- def any?(axis = :vector, &block)
34
+ def any?(axis = :vector, &)
35
35
  if %i[vector column].include?(axis)
36
- @data.any?(&block)
36
+ @data.any?(&)
37
37
  elsif axis == :row
38
38
  each_row do |row|
39
39
  return true if yield(row)
@@ -53,11 +53,11 @@ module DaruLite
53
53
  # df.all?(:row) do |row|
54
54
  # row[:a] < 10
55
55
  # end #=> true
56
- def all?(axis = :vector, &block)
56
+ def all?(axis = :vector, &)
57
57
  if %i[vector column].include?(axis)
58
- @data.all?(&block)
58
+ @data.all?(&)
59
59
  elsif axis == :row
60
- each_row.all?(&block)
60
+ each_row.all?(&)
61
61
  else
62
62
  raise ArgumentError, "Unidentified axis #{axis}"
63
63
  end
@@ -38,6 +38,8 @@ module DaruLite
38
38
  include DaruLite::Maths::Arithmetic::DataFrame
39
39
  include DaruLite::Maths::Statistics::DataFrame
40
40
 
41
+ AXES = %i[row vector].freeze
42
+
41
43
  attr_accessor(*Configuration::INSPECT_OPTIONS_KEYS)
42
44
 
43
45
  extend Gem::Deprecate
@@ -289,8 +291,8 @@ module DaruLite
289
291
  def delete_at_position(position)
290
292
  raise IndexError, "Position #{position} does not exist." unless position < size
291
293
 
292
- each_vector { |vector| vector.delete_at_position(position) }
293
294
  @index = @index.delete_at(position)
295
+ each_vector { |vector| vector.delete_at_position(position) }
294
296
 
295
297
  set_size
296
298
  end
@@ -478,15 +480,17 @@ module DaruLite
478
480
  self
479
481
  end
480
482
 
481
- def method_missing(name, *args, &block)
482
- if /(.+)=/.match?(name)
483
- name = name[/(.+)=/].delete('=')
483
+ def method_missing(name, *args, &)
484
+ stringified_name = name.to_s
485
+
486
+ if /^([^=]+)=/.match?(stringified_name)
487
+ name = stringified_name[/^([^=]+)=/].delete('=')
484
488
  name = name.to_sym unless has_vector?(name)
485
489
  insert_or_modify_vector [name], args[0]
486
490
  elsif has_vector?(name)
487
491
  self[name]
488
- elsif has_vector?(name.to_s)
489
- self[name.to_s]
492
+ elsif has_vector?(stringified_name)
493
+ self[stringified_name]
490
494
  else
491
495
  super
492
496
  end
@@ -527,28 +531,26 @@ module DaruLite
527
531
  end
528
532
  end
529
533
 
530
- def dispatch_to_axis(axis, method, *args, &block)
534
+ def dispatch_to_axis(axis, method, *, &)
531
535
  if %i[vector column].include?(axis)
532
- send(:"#{method}_vector", *args, &block)
536
+ send(:"#{method}_vector", *, &)
533
537
  elsif axis == :row
534
- send(:"#{method}_row", *args, &block)
538
+ send(:"#{method}_row", *, &)
535
539
  else
536
540
  raise ArgumentError, "Unknown axis #{axis}"
537
541
  end
538
542
  end
539
543
 
540
- def dispatch_to_axis_pl(axis, method, *args, &block)
544
+ def dispatch_to_axis_pl(axis, method, *, &)
541
545
  if %i[vector column].include?(axis)
542
- send(:"#{method}_vectors", *args, &block)
546
+ send(:"#{method}_vectors", *, &)
543
547
  elsif axis == :row
544
- send(:"#{method}_rows", *args, &block)
548
+ send(:"#{method}_rows", *, &)
545
549
  else
546
550
  raise ArgumentError, "Unknown axis #{axis}"
547
551
  end
548
552
  end
549
553
 
550
- AXES = %i[row vector].freeze
551
-
552
554
  def extract_axis(names, default = :vector)
553
555
  if AXES.include?(names.last)
554
556
  names.pop
@@ -30,7 +30,7 @@ module DaruLite
30
30
  (
31
31
  (?<offset>MONTH|YEAR|S|H|MB|ME|M|D|YB|YE) |
32
32
  (?<offset>W)(-(?<weekday>#{DOW_REGEXP}))?
33
- )$/x.freeze
33
+ )$/x
34
34
 
35
35
  # Generates a DaruLite::DateOffset object for generic offsets or one of the
36
36
  # specialized classed within DaruLite::Offsets depending on the 'frequency'
@@ -131,7 +131,7 @@ module DaruLite
131
131
  end
132
132
  end
133
133
 
134
- DATE_PRECISION_REGEXP = /^(\d\d\d\d)(-\d{1,2}(-\d{1,2}( \d{1,2}(:\d{1,2}(:\d{1,2})?)?)?)?)?$/.freeze
134
+ DATE_PRECISION_REGEXP = /^(\d\d\d\d)(-\d{1,2}(-\d{1,2}( \d{1,2}(:\d{1,2}(:\d{1,2})?)?)?)?)?$/
135
135
  DATE_PRECISIONS = [nil, :year, :month, :day, :hour, :min, :sec].freeze
136
136
 
137
137
  def determine_date_precision_of(date_string)
@@ -222,8 +222,8 @@ module DaruLite
222
222
  new(source, freq: :infer) if source && ArrayHelper.array_of?(source, ::DateTime)
223
223
  end
224
224
 
225
- def each(&block)
226
- to_a.each(&block)
225
+ def each(&)
226
+ to_a.each(&)
227
227
  end
228
228
 
229
229
  attr_reader :frequency, :offset, :periods, :keys
@@ -367,20 +367,20 @@ module DaruLite
367
367
  end
368
368
  end
369
369
 
370
- def pos(*args)
370
+ def pos(*)
371
371
  # to filled
372
- out = self[*args]
372
+ out = self[*]
373
373
  return out if out.is_a? Numeric
374
374
 
375
375
  out.map { |date| self[date] }
376
376
  end
377
377
 
378
- def subset(*args)
379
- self[*args]
378
+ def subset(*)
379
+ self[*]
380
380
  end
381
381
 
382
- def valid?(*args)
383
- self[*args]
382
+ def valid?(*)
383
+ self[*]
384
384
  true
385
385
  rescue IndexError
386
386
  false
@@ -12,8 +12,8 @@ module DaruLite
12
12
  # df.which{ (`NameTitle` == 'Dr') & (`Sex` == 'female') }
13
13
  # equals
14
14
  # df.where( df['NameTitle'].eq('Dr') & df['Sex'].eq('female') )
15
- def which(&block)
16
- WhichQuery.new(self, &block).exec
15
+ def which(&)
16
+ WhichQuery.new(self, &).exec
17
17
  end
18
18
  end
19
19
 
@@ -20,7 +20,7 @@ module DaruLite
20
20
 
21
21
  # We over-ride the .new method so that any sort of Index can be generated
22
22
  # from DaruLite::Index based on the types of arguments supplied.
23
- def self.new(*args, &block)
23
+ def self.new(*args, &)
24
24
  # FIXME: I'm not sure this clever trick really deserves our attention.
25
25
  # Most of common ruby libraries just avoid it in favor of usual
26
26
  # factor method, like `Index.create`. When `Index.new(...).class != Index`
@@ -29,7 +29,7 @@ module DaruLite
29
29
 
30
30
  MultiIndex.try_from_tuples(source) ||
31
31
  DateTimeIndex.try_create(source) ||
32
- allocate.tap { |i| i.send :initialize, *args, &block }
32
+ allocate.tap { |i| i.send(:initialize, *args, &) }
33
33
  end
34
34
 
35
35
  def self.coerce(maybe_index)
@@ -200,7 +200,7 @@ module DaruLite
200
200
  end
201
201
 
202
202
  def to_a
203
- @keys
203
+ @keys.dup
204
204
  end
205
205
 
206
206
  def key(value)
@@ -377,7 +377,7 @@ module DaruLite
377
377
  def numeric_pos(key)
378
378
  if @relation_hash.key?(key)
379
379
  @relation_hash[key]
380
- elsif key.is_a?(Numeric) && (key < size && key >= -size)
380
+ elsif key.is_a?(Numeric) && key < size && key >= -size
381
381
  key
382
382
  else
383
383
  raise IndexError, "Specified index #{key.inspect} does not exist"
@@ -1,11 +1,11 @@
1
1
  module DaruLite
2
2
  class MultiIndex < Index # rubocop:disable Metrics/ClassLength
3
- def each(&block)
4
- to_a.each(&block)
3
+ def each(&)
4
+ to_a.each(&)
5
5
  end
6
6
 
7
- def map(&block)
8
- to_a.map(&block)
7
+ def map(&)
8
+ to_a.map(&)
9
9
  end
10
10
 
11
11
  attr_reader :labels, :name
@@ -196,6 +196,15 @@ module DaruLite
196
196
  DaruLite::MultiIndex.from_tuples(to_a + [indexes])
197
197
  end
198
198
 
199
+ # Takes a positional value and returns a new Index without the element at given position
200
+ # @param position [Integer] positional value
201
+ # @return [object] index object
202
+ def delete_at(position)
203
+ indexes = to_a
204
+ indexes.delete_at(position)
205
+ self.class.from_tuples(indexes)
206
+ end
207
+
199
208
  def reorder(new_order)
200
209
  from = to_a
201
210
  MultiIndex.from_tuples(new_order.map { |i| from[i] })
@@ -1,7 +1,11 @@
1
1
  module DaruLite
2
2
  require_relative 'csv/converters'
3
+
3
4
  module IOHelpers
4
5
  class << self
6
+ INT_PATTERN = /^[-+]?\d+$/
7
+ FLOAT_PATTERN = /^[-+]?\d+[,.]?\d*(e-?\d+)?$/
8
+
5
9
  def process_row(row, empty)
6
10
  row.to_a.map do |c|
7
11
  if empty.include?(c)
@@ -23,9 +27,6 @@ module DaruLite
23
27
 
24
28
  private
25
29
 
26
- INT_PATTERN = /^[-+]?\d+$/.freeze
27
- FLOAT_PATTERN = /^[-+]?\d+[,.]?\d*(e-?\d+)?$/.freeze
28
-
29
30
  def try_string_to_number(s)
30
31
  case s
31
32
  when INT_PATTERN
@@ -41,6 +42,8 @@ module DaruLite
41
42
 
42
43
  module IO
43
44
  class << self
45
+ DARU_OPT_KEYS = %i[clone order index name].freeze
46
+
44
47
  # Functions for loading/writing Excel files.
45
48
 
46
49
  def from_excel(path, opts = {})
@@ -124,7 +127,8 @@ module DaruLite
124
127
 
125
128
  # Execute a query and create a data frame from the result
126
129
  #
127
- # @param db [DBI::DatabaseHandle, String] A DBI connection OR Path to a SQlite3 database.
130
+ # @param db [ActiveRecord::ConnectionAdapters::AbstractAdapter, String] An ActiveRecord connection
131
+ # OR Path to a SQlite3 database.
128
132
  # @param query [String] The query to be executed
129
133
  #
130
134
  # @return A dataframe containing the data resulting from the query
@@ -134,7 +138,6 @@ module DaruLite
134
138
  end
135
139
 
136
140
  def dataframe_write_sql(ds, dbh, table)
137
- require 'dbi'
138
141
  query = "INSERT INTO #{table} (#{ds.vectors.to_a.join(',')}) VALUES (#{(['?'] * ds.vectors.size).join(',')})"
139
142
  sth = dbh.prepare(query)
140
143
  ds.each_row { |c| sth.execute(*c.to_a) }
@@ -196,8 +199,6 @@ module DaruLite
196
199
  DaruLite.error "\nInstall the #{name} gem version #{version} for using #{name} functions."
197
200
  end
198
201
 
199
- DARU_OPT_KEYS = %i[clone order index name].freeze
200
-
201
202
  def from_csv_prepare_opts(opts)
202
203
  opts[:col_sep] ||= ','
203
204
  opts[:skip_blanks] ||= true
@@ -245,7 +246,7 @@ module DaruLite
245
246
  def html_parse_table(table)
246
247
  headers, headers_size = html_scrape_tag(table, 'th')
247
248
  data, size = html_scrape_tag(table, 'td')
248
- data = data.keep_if { |x| x.count == size }
249
+ data.keep_if { |x| x.count == size }
249
250
  order, indice = html_parse_hash(headers, size, headers_size) if headers_size >= size
250
251
  return unless (indice.nil? || indice.count == data.count) && !order.nil? && order.count.positive?
251
252
 
@@ -272,7 +273,7 @@ module DaruLite
272
273
  end
273
274
 
274
275
  def html_search(table, match = nil)
275
- match.nil? ? true : (table.to_s.include? match)
276
+ match.nil? || (table.to_s.include? match)
276
277
  end
277
278
 
278
279
  # Allows user to override the scraped order / index / data