daru_lite 0.1.3 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fe2a3da2352dd68322a62e048c7870ad34f243a31bcd0cf18725b15583e4c5e8
4
- data.tar.gz: 889d0714e1188240f43dc741f2b58b0ce3fe8731a07b39ee4d366f54ce301f6b
3
+ metadata.gz: bebf18b1b341f84a4728386060168694ffb47fdd49af1c4621db8a4a3591aa44
4
+ data.tar.gz: 1f1bbf2e6ef445496d1f7c58a79e8b74054a78b6cfdcf1f8e4431870cddce437
5
5
  SHA512:
6
- metadata.gz: 370f64692790e1661642c2e40ec4b56baa8fd8ac000be5623293013b169b7d96c0e5d5fe122801bbea40945761710b0b94c148fae27c67a42ab1825683416876
7
- data.tar.gz: ebb89b2307548a0deaeda39e8e72a899a0f4e20c0e5a5ee16515c7aaea5ac95e8f7da3dc752b80a7dba64ec2f4e19717ba3703c06ee0793111c36da968ed5b02
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
@@ -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)
@@ -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
@@ -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
@@ -16,24 +16,6 @@ module DaruLite
16
16
  end
17
17
  end
18
18
 
19
- # Private adapter class for DBI::DatabaseHandle
20
- # @private
21
- class DbiAdapter < Adapter
22
- private
23
-
24
- def column_names
25
- result.column_names
26
- end
27
-
28
- def rows
29
- result.to_a.map(&:to_a)
30
- end
31
-
32
- def result
33
- @result ||= @conn.execute(@query)
34
- end
35
- end
36
-
37
19
  # Private adapter class for connections of ActiveRecord
38
20
  # @private
39
21
  class ActiveRecordConnectionAdapter < Adapter
@@ -52,7 +34,6 @@ module DaruLite
52
34
  end
53
35
  end
54
36
 
55
- private_constant :DbiAdapter
56
37
  private_constant :ActiveRecordConnectionAdapter
57
38
 
58
39
  def self.make_dataframe(db, query)
@@ -76,8 +57,6 @@ module DaruLite
76
57
  db = attempt_sqlite3_connection(db) if db.is_a?(String) && Pathname(db).exist?
77
58
 
78
59
  case db
79
- when DBI::DatabaseHandle
80
- DbiAdapter.new(db, query)
81
60
  when ActiveRecord::ConnectionAdapters::AbstractAdapter
82
61
  ActiveRecordConnectionAdapter.new(db, query)
83
62
  else
@@ -86,11 +65,15 @@ module DaruLite
86
65
  end
87
66
 
88
67
  def attempt_sqlite3_connection(db)
89
- DBI.connect("DBI:SQLite3:#{db}")
90
- rescue SQLite3::NotADatabaseException
68
+ ActiveRecord::Base.establish_connection(
69
+ adapter: 'sqlite3',
70
+ database: db
71
+ )
72
+ ActiveRecord::Base.connection.tap(&:verify!)
73
+ rescue ActiveRecord::StatementInvalid
91
74
  raise ArgumentError, "Expected #{db} to point to a SQLite3 database"
92
75
  rescue NameError
93
- raise NameError, "In order to establish a connection to #{db}, please require 'dbi'"
76
+ raise NameError, "In order to establish a connection to #{db}, please require 'ActiveRecord'"
94
77
  end
95
78
  end
96
79
  end
@@ -165,10 +165,10 @@ module DaruLite
165
165
 
166
166
  private
167
167
 
168
- def apply_method_to_numerics(method, *args)
168
+ def apply_method_to_numerics(method, *)
169
169
  numerics = @vectors.to_a.map { |n| [n, @data[@vectors[n]]] }
170
170
  .select { |_n, v| v.numeric? }
171
- computed = numerics.map { |_n, v| v.send(method, *args) }
171
+ computed = numerics.map { |_n, v| v.send(method, *) }
172
172
 
173
173
  DaruLite::DataFrame.new(computed, index: @index, order: numerics.map(&:first), clone: false)
174
174
  end
@@ -89,8 +89,8 @@ module DaruLite
89
89
  #
90
90
  # dv.max(2) { |a,b| a.size <=> b.size }
91
91
  # #=> ["Jon Starkgaryen","Daenerys"]
