active_recall 1.2.2 → 1.6.1

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: b83f978a503c9b2dc8d75c153fa4442b7b63534f1bbccbb5f18c5d38576e4f9e
4
- data.tar.gz: 55be412316a8b2f77854d235fa0e73994efc0463afe5e4c428f253f74e801efd
3
+ metadata.gz: cfa5de74ed9196b1484d8ff5829edae52adc82d7cec8c5c42b22f5c71abaae2b
4
+ data.tar.gz: 1e17d2f83a70bdbf4a5e0184bb89cb4f36aab98b94e0210dc9e32ce48b1769ba
5
5
  SHA512:
6
- metadata.gz: b8deb2e788b721c376f1ce28e49be2e17dc120fcb85cc3fd0eaeb7dd6cf6e4eb609c89766ceefd53e65bc0e8b28425337a09bc3fdedcf57800d295a126520252
7
- data.tar.gz: e7b826f752bed82704edc395214bacd80d5fd94e4fe828f8bad563aff8ad571551725d35d687c236f04f7d1930ea064f669a4b012c9e060700ffd1e0df381042
6
+ metadata.gz: 397d873582d9cd7b6591f1c2bf78888eddca83d7936020acb1d5b4d0b9ede6f9fa211b6a3b800ccb49de13c33c42e23d951bc2d3475e7870f5dd17b40f1d58f6
7
+ data.tar.gz: 234e542f97ca7f0454f362b59db98dec06c56ed7c93e0ae4654c48e788eb45f95466054ddc75d7862596eb24db2194d5771ff23283e0671523645242429dad88
@@ -0,0 +1,46 @@
1
+ name: Tests
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - master
7
+ push:
8
+ branches:
9
+ - master
10
+
11
+ jobs:
12
+ unit_tests:
13
+ name: Unit Tests
14
+ if: "contains(github.event.commits[0].message, '[ci skip]') == false"
15
+ strategy:
16
+ fail-fast: false
17
+ matrix:
18
+ os:
19
+ - macos
20
+ - ubuntu
21
+ ruby:
22
+ - 2.5
23
+ - 2.6
24
+ - 2.7
25
+ - 3.0
26
+ allow_failures:
27
+ - false
28
+ include:
29
+ - os: ubuntu
30
+ ruby: ruby-head
31
+ allow_failures: false
32
+ env:
33
+ BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
34
+ ALLOW_FAILURES: "${{ matrix.allow_failures }}"
35
+ runs-on: ${{ matrix.os }}-latest
36
+ continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }}
37
+ steps:
38
+ - name: Checkout
39
+ uses: actions/checkout@v2
40
+ - name: Setup Ruby
41
+ uses: ruby/setup-ruby@v1
42
+ with:
43
+ ruby-version: ${{ matrix.ruby }}
44
+ bundler-cache: true
45
+ - name: Test
46
+ run: bundle exec rake spec || $ALLOW_FAILURES
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.5.3
1
+ 3.0.0
data/Gemfile CHANGED
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  source 'https://rubygems.org'
4
- ruby '2.5.3'
5
4
 
6
5
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
7
6
 
data/Gemfile.lock CHANGED
@@ -1,30 +1,30 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_recall (1.2.2)
5
- activerecord (>= 5.2.3)
6
- activesupport (>= 5.2.3)
4
+ active_recall (1.6.1)
5
+ activerecord (>= 5.2.3, <= 6.1)
6
+ activesupport (>= 5.2.3, <= 6.1)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- activemodel (6.0.2.1)
12
- activesupport (= 6.0.2.1)
13
- activerecord (6.0.2.1)
14
- activemodel (= 6.0.2.1)
15
- activesupport (= 6.0.2.1)
16
- activesupport (6.0.2.1)
11
+ activemodel (6.1.0)
12
+ activesupport (= 6.1.0)
13
+ activerecord (6.1.0)
14
+ activemodel (= 6.1.0)
15
+ activesupport (= 6.1.0)
16
+ activesupport (6.1.0)
17
17
  concurrent-ruby (~> 1.0, >= 1.0.2)
18
- i18n (>= 0.7, < 2)
19
- minitest (~> 5.1)
20
- tzinfo (~> 1.1)
21
- zeitwerk (~> 2.2)
22
- concurrent-ruby (1.1.5)
18
+ i18n (>= 1.6, < 2)
19
+ minitest (>= 5.1)
20
+ tzinfo (~> 2.0)
21
+ zeitwerk (~> 2.3)
22
+ concurrent-ruby (1.1.8)
23
23
  diff-lcs (1.3)
24
- i18n (1.7.0)
24
+ i18n (1.8.9)
25
25
  concurrent-ruby (~> 1.0)
26
- minitest (5.13.0)
27
- rake (10.5.0)
26
+ minitest (5.14.4)
27
+ rake (12.3.3)
28
28
  rdoc (6.2.0)
