active_recall 1.6.3 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e993b98e9627ec06e8eae73c3fba15a6ed761b66dbb1092b1355140cb2bd366
4
- data.tar.gz: 5402a3ae205e52b20587ab73a5d819eaf7102dea5d52cf983e4be5beddf5279d
3
+ metadata.gz: 06e8582ffde66de89e30751aa0f170dfd77d83f4d3e14e200aec66b3acb48683
4
+ data.tar.gz: 80614546c9e7235846cd580bb76ab7aebea90945e35d484a4e50ab6f87a7bb4f
5
5
  SHA512:
6
- metadata.gz: aba48fb3870fd48fba35a371b48ceeaad4fb306acef718175f67451ee25111ec6389faaf0c52d9424ad1b87da94faf1c24b66f32f920392fa4b7e68ebbb27699
7
- data.tar.gz: 2c9c4651bd1e4ac541ffb4c258e899bf311cd84ec6cc4490b643ef1a27bc236c9820e5e30b5af22ee4673413dfad5e0bacbdbcd7344494c9df2059e3472fee17
6
+ metadata.gz: e68952e966e9201f32ecc43ba64984273ba5bb0cf741eedf3b9c8625c9a55829bfe19f3fc0e3ea6b333354a38cc053d3ea89272b6f0e1ea340d7eb84e12bdc0d
7
+ data.tar.gz: ed5fb58e109bc17333a7e4484b22f55e76eaf77c5f81513168613f834418c19bc9cc4d5de5e1a3889bc1fd1120a9c4c443c228ba727b060594a97fde0ac8e893
@@ -19,8 +19,6 @@ jobs:
19
19
  - macos
20
20
  - ubuntu
21
21
  ruby:
22
- - 2.5
23
- - 2.6
24
22
  - 2.7
25
23
  - 3.0
26
24
  allow_failures:
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.0.2
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source 'https://rubygems.org'
3
+ source "https://rubygems.org"
4
4
 
5
5
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
6
 
data/Gemfile.lock CHANGED
@@ -1,29 +1,28 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_recall (1.6.3)
5
- activerecord (>= 5.2.3, <= 6.2)
6
- activesupport (>= 5.2.3, <= 6.2)
4
+ active_recall (1.8.0)
5
+ activerecord (>= 5.2.3, <= 7.1)
6
+ activesupport (>= 5.2.3, <= 7.1)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- activemodel (6.1.4)
12
- activesupport (= 6.1.4)
13
- activerecord (6.1.4)
14
- activemodel (= 6.1.4)
15
- activesupport (= 6.1.4)
16
- activesupport (6.1.4)
11
+ activemodel (7.0.4.3)
12
+ activesupport (= 7.0.4.3)
13
+ activerecord (7.0.4.3)
14
+ activemodel (= 7.0.4.3)
15
+ activesupport (= 7.0.4.3)
16
+ activesupport (7.0.4.3)
17
17
  concurrent-ruby (~> 1.0, >= 1.0.2)
18
18
  i18n (>= 1.6, < 2)
19
19
  minitest (>= 5.1)
20
20
  tzinfo (~> 2.0)
21
- zeitwerk (~> 2.3)
22
- concurrent-ruby (1.1.9)
21
+ concurrent-ruby (1.2.2)
23
22
  diff-lcs (1.3)
24
- i18n (1.8.10)
23
+ i18n (1.12.0)
25
24
  concurrent-ruby (~> 1.0)
26
- minitest (5.14.4)
25
+ minitest (5.18.0)
27
26
  rake (12.3.3)
28
27
  rdoc (6.2.0)
29
28
  rspec (3.8.0)
@@ -40,9 +39,8 @@ GEM
40
39
  rspec-support (~> 3.8.0)
41
40
  rspec-support (3.8.2)
42
41
  sqlite3 (1.4.2)
43
- tzinfo (2.0.4)
42
+ tzinfo (2.0.6)
44
43
  concurrent-ruby (~> 1.0)
45
- zeitwerk (2.4.2)
46
44
 
47
45
  PLATFORMS
48
46
  ruby
@@ -55,4 +53,4 @@ DEPENDENCIES
55
53
  sqlite3
56
54
 
57
55
  BUNDLED WITH
58
- 2.2.3
56
+ 2.2.22
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler/gem_tasks'
4
- require 'rspec/core/rake_task'
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
5
 
6
6
  RSpec::Core::RakeTask.new(:spec)
7
7
 