92
- def max(size = nil, &block)
93
- reject_values(*DaruLite::MISSING_VALUES).to_a.max(size, &block)
92
+ def max(size = nil, &)
93
+ reject_values(*DaruLite::MISSING_VALUES).to_a.max(size, &)
94
94
  end
95
95
 
96
96
  # Returns the maximum value(s) present in the vector, with a compulsory object block.
@@ -134,8 +134,8 @@ module DaruLite
134
134
  #
135
135
  # dv.min(2) { |a,b| a.size <=> b.size }
136
136
  # #=> ["Tyrion","Daenerys"]
137
- def min(size = nil, &block)
138
- reject_values(*DaruLite::MISSING_VALUES).to_a.min(size, &block)
137
+ def min(size = nil, &)
138
+ reject_values(*DaruLite::MISSING_VALUES).to_a.min(size, &)
139
139
  end
140
140
 
141
141
  # Returns the minimum value(s) present in the vector, with a compulsory object block.
@@ -179,9 +179,9 @@ module DaruLite
179
179
  #
180
180
  # dv.max(2) { |a,b| a.size <=> b.size }
181
181
  # #=> ["Jon Starkgaryen","Daenerys"]
182
- def max(size = nil, &block)
182
+ def max(size = nil, &)
183
183
  range = size.nil? ? 0 : (0..size - 1)
184
- reject_values(*DaruLite::MISSING_VALUES).to_a.sort(&block).reverse[range]
184
+ reject_values(*DaruLite::MISSING_VALUES).to_a.sort(&).reverse[range]
185
185
  end
186
186
 
187
187
  # Returns the maximum value(s) present in the vector, with a compulsory object block.
@@ -225,9 +225,9 @@ module DaruLite
225
225
  #
226
226
  # dv.min(2) { |a,b| a.size <=> b.size }
227
227
  # #=> ["Tyrion","Daenerys"]
228
- def min(size = nil, &block)
228
+ def min(size = nil, &)
229
229
  range = size.nil? ? 0 : (0..size - 1)
230
- reject_values(*DaruLite::MISSING_VALUES).to_a.sort(&block)[range]
230
+ reject_values(*DaruLite::MISSING_VALUES).to_a.sort(&)[range]
231
231
  end
232
232
 
233
233
  # Returns the minimum value(s) present in the vector, with a compulsory object block.
@@ -276,8 +276,8 @@ module DaruLite
276
276
  #
277
277
  # dv.index_of_max(2) { |a,b| a.size <=> b.size }
278
278
  # #=> [:j, :d]
279
- def index_of_max(size = nil, &block)
280
- vals = max(size, &block)
279
+ def index_of_max(size = nil, &)
280
+ vals = max(size, &)
281
281
  dv = reject_values(*DaruLite::MISSING_VALUES)
282
282
  vals.is_a?(Array) ? (vals.map { |x| dv.index_of(x) }) : dv.index_of(vals)
283
283
  end
@@ -299,8 +299,8 @@ module DaruLite
299
299
  #
300
300
  # dv.index_of_max_by(2) { |i| i.size }
301
301
  # #=> [:j, :d]
302
- def index_of_max_by(size = nil, &block)
303
- vals = max_by(size, &block)
302
+ def index_of_max_by(size = nil, &)
303
+ vals = max_by(size, &)
304
304
  dv = reject_values(*DaruLite::MISSING_VALUES)
305
305
  vals.is_a?(Array) ? (vals.map { |x| dv.index_of(x) }) : dv.index_of(vals)
306
306
  end
@@ -325,8 +325,8 @@ module DaruLite
325
325
  #
326
326
  # dv.index_of_min(2) { |a,b| a.size <=> b.size }
327
327
  # #=> [:t, :d]
328
- def index_of_min(size = nil, &block)
329
- vals = min(size, &block)
328
+ def index_of_min(size = nil, &)
329
+ vals = min(size, &)
330
330
  dv = reject_values(*DaruLite::MISSING_VALUES)
331
331
  vals.is_a?(Array) ? (vals.map { |x| dv.index_of(x) }) : dv.index_of(vals)
332
332
  end
@@ -348,8 +348,8 @@ module DaruLite
348
348
  #
349
349
  # dv.index_of_min(2) { |i| i.size }
350
350
  # #=> [:t, :d]
351
- def index_of_min_by(size = nil, &block)
352
- vals = min_by(size, &block)
351
+ def index_of_min_by(size = nil, &)
352
+ vals = min_by(size, &)
353
353
  dv = reject_values(*DaruLite::MISSING_VALUES)