29
29
  rspec (3.8.0)
30
30
  rspec-core (~> 3.8.0)
@@ -39,25 +39,20 @@ GEM
39
39
  diff-lcs (>= 1.2.0, < 2.0)
40
40
  rspec-support (~> 3.8.0)
41
41
  rspec-support (3.8.2)
42
- sqlite3 (1.4.1)
43
- thread_safe (0.3.6)
44
- tzinfo (1.2.6)
45
- thread_safe (~> 0.1)
46
- zeitwerk (2.2.2)
42
+ sqlite3 (1.4.2)
43
+ tzinfo (2.0.4)
44
+ concurrent-ruby (~> 1.0)
45
+ zeitwerk (2.4.2)
47
46
 
48
47
  PLATFORMS
49
48
  ruby
50
49
 
51
50
  DEPENDENCIES
52
51
  active_recall!
53
- bundler (>= 1.16)
54
- rake (~> 10.0)
52
+ rake (~> 12.0)
55
53
  rdoc
56
54
  rspec (~> 3.0)
57
55
  sqlite3
58
56
 
59
- RUBY VERSION
60
- ruby 2.5.3p105
61
-
62
57
  BUNDLED WITH
63
- 1.17.3
58
+ 2.2.3
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # ActiveRecall [![Build Status](https://travis-ci.org/jaysonvirissimo/active_recall.svg?branch=master)](https://travis-ci.org/jaysonvirissimo/active_recall)
1
+ # ActiveRecall
2
2
 