@@ -1,26 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path('lib', __dir__)
3
+ lib = File.expand_path("lib", __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'active_recall/version'
5
+ require "active_recall/version"
6
6
 
7
7
  Gem::Specification.new do |spec|
8
- spec.name = 'active_recall'
9
- spec.version = ActiveRecall::VERSION
10
- spec.authors = ['Robert Gravina', 'Jayson Virissimo']
11
- spec.email = ['robert.gravina@gmail.com', 'jayson.virissimo@asu.edu']
12
- spec.summary = 'A spaced-repetition system'
13
- spec.description = 'A spaced-repetition system to be used with ActiveRecord models'
14
- spec.homepage = 'https://github.com/jaysonvirissimo/active_recall'
15
- spec.license = 'MIT'
8
+ spec.name = "active_recall"
9
+ spec.version = ActiveRecall::VERSION
10
+ spec.authors = ["Robert Gravina", "Jayson Virissimo"]
11
+ spec.email = ["robert.gravina@gmail.com", "jayson.virissimo@asu.edu"]
12
+ spec.summary = "A spaced-repetition system"
13
+ spec.description = "A spaced-repetition system to be used with ActiveRecord models"
14
+ spec.homepage = "https://github.com/jaysonvirissimo/active_recall"
15
+ spec.license = "MIT"
16
16
 
17
17
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
18
  # to allow pushing to a single host or delete this section to allow pushing to any host.
19
19
  if spec.respond_to?(:metadata)
20
- spec.metadata['allowed_push_host'] = 'https://rubygems.org/'
20
+ spec.metadata["allowed_push_host"] = "https://rubygems.org/"
21
21
  else
22
- raise 'RubyGems 2.0 or newer is required to protect against ' \
23
- 'public gem pushes.'
22
+ raise "RubyGems 2.0 or newer is required to protect against " \
23
+ "public gem pushes."
24
24
  end
25
25
 
26
26
  # Specify which files should be added to the gem when it is released.
@@ -28,14 +28,15 @@ Gem::Specification.new do |spec|
28
28
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
29
29
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
30
30
  end
31
- spec.bindir = 'exe'
32
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
- spec.require_paths = ['lib']
31
+ spec.bindir = "exe"
32
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
+ spec.require_paths = ["lib"]
34
34
 
35
- spec.add_development_dependency 'rake', '>= 12.0'
36
- spec.add_development_dependency 'rdoc'
37
- spec.add_development_dependency 'rspec', '>= 3.0'
38
- spec.add_development_dependency 'sqlite3'
39
- spec.add_runtime_dependency 'activerecord', '>= 5.2.3', '<= 6.2'
40
- spec.add_runtime_dependency 'activesupport', '>= 5.2.3', '<= 6.2'
35
+ spec.add_development_dependency "rake", ">= 12.0"
36
+ spec.add_development_dependency "rdoc"
37
+ spec.add_development_dependency "rspec", ">= 3.0"
38
+ spec.add_development_dependency "sqlite3"
39
+ spec.add_runtime_dependency "activerecord", ">= 5.2.3", "<= 7.1"
40
+ spec.add_runtime_dependency "activesupport", ">= 5.2.3", "<= 7.1"
41
+ spec.required_ruby_version = ">= 2.6"
41
42
  end
data/bin/setup CHANGED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
@@ -4,9 +4,9 @@ module ActiveRecall
4
4
  class Deck < ActiveRecord::Base
5
5
  include Enumerable
6
6
  include ActiveRecall::Base
7
- self.table_name = 'active_recall_decks'
7
+ self.table_name = "active_recall_decks"
8
8
  belongs_to :user, polymorphic: true
9
- has_many :items, class_name: 'ActiveRecall::Item', dependent: :destroy
9
+ has_many :items, class_name: "ActiveRecall::Item", dependent: :destroy
10
10
 
11
11
  def each
12
12
  _items.each do |item|
@@ -27,7 +27,7 @@ module ActiveRecall
27
27
  end
28
28
 
29
29
  def <<(source)
30
- raise ArgumentError, 'Word already in the stack' if include?(source)
30
+ raise ArgumentError, "Word already in the stack" if include?(source)
31
31
 
32
32
  items << ActiveRecall::Item.new(deck: self, source_id: source.id, source_type: source.class.name)
33
33
  end
@@ -42,41 +42,32 @@ module ActiveRecall
42
42
  .destroy
43
43
  end
44
44
 
45
- # OPTIMIZE: Attempt in active record, rather than array of Ruby records
46
45
  def review
47
- %i[untested failed expired].inject([]) do |words, s|
48
- words += items.send(s).order(random_order_function).map(&:source)
49
- end
46
+ source_class.where(id: _review.select(:source_id))
50
47
  end
51
48
 
52
- # OPTIMIZE: Use optimized #review and build only the record to be returned
53
49
  def next
54
- word = nil
55
- %i[untested failed expired].each do |category|
56
- word = items.send(category).order(random_order_function).limit(1).map(&:source).first
57
- break if word
58
- end
59
- word
50
+ _review.first.try(:source)
60
51
  end
61
52
 
62
53
  def last
63
- items.order('created_at desc').limit(1).first.try(:source)
54
+ items.order("created_at desc").limit(1).first.try(:source)
64
55
  end
65
56
 
66
57
  def untested
67
- source_class.find(items.untested.pluck(:source_id))
58
+ source_class.where(id: items.untested.select(:source_id))
68
59
  end
69
60
 
70
61
  def failed
71
- source_class.find(items.failed.pluck(:source_id))
62
+ source_class.where(id: items.failed.select(:source_id))
72
63
  end
73
64
 
74
65
  def known
75
- source_class.find(items.known.pluck(:source_id))
66
+ source_class.where(id: items.known.select(:source_id))
76
67
  end
77
68
 
78
69
  def expired
79
- source_class.find(items.expired.pluck(:source_id))
70
+ source_class.where(id: items.expired.select(:source_id))
80
71
  end
81
72
 
82
73
  def box(number)
@@ -89,12 +80,20 @@ module ActiveRecall
89
80
 
90
81
  private
91
82
 
83
+ def _review
84
+ items
85
+ .untested
86
+ .or(items.failed)
87
+ .or(items.expired)
88
+ .order(random_order_function)
89
+ end
90
+
92
91
  def random_order_function
93
- Arel.sql(mysql? ? 'RAND()' : 'random()')
92
+ Arel.sql(mysql? ? "RAND()" : "random()")
94
93
  end
95
94
 
96
95
  def mysql?
97
- source_class.connection.adapter_name == 'Mysql2'
96
+ source_class.connection.adapter_name == "Mysql2"
98
97
  end
99
98
  end
100
99
  end
@@ -2,19 +2,19 @@
2
2
 
3
3
  module ActiveRecall
4
4
  class Item < ActiveRecord::Base
5
- self.table_name = 'active_recall_items'
5
+ self.table_name = "active_recall_items"
6
6
 
7
7
  belongs_to :deck
8
8
 
9
- scope :failed, -> { where(['box = ? and last_reviewed is not null', 0]) }
10
- scope :untested, -> { where(['box = ? and last_reviewed is null', 0]) }
9
+ scope :failed, -> { where(["box = ? and last_reviewed is not null", 0]) }
10
+ scope :untested, -> { where(["box = ? and last_reviewed is null", 0]) }
11
11
 
12
12
  def self.expired(current_time: Time.current)
13
- where(['box > ? and next_review <= ?', 0, current_time])
13
+ where(["box > ? and next_review <= ?", 0, current_time])
14
14
  end
15
15
 
16
16
  def self.known(current_time: Time.current)
17
- where(['box > ? and next_review > ?', 0, current_time])
17
+ where(["box > ? and next_review > ?", 0, current_time])
18
18
  end
19
19
 
20
20
  def source
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecall
4
- VERSION = '1.6.3'
4
+ VERSION = "1.8.0"
5
5
  end
data/lib/active_recall.rb CHANGED
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_recall/base'
4
- require 'active_recall/deck_methods'
5
- require 'active_recall/item_methods'
6
- require 'active_recall/algorithms/fibonacci_sequence'
7
- require 'active_recall/algorithms/leitner_system'
8
- require 'active_recall/configuration'
9
- require 'active_recall/models/deck'
10
- require 'active_recall/models/item'
11
- require 'active_recall/version'
3
+ require "active_recall/base"
4
+ require "active_recall/deck_methods"
5
+ require "active_recall/item_methods"
6
+ require "active_recall/algorithms/fibonacci_sequence"
7
+ require "active_recall/algorithms/leitner_system"
8
+ require "active_recall/configuration"
9
+ require "active_recall/models/deck"
10
+ require "active_recall/models/item"
11
+ require "active_recall/version"
12
12
 
13
13
  ActiveRecord::Base.include ActiveRecall::Base
14
14
 
@@ -1,26 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails/generators'
4
- require 'rails/generators/migration'
5
- require 'rails/generators/active_record'
3
+ require "rails/generators"
4
+ require "rails/generators/migration"
5
+ require "rails/generators/active_record"
6
6
 
7
7
  class ActiveRecallGenerator < Rails::Generators::Base
8
8
  include Rails::Generators::Migration
9
9
 
10
10
  class_option :migrate_data, type: :boolean, default: false
11
11
 
12
- desc 'Creates migration files required by the active_recall spaced repetition gem.'
12
+ desc "Creates migration files required by the active_recall spaced repetition gem."
13
13
 
14
- source_paths << File.join(File.dirname(__FILE__), 'templates')
14
+ source_paths << File.join(File.dirname(__FILE__), "templates")
15
15
 
16
16
  def self.next_migration_number(path)
17
17
  ActiveRecord::Generators::Base.next_migration_number(path)
18
18
  end
19
19
 
20
20
  def create_migration_files
21
- create_migration_file_if_not_exist 'create_active_recall_tables'
22
- create_migration_file_if_not_exist 'add_active_recall_item_answer_counts'
23
- create_migration_file_if_not_exist 'migrate_okubo_to_active_recall' if options['migrate_data']
21
+ create_migration_file_if_not_exist "create_active_recall_tables"
22
+ create_migration_file_if_not_exist "add_active_recall_item_answer_counts"
23
+ create_migration_file_if_not_exist "migrate_okubo_to_active_recall" if options["migrate_data"]
24
24
  end
25
25
 
26
26
  private
@@ -9,11 +9,11 @@ class CreateActiveRecallTables < ActiveRecord::Migration[5.2]
9
9
  add_index :active_recall_decks, %i[user_id user_type]
10
10
 
11
11
  create_table :active_recall_items do |t|
12
- t.references :deck
13
- t.references :source, polymorphic: true
14
- t.integer :box, default: 0
15
- t.timestamp :last_reviewed
16
- t.timestamp :next_review
12
+ t.references :deck
13
+ t.references :source, polymorphic: true
14
+ t.integer :box, default: 0
15
+ t.timestamp :last_reviewed
16
+ t.timestamp :next_review
17
17
  t.timestamps
18
18
  end
19
19
  add_index :active_recall_items, %i[source_id source_type]
@@ -17,8 +17,8 @@ class MigrateOkuboToActiveRecall < ActiveRecord::Migration[5.2]
17
17
  deck_attributes[:id] == item_attributes[:deck_id]
18
18
  end.each do |item_attributes|
19
19
  item_create_attributes = item_attributes
20
- .except(:id, :created_at, :updated_at)
21
- .merge(deck_id: deck.id)
20
+ .except(:id, :created_at, :updated_at)
21
+ .merge(deck_id: deck.id)
22
22
  ActiveRecall::Item.create!(item_create_attributes)
23
23
  end
24
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_recall
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.3
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Gravina
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2021-08-12 00:00:00.000000000 Z
12
+ date: 2023-03-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: 5.2.3
77
77
  - - "<="
78
78
  - !ruby/object:Gem::Version
79
- version: '6.2'
79
+ version: '7.1'
80
80
  type: :runtime
81
81
  prerelease: false
82
82
  version_requirements: !ruby/object:Gem::Requirement
@@ -86,7 +86,7 @@ dependencies:
86
86
  version: 5.2.3
87
87
  - - "<="
88
88
  - !ruby/object:Gem::Version
89
- version: '6.2'
89
+ version: '7.1'
90
90
  - !ruby/object:Gem::Dependency
91
91
  name: activesupport
92
92
  requirement: !ruby/object:Gem::Requirement
@@ -96,7 +96,7 @@ dependencies:
96
96
  version: 5.2.3
97
97
  - - "<="
98
98
  - !ruby/object:Gem::Version
99
- version: '6.2'
99
+ version: '7.1'
100
100
  type: :runtime
101
101
  prerelease: false
102
102
  version_requirements: !ruby/object:Gem::Requirement
@@ -106,7 +106,7 @@ dependencies:
106
106
  version: 5.2.3
107
107
  - - "<="
108
108
  - !ruby/object:Gem::Version
109
- version: '6.2'
109
+ version: '7.1'
110
110
  description: A spaced-repetition system to be used with ActiveRecord models
111
111
  email:
112
112
  - robert.gravina@gmail.com
@@ -118,14 +118,13 @@ files:
118
118
  - ".github/workflows/tests.yml"
119
119
  - ".gitignore"
120
120
  - ".rspec"
121
- - ".ruby-version"
121
+ - ".tool-versions"
122
122
  - Gemfile
123
123
  - Gemfile.lock
124
124
  - LICENSE
125
125
  - README.md
126
126
  - Rakefile
127
127
  - active_recall.gemspec
128
- - bin/console
129
128
  - bin/setup
130
129
  - lib/active_recall.rb
131
130
  - lib/active_recall/algorithms/fibonacci_sequence.rb
@@ -154,14 +153,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
154
153
  requirements:
155
154
  - - ">="
156
155
  - !ruby/object:Gem::Version
157
- version: '0'
156
+ version: '2.6'
158
157
  required_rubygems_version: !ruby/object:Gem::Requirement
159
158
  requirements:
160
159
  - - ">="
161
160
  - !ruby/object:Gem::Version
162
161
  version: '0'
163
162
  requirements: []
164
- rubygems_version: 3.2.3
163
+ rubygems_version: 3.3.5
165
164
  signing_key:
166
165
  specification_version: 4
167
166
  summary: A spaced-repetition system
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 3.0.0
data/bin/console DELETED
File without changes