354
354
  vals.is_a?(Array) ? (vals.map { |x| dv.index_of(x) }) : dv.index_of(vals)
355
355
  end
@@ -1,8 +1,8 @@
1
1
  module DaruLite
2
2
  class Vector
3
3
  module Aggregatable
4
- def group_by(*args)
5
- to_df.group_by(*args)
4
+ def group_by(*)
5
+ to_df.group_by(*)
6
6
  end
7
7
  end
8
8
  end
@@ -58,8 +58,8 @@ module DaruLite
58
58
  # # 0 3 days
59
59
  # # 1 35 days
60
60
  # # 2 14 days
61
- def apply_where(bool_array, &block)
62
- DaruLite::Core::Query.vector_apply_where self, bool_array, &block
61
+ def apply_where(bool_array, &)
62
+ DaruLite::Core::Query.vector_apply_where(self, bool_array, &)
63
63
  end
64
64
 
65
65
  # Keep only unique elements of the vector alongwith their indexes.
@@ -17,12 +17,12 @@ module DaruLite
17
17
  values.any? { |v| include_with_nan? @data, v }
18
18
  end
19
19
 
20
- def any?(&block)
21
- @data.data.any?(&block)
20
+ def any?(&)
21
+ @data.data.any?(&)
22
22
  end
23
23
 
24
- def all?(&block)
25
- @data.data.all?(&block)
24
+ def all?(&)
25
+ @data.data.all?(&)
26
26
  end
27
27
 
28
28
  # Returns an array of either none or integer values, indicating the
@@ -17,10 +17,10 @@ module DaruLite
17
17
  # v = DaruLite::Vector.new ["My first guitar", "jazz", "guitar"]
18
18
  # # Say you want to sort these strings by length.
19
19
  # v.sort(ascending: false) { |a,b| a.length <=> b.length }
20
- def sort(opts = {}, &block)
20
+ def sort(opts = {}, &)
21
21
  opts = { ascending: true }.merge(opts)
22
22
 
23
- vector_index = resort_index(@data.each_with_index, opts, &block)
23
+ vector_index = resort_index(@data.each_with_index, opts, &)
24
24
  vector, index = vector_index.transpose
25
25
 
26
26
  index = @index.reorder index
@@ -68,8 +68,8 @@ module DaruLite
68
68
  # Just sort the data and get an Array in return using Enumerable#sort.
69
69
  # Non-destructive.
70
70
  # :nocov:
71
- def sorted_data(&block)
72
- @data.to_a.sort(&block)
71
+ def sorted_data(&)
72
+ @data.to_a.sort(&)
73
73
  end
74
74
  # :nocov:
75
75
 
@@ -413,7 +413,7 @@ module DaruLite
413
413
 
414
414
  "#<#{self.class}(#{size})#{':category' if category?}>\n" +