3
3
  **ActiveRecall** is a spaced-repetition system that allows you to treat arbitrary [ActiveRecord](https://github.com/rails/rails/tree/master/activerecord) models as if they were flashcards to be learned and reviewed.
4
4
  It it based on, and is intended to be backwards compatible with, the [okubo](https://github.com/rgravina/okubo) gem.
5
- The primary differentiating features are that it lets the user specify the scheduling algorithm and is fully compatible with Rails 6.
5
+ The primary differentiating features are that it lets the user specify the scheduling algorithm and is fully compatible with Rails 6.0 and Ruby 3.0.
6
6
 
7
7
  ## Installation
8
8
 
@@ -116,9 +116,12 @@ user.words.next #=> nil
116
116
 
117
117
  ## Development
118
118
 
119
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
119
+ After checking out the repo, run `bin/setup` to install dependencies.
120
+ Then, run `rake spec` to run the tests.
121
+ You can also run `bin/console` for an interactive prompt that will allow you to experiment.
120
122
 
121
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
123
+ To install this gem onto your local machine, run `bundle exec rake install`.
124
+ To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
122
125
 
123
126
  ## Contributing
124
127
 
@@ -32,11 +32,10 @@ Gem::Specification.new do |spec|
32
32
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
33
  spec.require_paths = ['lib']
34
34
 
35
- spec.add_development_dependency 'bundler', '>= 1.16'
36
- spec.add_development_dependency 'rake', '~> 10.0'
35
+ spec.add_development_dependency 'rake', '~> 12.0'
37
36
  spec.add_development_dependency 'rdoc'
38
37
  spec.add_development_dependency 'rspec', '~> 3.0'
39
38
  spec.add_development_dependency 'sqlite3'
40
- spec.add_runtime_dependency 'activerecord', '>= 5.2.3'
41
- spec.add_runtime_dependency 'activesupport', '>= 5.2.3'
39
+ spec.add_runtime_dependency 'activerecord', '>= 5.2.3', '<= 6.1'
40
+ spec.add_runtime_dependency 'activesupport', '>= 5.2.3', '<= 6.1'
42
41
  end
data/lib/active_recall.rb CHANGED
@@ -10,7 +10,7 @@ require 'active_recall/models/deck'
10
10
  require 'active_recall/models/item'
11
11
  require 'active_recall/version'
12
12
 
13
- ActiveRecord::Base.send(:include, ActiveRecall::Base)
13
+ ActiveRecord::Base.include ActiveRecall::Base
14
14
 
15
15
  module ActiveRecall
16
16
  class << self
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ActiveRecall
4
4
  class FibonacciSequence
5
- def self.right(box:, current_time: Time.current, times_right:, times_wrong:)
5
+ def self.right(box:, times_right:, times_wrong:, current_time: Time.current)
6
6
  new(
7
7
  box: box,
8
8
  current_time: current_time,
@@ -11,7 +11,7 @@ module ActiveRecall
11
11
  ).right
12
12
  end
13
13
 
14
- def self.wrong(box:, current_time: Time.current, times_right:, times_wrong:)
14
+ def self.wrong(box:, times_right:, times_wrong:, current_time: Time.current)
15
15
  new(
16
16
  box: box,
17
17
  current_time: current_time,
@@ -20,7 +20,7 @@ module ActiveRecall
20
20
  ).wrong
21
21
  end
22
22
 
23
- def initialize(box:, current_time: Time.current, times_right:, times_wrong:)
23
+ def initialize(box:, times_right:, times_wrong:, current_time: Time.current)
24
24
  @box = box
25
25
  @current_time = current_time
26
26
  @times_right = times_right
@@ -4,7 +4,7 @@ module ActiveRecall
4
4
  class LeitnerSystem
5
5
  DELAYS = [3, 7, 14, 30, 60, 120, 240].freeze
6
6
 
7
- def self.right(box:, current_time: Time.current, times_right:, times_wrong:)
7
+ def self.right(box:, times_right:, times_wrong:, current_time: Time.current)
8
8
  new(
9
9
  box: box,
10
10
  current_time: current_time,
@@ -13,7 +13,7 @@ module ActiveRecall
13
13
  ).right
14
14
  end
15
15
 
16
- def self.wrong(box:, current_time: Time.current, times_right:, times_wrong:)
16
+ def self.wrong(box:, times_right:, times_wrong:, current_time: Time.current)
17
17
  new(
18
18
  box: box,
19
19
  current_time: current_time,
@@ -22,7 +22,7 @@ module ActiveRecall
22
22
  ).wrong
23
23
  end
24
24
 
25
- def initialize(box:, current_time: Time.current, times_right:, times_wrong:)
25
+ def initialize(box:, times_right:, times_wrong:, current_time: Time.current)
26
26
  @box = box
27
27
  @current_time = current_time
28
28
  @times_right = times_right
@@ -3,10 +3,10 @@
3
3
  module ActiveRecall
4
4
  module DeckMethods
5
5
  def deck
6
- d = ActiveRecall::Deck.where(user_id: id, user_type: self.class.name).first_or_create
6
+ d = ActiveRecall::Deck.find_or_create_by(user_id: id, user_type: self.class.name)
7
7
  d.source_class.module_eval do
8
8
  def stats
9
- ActiveRecall::Item.where(source_id: id, source_type: self.class.name).first
9
+ ActiveRecall::Item.find_by(source_id: id, source_type: self.class.name)
10
10
  end
11
11
  end
12
12
  d
@@ -3,15 +3,11 @@
3
3
  module ActiveRecall
4
4
  module ItemMethods
5
5
  def right_answer_for!(item)
6
- i = deck.items.where(source_id: item.id).first
7
- i.right!
8
- i.save!
6
+ deck.items.find_by(source_id: item.id).right!
9
7
  end
10
8
 
11
9
  def wrong_answer_for!(item)
12
- i = deck.items.where(source_id: item.id).first
13
- i.wrong!
14
- i.save!
10
+ deck.items.find_by(source_id: item.id).wrong!
15
11
  end
16
12
  end
17
13
  end
@@ -37,16 +37,19 @@ module ActiveRecall
37
37
  end
38
38
 
39
39
  def delete(source)
40
- item = ActiveRecall::Item.new(deck: self, source_id: source.id, source_type: source.class.name)
41
- item.destroy
40
+ ActiveRecall::Item
41
+ .find_by(deck: self, source_id: source.id, source_type: source.class.name)
42
+ .destroy
42
43
  end
43
44
 
45
+ # OPTIMIZE: Attempt in active record, rather than array of Ruby records
44
46
  def review
45
47
  %i[untested failed expired].inject([]) do |words, s|
46
48
  words += items.send(s).order(random_order_function).map(&:source)
47
49
  end
48
50
  end
49
51
 
52
+ # OPTIMIZE: Use optimized #review and build only the record to be returned
50
53
  def next
51
54
  word = nil
52
55
  %i[untested failed expired].each do |category|
@@ -5,7 +5,6 @@ module ActiveRecall
5
5
  self.table_name = 'active_recall_items'
6
6
 
7
7
  belongs_to :deck
8
- belongs_to :source, polymorphic: true
9
8
 
10
9
  scope :failed, -> { where(['box = ? and last_reviewed is not null', 0]) }
11
10
  scope :untested, -> { where(['box = ? and last_reviewed is null', 0]) }
@@ -18,12 +17,16 @@ module ActiveRecall
18
17
  where(['box > ? and next_review > ?', 0, current_time])
19
18
  end
20
19
 
20
+ def source
21
+ source_type.constantize.find(source_id)
22
+ end
23
+
21
24
  def right!
22
- update!(algorithm_class.right(scoring_attributes))
25
+ update!(algorithm_class.right(**scoring_attributes))
23
26
  end
24
27
 
25
28
  def wrong!
26
- update!(algorithm_class.wrong(scoring_attributes))
29
+ update!(algorithm_class.wrong(**scoring_attributes))
27
30
  end
28
31
 
29
32
  private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecall
4
- VERSION = '1.2.2'
4
+ VERSION = '1.6.1'
5
5
  end
@@ -20,9 +20,7 @@ class ActiveRecallGenerator < Rails::Generators::Base
20
20
  def create_migration_files
21
21
  create_migration_file_if_not_exist 'create_active_recall_tables'
22
22
  create_migration_file_if_not_exist 'add_active_recall_item_answer_counts'
23
- if options['migrate_data']
24
- create_migration_file_if_not_exist 'migrate_okubo_to_active_recall'
25
- end
23
+ create_migration_file_if_not_exist 'migrate_okubo_to_active_recall' if options['migrate_data']
26
24
  end
27
25
 
28
26
  private
metadata CHANGED
@@ -1,44 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_recall
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Gravina
8
8
  - Jayson Virissimo
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-01-02 00:00:00.000000000 Z
12
+ date: 2021-02-28 00:00:00.000000000 Z
13
13
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: bundler
16
- requirement: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - ">="
19
- - !ruby/object:Gem::Version
20
- version: '1.16'
21
- type: :development
22
- prerelease: false
23
- version_requirements: !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- version: '1.16'
28
14
  - !ruby/object:Gem::Dependency
29
15
  name: rake
30
16
  requirement: !ruby/object:Gem::Requirement
31
17
  requirements:
32
18
  - - "~>"
33
19
  - !ruby/object:Gem::Version
34
- version: '10.0'
20
+ version: '12.0'
35
21
  type: :development
36
22
  prerelease: false
37
23
  version_requirements: !ruby/object:Gem::Requirement
38
24
  requirements:
39
25
  - - "~>"
40
26
  - !ruby/object:Gem::Version
41
- version: '10.0'
27
+ version: '12.0'
42
28
  - !ruby/object:Gem::Dependency
43
29
  name: rdoc
44
30
  requirement: !ruby/object:Gem::Requirement
@@ -88,6 +74,9 @@ dependencies:
88
74
  - - ">="
89
75
  - !ruby/object:Gem::Version
90
76
  version: 5.2.3
77
+ - - "<="
78
+ - !ruby/object:Gem::Version
79
+ version: '6.1'
91
80
  type: :runtime
92
81
  prerelease: false
93
82
  version_requirements: !ruby/object:Gem::Requirement
@@ -95,6 +84,9 @@ dependencies:
95
84
  - - ">="
96
85
  - !ruby/object:Gem::Version
97
86
  version: 5.2.3
87
+ - - "<="
88
+ - !ruby/object:Gem::Version
89
+ version: '6.1'
98
90
  - !ruby/object:Gem::Dependency
99
91
  name: activesupport
100
92
  requirement: !ruby/object:Gem::Requirement
@@ -102,6 +94,9 @@ dependencies:
102
94
  - - ">="
103
95
  - !ruby/object:Gem::Version
104
96
  version: 5.2.3
97
+ - - "<="
98
+ - !ruby/object:Gem::Version
99
+ version: '6.1'
105
100
  type: :runtime
106
101
  prerelease: false
107
102
  version_requirements: !ruby/object:Gem::Requirement
@@ -109,6 +104,9 @@ dependencies:
109
104
  - - ">="
110
105
  - !ruby/object:Gem::Version
111
106
  version: 5.2.3
107
+ - - "<="
108
+ - !ruby/object:Gem::Version
109
+ version: '6.1'
112
110
  description: A spaced-repetition system to be used with ActiveRecord models
113
111
  email:
114
112
  - robert.gravina@gmail.com
@@ -117,10 +115,10 @@ executables: []
117
115
  extensions: []
118
116
  extra_rdoc_files: []
119
117
  files:
118
+ - ".github/workflows/tests.yml"
120
119
  - ".gitignore"
121
120
  - ".rspec"
122
121
  - ".ruby-version"
123
- - ".travis.yml"
124
122
  - Gemfile
125
123
  - Gemfile.lock
126
124
  - LICENSE
@@ -148,7 +146,7 @@ licenses:
148
146
  - MIT
149
147
  metadata:
150
148
  allowed_push_host: https://rubygems.org/
151
- post_install_message:
149
+ post_install_message:
152
150
  rdoc_options: []
153
151
  require_paths:
154
152
  - lib
@@ -163,9 +161,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
161
  - !ruby/object:Gem::Version
164
162
  version: '0'
165
163
  requirements: []
166
- rubyforge_project:
167
- rubygems_version: 2.7.6
168
- signing_key:
164
+ rubygems_version: 3.2.3
165
+ signing_key:
169
166
  specification_version: 4
170
167
  summary: A spaced-repetition system
171
168
  test_files: []
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- language: ruby
2
- cache: bundler
3
- rvm:
4
- - 2.5.3
5
- before_install: gem install bundler -v 1.17.3