415
415
  Formatters::Table.format(
416
- to_a.lazy.map { |v| [v] },
416
+ to_a.lazy.zip,
417
417
  headers: @name && [@name],
418
418
  row_headers: row_headers,
419
419
  threshold: threshold,
@@ -508,7 +508,7 @@ module DaruLite
508
508
  DaruLite::DataFrame.new ps
509
509
  end
510
510
 
511
- DATE_REGEXP = /^(\d{2}-\d{2}-\d{4}|\d{4}-\d{2}-\d{2})$/.freeze
511
+ DATE_REGEXP = /^(\d{2}-\d{2}-\d{4}|\d{4}-\d{2}-\d{2})$/
512
512
 
513
513
  # Returns the database type for the vector, according to its content
514
514
  def db_type
@@ -563,10 +563,8 @@ module DaruLite
563
563
  dv
564
564
  end
565
565
 
566
- def method_missing(name, *args, &block)
567
- # FIXME: it is shamefully fragile. Should be either made stronger
568
- # (string/symbol dychotomy, informative errors) or removed totally. - zverok
569
- if name =~ /(.+)=/
566
+ def method_missing(name, *args, &)
567
+ if name =~ /^([^=]+)=/
570
568
  self[Regexp.last_match(1).to_sym] = args[0]
571
569
  elsif has_index?(name)
572
570
  self[name]
@@ -1,3 +1,3 @@
1
1
  module DaruLite
2
- VERSION = '0.1.3'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
data/spec/io/io_spec.rb CHANGED
@@ -175,22 +175,6 @@ describe DaruLite::IO do
175
175
  context ".from_sql" do
176
176
  include_context 'with accounts table in sqlite3 database'
177
177
 
178
- context 'with a database handler of DBI' do
179
- let(:db) do
180
- DBI.connect("DBI:SQLite3:#{db_name}")
181
- end
182
-
183
- subject { DaruLite::DataFrame.from_sql(db, "select * from accounts") }
184
-
185
- it "loads data from an SQL database" do
186
- accounts = subject
187
- expect(accounts.class).to eq DaruLite::DataFrame
188
- expect(accounts.nrows).to eq 2
189
- expect(accounts.row[0][:id]).to eq 1
190
- expect(accounts.row[0][:name]).to eq "Homer"
191
- end
192
- end
193
-
194
178
  context 'with a database connection of ActiveRecord' do
195
179
  let(:connection) do
196
180
  DaruLite::RSpec::Account.establish_connection "sqlite3:#{db_name}"
@@ -1,6 +1,5 @@
1
1
  require 'daru_lite/io/sql_data_source'
2
2
  require 'sqlite3'
3
- require 'dbi'
4
3
  require 'active_record'
5
4
 
6
5
  RSpec.describe DaruLite::IO::SqlDataSource do
@@ -18,13 +17,6 @@ RSpec.describe DaruLite::IO::SqlDataSource do
18
17
  describe '.make_dataframe' do
19
18
  subject(:df) { DaruLite::IO::SqlDataSource.make_dataframe(source, query) }
20
19
 
21
- context 'with DBI::DatabaseHandle' do
22
- let(:source) { DBI.connect("DBI:SQLite3:#{db_name}") }
23
- it { is_expected.to be_a(DaruLite::DataFrame) }
24
- it { expect(df.row[0]).to have_attributes(id: 1, age: 20) }
25
- its(:nrows) { is_expected.to eq 2 }
26
- end
27
-
28
20
  context 'with ActiveRecord::Connection' do
29
21
  it { is_expected.to be_a(DaruLite::DataFrame) }
30
22
  it { expect(df.row[0]).to have_attributes(id: 1, age: 20) }
data/spec/spec_helper.rb CHANGED
@@ -3,9 +3,9 @@ require 'rspec/its'
3
3
  require 'rspec/expectations'
4
4
  require 'matrix'
5
5
  require 'awesome_print'
6
+ require 'debug'
6
7
  require 'distribution'
7
8
  require 'tempfile'
8
- require 'pry-byebug'
9
9
  require 'nokogiri'
10
10
  require 'webmock/rspec'
11
11
 
@@ -1,5 +1,4 @@
1
1
  require 'sqlite3'
2
- require 'dbi'
3
2
  require 'active_record'
4
3
 
5
4
  module DaruLite::RSpec
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: daru_lite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Naude-Filonnière
@@ -9,10 +9,9 @@ authors:
9
9
  - Julie Thomas
10
10
  - Amar Slaoua
11
11
  - Mourtada Belhantri
12
- autorequire:
13
12
  bindir: bin
14
13
  cert_chain: []
15
- date: 2024-09-09 00:00:00.000000000 Z
14
+ date: 1980-01-02 00:00:00.000000000 Z
16
15
  dependencies:
17
16
  - !ruby/object:Gem::Dependency
18
17
  name: activerecord
@@ -20,14 +19,14 @@ dependencies:
20
19
  requirements:
21
20
  - - "~>"
22
21
  - !ruby/object:Gem::Version
23
- version: '6.0'
22
+ version: '8.0'
24
23
  type: :development
25
24
  prerelease: false
26
25
  version_requirements: !ruby/object:Gem::Requirement
27
26
  requirements:
28
27
  - - "~>"
29
28
  - !ruby/object:Gem::Version
30
- version: '6.0'
29
+ version: '8.0'
31
30
  - !ruby/object:Gem::Dependency
32
31
  name: awesome_print
33
32
  requirement: !ruby/object:Gem::Requirement
@@ -48,48 +47,42 @@ dependencies:
48
47
  requirements:
49
48
  - - "~>"
50
49
  - !ruby/object:Gem::Version
51
- version: '2.1'
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: 2.1.4
50
+ version: '2.6'
55
51
  type: :development
56
52
  prerelease: false
57
53
  version_requirements: !ruby/object:Gem::Requirement
58
54
  requirements:
59
55
  - - "~>"
60
56
  - !ruby/object:Gem::Version
61
- version: '2.1'
62
- - - ">="
63
- - !ruby/object:Gem::Version
64
- version: 2.1.4
57
+ version: '2.6'
65
58
  - !ruby/object:Gem::Dependency
66
- name: dbd-sqlite3
59
+ name: csv
67
60
  requirement: !ruby/object:Gem::Requirement
68
61
  requirements:
69
62
  - - "~>"
70
63
  - !ruby/object:Gem::Version
71
- version: 1.2.5
64
+ version: 3.3.4
72
65
  type: :development
73
66
  prerelease: false
74
67
  version_requirements: !ruby/object:Gem::Requirement
75
68
  requirements:
76
69
  - - "~>"
77
70
  - !ruby/object:Gem::Version
78
- version: 1.2.5
71
+ version: 3.3.4
79
72
  - !ruby/object:Gem::Dependency
80
- name: dbi
73
+ name: debug
81
74
  requirement: !ruby/object:Gem::Requirement
82
75
  requirements:
83
- - - "~>"
76
+ - - ">="
84
77
  - !ruby/object:Gem::Version
85
- version: 0.4.5
78
+ version: 1.0.0
86
79
  type: :development
87
80
  prerelease: false
88
81
  version_requirements: !ruby/object:Gem::Requirement
89
82
  requirements:
90
- - - "~>"
83
+ - - ">="
91
84
  - !ruby/object:Gem::Version
92
- version: 0.4.5
85
+ version: 1.0.0
93
86
  - !ruby/object:Gem::Dependency
94
87
  name: distribution
95
88
  requirement: !ruby/object:Gem::Requirement
@@ -124,14 +117,14 @@ dependencies:
124
117
  requirements:
125
118
  - - "~>"
126
119
  - !ruby/object:Gem::Version
127
- version: 1.16.2
120
+ version: 1.18.0
128
121
  type: :development
129
122
  prerelease: false
130
123
  version_requirements: !ruby/object:Gem::Requirement
131
124
  requirements:
132
125
  - - "~>"
133
126
  - !ruby/object:Gem::Version
134
- version: 1.16.2
127
+ version: 1.18.0
135
128
  - !ruby/object:Gem::Dependency
136
129
  name: prime
137
130
  requirement: !ruby/object:Gem::Requirement
@@ -146,34 +139,6 @@ dependencies:
146
139
  - - "~>"
147
140
  - !ruby/object:Gem::Version
148
141
  version: 0.1.2
149
- - !ruby/object:Gem::Dependency
150
- name: pry
151
- requirement: !ruby/object:Gem::Requirement
152
- requirements:
153
- - - "~>"
154
- - !ruby/object:Gem::Version
155
- version: '0.14'
156
- type: :development
157
- prerelease: false
158
- version_requirements: !ruby/object:Gem::Requirement
159
- requirements:
160
- - - "~>"
161
- - !ruby/object:Gem::Version
162
- version: '0.14'
163
- - !ruby/object:Gem::Dependency
164
- name: pry-byebug
165
- requirement: !ruby/object:Gem::Requirement
166
- requirements:
167
- - - "~>"
168
- - !ruby/object:Gem::Version
169
- version: 3.10.1
170
- type: :development
171
- prerelease: false
172
- version_requirements: !ruby/object:Gem::Requirement
173
- requirements:
174
- - - "~>"
175
- - !ruby/object:Gem::Version
176
- version: 3.10.1
177
142
  - !ruby/object:Gem::Dependency
178
143
  name: rake
179
144
  requirement: !ruby/object:Gem::Requirement
@@ -208,14 +173,14 @@ dependencies:
208
173
  requirements:
209
174
  - - "~>"
210
175
  - !ruby/object:Gem::Version
211
- version: 1.3.0
176
+ version: 2.0.0
212
177
  type: :development
213
178
  prerelease: false
214
179
  version_requirements: !ruby/object:Gem::Requirement
215
180
  requirements:
216
181
  - - "~>"
217
182
  - !ruby/object:Gem::Version
218
- version: 1.3.0
183
+ version: 2.0.0
219
184
  - !ruby/object:Gem::Dependency
220
185
  name: rubocop
221
186
  requirement: !ruby/object:Gem::Requirement
@@ -236,28 +201,28 @@ dependencies:
236
201
  requirements:
237
202
  - - "~>"
238
203
  - !ruby/object:Gem::Version
239
- version: 1.20.2
204
+ version: 1.25.0
240
205
  type: :development
241
206
  prerelease: false
242
207
  version_requirements: !ruby/object:Gem::Requirement
243
208
  requirements:
244
209
  - - "~>"
245
210
  - !ruby/object:Gem::Version
246
- version: 1.20.2
211
+ version: 1.25.0
247
212
  - !ruby/object:Gem::Dependency
248
213
  name: rubocop-rspec
249
214
  requirement: !ruby/object:Gem::Requirement
250
215
  requirements:
251
216
  - - "~>"
252
217
  - !ruby/object:Gem::Version
253
- version: '2.25'
218
+ version: '3.6'
254
219
  type: :development
255
220
  prerelease: false
256
221
  version_requirements: !ruby/object:Gem::Requirement
257
222
  requirements:
258
223
  - - "~>"
259
224
  - !ruby/object:Gem::Version
260
- version: '2.25'
225
+ version: '3.6'
261
226
  - !ruby/object:Gem::Dependency
262
227
  name: ruby-prof
263
228
  requirement: !ruby/object:Gem::Requirement
@@ -320,28 +285,28 @@ dependencies:
320
285
  requirements:
321
286
  - - "~>"
322
287
  - !ruby/object:Gem::Version
323
- version: 1.7.2
288
+ version: 2.6.0
324
289
  type: :development
325
290
  prerelease: false
326
291
  version_requirements: !ruby/object:Gem::Requirement
327
292
  requirements:
328
293
  - - "~>"
329
294
  - !ruby/object:Gem::Version
330
- version: 1.7.2
295
+ version: 2.6.0
331
296
  - !ruby/object:Gem::Dependency
332
297
  name: webmock
333
298
  requirement: !ruby/object:Gem::Requirement
334
299
  requirements:
335
300
  - - "~>"
336
301
  - !ruby/object:Gem::Version
337
- version: 3.20.0
302
+ version: 3.25.0
338
303
  type: :development
339
304
  prerelease: false
340
305
  version_requirements: !ruby/object:Gem::Requirement
341
306
  requirements:
342
307
  - - "~>"
343
308
  - !ruby/object:Gem::Version
344
- version: 3.20.0
309
+ version: 3.25.0
345
310
  description: |
346
311
  Daru (Data Analysis in RUby) is a library for analysis, manipulation and visualization
347
312
  of data. Daru works seamlessly accross interpreters and leverages interpreter-specific
@@ -351,13 +316,13 @@ description: |
351
316
  and can be used with many others like mixed_models, gnuplotrb and iruby.
352
317
 
353
318
  Daru Lite is a fork of Daru that aims to focus on data manipulation and stability.
354
- email:
355
319
  executables: []
356
320
  extensions: []
357
321
  extra_rdoc_files: []
358
322
  files:
359
323
  - ".github/ISSUE_TEMPLATE/bug_report.md"
360
324
  - ".github/ISSUE_TEMPLATE/feature_request.md"
325
+ - ".github/dependabot.yml"
361
326
  - ".github/workflows/ci.yml"
362
327
  - ".gitignore"
363
328
  - ".rspec"
@@ -386,6 +351,8 @@ files:
386
351
  - benchmarks/where_clause.rb
387
352
  - benchmarks/where_vs_filter.rb
388
353
  - daru_lite.gemspec
354
+ - daru_lite_test-shm
355
+ - daru_lite_test-wal
389
356
  - images/README.md
390
357
  - images/con0.png
391
358
  - images/con1.png
@@ -564,7 +531,6 @@ homepage: https://github.com/pollandroll/daru
564
531
  licenses:
565
532
  - BSD-2-Clause
566
533
  metadata: {}
567
- post_install_message:
568
534
  rdoc_options: []
569
535
  require_paths:
570
536
  - lib
@@ -579,8 +545,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
579
545
  - !ruby/object:Gem::Version
580
546
  version: '0'
581
547
  requirements: []
582
- rubygems_version: 3.5.6
583
- signing_key:
548
+ rubygems_version: 3.6.8
584
549
  specification_version: 4
585
550
  summary: Data Analysis in RUby, stripped down
586
551
  test_files: