devise_date_restrictable 0.0.2 → 1.0.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
  SHA1:
3
- metadata.gz: ba15c9a9b18e2d4ac2663776e02599a60ecb62c8
4
- data.tar.gz: e5aef1d8cd2117c222ee32dd0eea72d9b146b063
3
+ metadata.gz: 1647aeed6dcb44c69b814cb2522eb6316863c840
4
+ data.tar.gz: 9dffb3dead57f9d239d492af81f01d8fed64e324
5
5
  SHA512:
6
- metadata.gz: 725afd0fdc772d1b7d5ae1b17b5b07446c36d5f055218be43cc16476b338967d6a4f76de1b067725516e0bb1eb723779fd4cda07ea653c8ce709dfbfe3ee447f
7
- data.tar.gz: 3c56ce8db733de7ec9971545b0574869a0cfa27d5a1d3dc1b87c3c3828fecb991524a4ee438f8ef31dfb307184ad8d0bf9348c7cef6195d5a8fcbb36351e4921
6
+ metadata.gz: 1d33055418872176d52b8589df642b610d9e54ae614c8e11a40fc3dc2cadf454aaf1f686922f07fed314db9c713c156b0b262785a3a0370f1b8e88cd69a6d6b7
7
+ data.tar.gz: 05e8b6e926d56fe8c6e0042ae4e2fc3387b8b655f0bbb1536b26a70c871600b2b87ec660b838ce8ebbf50a85e2e4ec57a9b0ca2a7218fa7d299a255f8f02490c
data/.gitignore CHANGED
@@ -1 +1,3 @@
1
1
  *.gem
2
+ *.log
3
+ Gemfile.lock
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2017 Jon Pearse
3
+ Copyright (c) 2017-2018 Jon Pearse
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -21,26 +21,63 @@ Finally, add @:date_restrictable@ to the devise line of your model, for instance
21
21
 
22
22
  h2. Usage
23
23
 
24
- This gem adds two @DATE@ fields to your account model: @valid_from@ and @valid_until@. One or both may be specified in order to restrict an account’s ability to log in.
25
- If neither is specified, the user will be able to log in without restriction.
24
+ This gem adds two @DATE@ fields to your model: @valid_from@ and @valid_until@. One or both may be specified in order to
25
+ restrict a user’s ability to log in either before- or after a particular date, or within a given date range.
26
+ If neither is specified, the user will be able to log in without restriction as before.
26
27
 
27
- Note that dates are _inclusive_: that is, setting an account to be valid *from* 2017-05-28 means they will be able to log in from midnight on 2017-05-28. Similarly, setting an account to be valid *until* 2017-05-27 means they will be able to log in until 23.59.59 on that date.
28
- At this time, all restrictions are based on server time—no provision has been made, as yet, for different timezones.
28
+ Note that dates are _inclusive_, that is:
29
29
 
30
- h2. To-do
30
+ - if @valid_from@ is specified, the user will be able to log in after 00:00:00 on that date
31
+ - if @valid_until@ is specified, the user will be able to log in until 23:59:59 on that date
31
32
 
32
- This has been fairly quickly bashed together for use within a project, therefore isnt perhaps as polished as it might be. At some point, I might get around to implementing some of the following:
33
+ Note that this gem is not timezone-aware, and therefore the servers local time will be used for everything. I plan to modify this in a later release.
33
34
 
34
- * add support for timezones
35
- * add helper methods to the account object to facilitate easier management (eg. @user.set_valid_for(3.years)@, and the like)
36
- * support for better messaging
35
+ This gem also provides basic validation to ensure that if @valid_from@ and @valid_until@ are provided, they make sense
36
+ chronologically.
37
+
38
+ h3. Localisation
39
+
40
+ This gem provides two localisable strings:
41
+
42
+ *Authentication failure*
43
+ Shown to the user if their account has been restricted by date. This follows Devise convention, will search the following I18n keys:
44
+
45
+ <pre>devise.failure.[model].account_date_restricted
46
+ devise.failure.account_date_restricted</pre>
47
+
48
+ *Date validation failure*
49
+ Shown if you attempt to set a user’s @valid_from@ to be after @valid_until@. This follows ActiveRecord error convention, and will search the following I18n keys:
50
+
51
+ <pre>activerecord.errors.models.[model].attributes.valid_until.must_be_on_or_after
52
+ activerecord.errors.models.[model].must_be_on_or_after
53
+ activerecord.errors.messages.must_be_on_or_after
54
+ errors.attributes.valid_until.must_be_on_or_after
55
+ errors.messages.must_be_on_or_after</pre>
56
+
57
+ The "human-readable":http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models name of the @valid_from@ field is available to these translations as @:field@.)
37
58
 
38
59
  h2. Version History
39
60
 
40
- h3. 0.0.2 _(June 6th. 2017)_
61
+ *1.0.0 _(May 23rd, 2018)_*
62
+
63
+ * [fix] added ActiveRecord::Migration version number to migration template
64
+ * added basic date validation (it is no longer possible to punch holes in space/time with this gem, sorry)
65
+ * added unit tests
66
+ * general tidying for release.
67
+
68
+ *0.0.2 _(June 6th, 2017)_*
41
69
 
42
70
  * removing errant debug output
43
71
 
44
- h3. 0.0.1 _(May 28th, 2017)_
72
+ *0.0.1 _(May 28th, 2017)_*
45
73
 
46
74
  * initial release
75
+
76
+ h2. Contributing
77
+
78
+ Go for it! I’ll happily accept any sensible pull requests :)
79
+
80
+ h2. Obligatory sales pitch
81
+
82
+ When I’m not hacking at random gems, I’m a freelance web developer specialising in all things front-end, based in the beautiful city of Cardiff, UK.
83
+ I’m usually kept fairly busy with project work, but I’m always on the lookout for new people to do cool stuff with. "Drop me a line":mailto:hello@jonpearse.net – I’d love to hear from you!
@@ -0,0 +1,14 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ require 'rake/testtask'
6
+
7
+ desc 'Run unit tests'
8
+ Rake::TestTask.new( :test ) do |t|
9
+
10
+ t.libs.concat( %w{ lib test } )
11
+ t.pattern = 'test/tests/*.rb'
12
+ t.warning = false
13
+
14
+ end
@@ -1,5 +1,9 @@
1
1
  en:
2
2
  devise:
3
3
  failure:
4
- user:
5
- account_date_restricted: "Your account is not currently active: please contact an administrator for more information"
4
+ account_date_restricted: "Your account is not currently active: please contact an administrator for more information"
5
+
6
+ errors:
7
+ attributes:
8
+ valid_until:
9
+ must_be_on_or_after: Cannot be before %{field}
@@ -2,18 +2,23 @@
2
2
  require File.expand_path('../lib/devise_date_restrictable/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
- gem.authors = "Jon Pearse"
6
- gem.email = "jon@jonpearse.net"
7
- gem.description = "This allows a Devise user’s validity to be restricted by a date range. This allows administrators to set up accounts that are valid to-, or from-, or between specific dates."
8
- gem.summary = "Devise plugin to restrict access based on a date range."
9
- gem.homepage = "https://github.com/jonpearse/devise_date_restrictable"
10
- gem.license = "MIT"
5
+
6
+ gem.authors = 'Jon Pearse'
7
+ gem.email = 'jon@jonpearse.net'
8
+ gem.description = 'This allows a Devise user’s validity to be restricted by a date range. This allows administrators to set up accounts that are valid to-, or from-, or between specific dates.'
9
+ gem.summary = 'Devise plugin to restrict access based on a date range.'
10
+ gem.homepage = 'https://github.com/jonpearse/devise_date_restrictable'
11
+ gem.license = 'MIT'
11
12
 
12
13
  gem.files = `git ls-files`.split($\)
13
- gem.name = "devise_date_restrictable"
14
- gem.require_paths = ["lib"]
14
+ gem.name = 'devise_date_restrictable'
15
+ gem.require_paths = [ 'lib' ]
15
16
  gem.version = DeviseDateRestrictable::VERSION
16
17
 
17
- gem.add_dependency('devise', [">= 4.0.0"])
18
- gem.add_dependency('rails', [">= 5.0.0"])
18
+ gem.add_dependency( 'devise', '~> 4.0' )
19
+ gem.add_dependency( 'rails', '~> 5.1' )
20
+
21
+ gem.add_development_dependency( 'bundler', '~> 1.16' )
22
+ gem.add_development_dependency( 'sqlite3', '~> 1.3', '>= 1.3.13' )
23
+
19
24
  end
@@ -1,11 +1,12 @@
1
1
  require "devise_date_restrictable/version"
2
2
  require "devise_date_restrictable/rails"
3
3
 
4
- unless defined?(Devise)
4
+ unless defined?( Devise )
5
+
5
6
  require 'devise'
7
+
6
8
  end
7
9
 
8
- Devise.add_module :date_restrictable, model: 'devise_date_restrictable/active_record'
10
+ Devise.add_module( :date_restrictable, model: 'devise_date_restrictable/active_record' )
9
11
 
10
- module DeviseDateRestrictable
11
- end
12
+ module DeviseDateRestrictable; end
@@ -1,32 +1,81 @@
1
1
  module Devise
2
2
  module Models
3
+
4
+ # DateRestrictable provides the ability to restrict a user’s access by date. This can be used to limit logging in
5
+ # either before- or after a certain date, or outside of a given date range.
6
+ #
7
+ # Where dates are given they are <em>inclusive</em>, that is:
8
+ #
9
+ # - if <tt>valid_from</tt> is specified, the user may log in after 00:00:00 on that date
10
+ # - if <tt>valid_until</tt> is specified, the user may log in until 23:59:59 on that date
11
+ #
12
+ # This module also provides basic validation to ensure that, where both <tt>valid_from</tt> and <tt>valid_until</tt>
13
+ # are specified, this is done in a sensible chronological order.
3
14
  module DateRestrictable
4
15
  extend ActiveSupport::Concern
5
16
 
17
+ # Add validation onto base model.
18
+ included do
19
+
20
+ validate :date_restrictable_must_be_chronological
21
+
22
+ end
23
+
24
+ # Returns whether or not the user is currently restricted by date.
6
25
  def date_restricted?
26
+
7
27
  now = Date.today
8
28
 
9
29
  !((valid_from.nil? or now >= valid_from) and (valid_until.nil? or now <= valid_until))
30
+
10
31
  end
11
32
 
12
- def self.required_fields(klass)
13
- attributes = []
14
- attributes << :valid_from
15
- attributes << :valid_until
16
- attributes
33
+ # Returns an array of fields required by this module.
34
+ def self.required_fields( klass )
35
+
36
+ %i{ valid_from, valid_until }
37
+
17
38
  end
18
39
 
40
+ # Hook into lockable: verifies whether the user is locked for any reason.
19
41
  def access_locked?
20
- date_restricted?
42
+
43
+ super && date_restricted?
44
+
21
45
  end
22
46
 
47
+ # Hook into authenticatable: verifies whether the user is available for authentication.
23
48
  def active_for_authentication?
49
+
24
50
  super && !date_restricted?
51
+
25
52
  end
26
53
 
54
+ # Returns an appropriate message should the user be locked out by this module.
27
55
  def inactive_message
56
+
28
57
  date_restricted? ? :account_date_restricted : super
58
+
29
59
  end
60
+
61
+ private
62
+
63
+ # Internal validation function to ensure that, when both -from and -to dates are specified, they make
64
+ # chronological sense.
65
+ def date_restrictable_must_be_chronological
66
+
67
+ # bounce unless we have both dates
68
+ return if valid_from.blank? or valid_until.blank?
69
+
70
+ # otherwise…
71
+ unless valid_until.to_date >= valid_from.to_date
72
+
73
+ field_name = self.class.human_attribute_name( :valid_from )
74
+ errors.add( :valid_until, :must_be_on_or_after, { field: field_name })
75
+
76
+ end
77
+
78
+ end
30
79
  end
31
80
  end
32
81
  end
@@ -1,3 +1,3 @@
1
1
  module DeviseDateRestrictable
2
- VERSION = "0.0.2"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -4,14 +4,21 @@ class DeviseDateRestrictableGenerator < Rails::Generators::Base
4
4
  include Rails::Generators::Migration
5
5
 
6
6
  def self.source_root
7
- @_devise_source_root ||= File.expand_path("../templates", __FILE__)
7
+
8
+ @_devise_source_root ||= File.expand_path( '../templates', __FILE__ )
9
+
8
10
  end
9
11
 
10
- def self.next_migration_number(dirname)
12
+ def self.next_migration_number( dirname )
13
+
11
14
  if ActiveRecord::Base.timestamped_migrations
12
- Time.now.utc.strftime("%Y%m%d%H%M%S")
15
+
16
+ Time.now.utc.strftime( '%Y%m%d%H%M%S' )
17
+
13
18
  else
14
- "%.3d" % (current_migration_number(dirname) + 1)
19
+
20
+ "%.3d" % ( current_migration_number( dirname ) + 1 )
21
+
15
22
  end
16
23
  end
17
24
 
@@ -24,17 +31,24 @@ class DeviseDateRestrictableGenerator < Rails::Generators::Base
24
31
  @model_name = model_name.camelize.singularize
25
32
 
26
33
  if columns_exist?
34
+
27
35
  say "* Date restrictable columns already seem to exist on @{model_name}"
36
+
28
37
  else
38
+
29
39
  migration_template 'migration.rb', "db/migrate/devise_add_#{model_name.downcase}_date_restriction_fields.rb"
40
+
30
41
  end
31
42
 
32
- puts "Make sure to add :date_restrictable to the devise line of your #{@model_name} model file."
43
+ puts "\n\nMake sure to add :date_restrictable to the devise line of your #{@model_name} model file!\n\n"
44
+
33
45
  end
34
46
 
35
47
  protected
36
48
 
37
49
  def columns_exist?
38
- @model_name.constantize.column_names.include?("valid_from") and @model_name.constantize.column_names.include?("valid_until")
50
+
51
+ @model_name.constantize.column_names.include?( 'valid_from' ) and @model_name.constantize.column_names.include?( 'valid_until' )
52
+
39
53
  end
40
54
  end
@@ -1,6 +1,10 @@
1
- class DeviseAdd<%= @model_name.camelize.singularize %>DateRestrictionFields < ActiveRecord::Migration
1
+ class DeviseAdd<%= @model_name.camelize.singularize %>DateRestrictionFields < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
2
+
2
3
  def change
3
- add_column :<%=@model_name.tableize%>, :valid_from, :date
4
- add_column :<%=@model_name.tableize%>, :valid_until, :date
4
+
5
+ add_column :<%=@model_name.tableize %>, :valid_from, :date
6
+ add_column :<%=@model_name.tableize %>, :valid_until, :date
7
+
5
8
  end
9
+
6
10
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveRecord::Migration.verbose = false
4
+ ActiveRecord::Base.logger = Logger.new(nil)
5
+ ActiveRecord::Base.include_root_in_json = true
6
+
7
+ migrate_path = File.expand_path("../../rails_app/db/migrate/", __FILE__)
8
+ if Devise::Test.rails52?
9
+ ActiveRecord::MigrationContext.new(migrate_path).migrate
10
+ else
11
+ ActiveRecord::Migrator.migrate(migrate_path)
12
+ end
13
+
14
+ class ActiveSupport::TestCase
15
+ if Devise::Test.rails5?
16
+ self.use_transactional_tests = true
17
+ else
18
+ # Let `after_commit` work with transactional fixtures, however this is not needed for Rails 5.
19
+ require 'test_after_commit'
20
+ self.use_transactional_fixtures = true
21
+ end
22
+
23
+ self.use_instantiated_fixtures = false
24
+ end
File without changes
@@ -0,0 +1,5 @@
1
+ class User < ActiveRecord::Base
2
+
3
+ devise :date_restrictable
4
+
5
+ end
@@ -0,0 +1,4 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require ::File.expand_path('../config/environment', __FILE__)
4
+ run RailsApp::Application
@@ -0,0 +1,27 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+
3
+ require 'rails/all'
4
+ require 'devise'
5
+ require 'devise_date_restrictable'
6
+
7
+ if defined?(Bundler)
8
+ # If you precompile assets before deploying to production, use this line
9
+ Bundler.require(*Rails.groups(assets: %w[development test]))
10
+ # If you want your assets lazily compiled in production, use this line
11
+ # Bundler.require(:default, :assets, Rails.env)
12
+ end
13
+
14
+ module RailsApp
15
+ class Application < Rails::Application
16
+ config.encoding = 'utf-8'
17
+
18
+ config.filter_parameters += [:password]
19
+
20
+ config.assets.enabled = true
21
+
22
+ config.assets.version = '1.0'
23
+ config.secret_key_base = 'ignorethisplox'
24
+
25
+ config.active_record.sqlite3.represent_boolean_as_integer = true
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ unless defined?( DEVISE_ORM )
4
+ DEVISE_ORM = ( ENV["DEVISE_ORM"] || :active_record ).to_sym
5
+ end
6
+
7
+ module Devise
8
+ module Test
9
+ # Detection for minor differences between Rails 4 and 5, 5.1, and 5.2 in tests.
10
+
11
+ def self.rails52?
12
+ Rails.version.start_with? '5.2'
13
+ end
14
+
15
+ def self.rails51?
16
+ Rails.version.start_with? '5.1'
17
+ end
18
+
19
+ def self.rails5?
20
+ Rails.version.start_with? '5'
21
+ end
22
+ end
23
+ end
24
+
25
+ # Set up gems listed in the Gemfile.
26
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path( '../../../../Gemfile', __FILE__ )
27
+ require 'bundler/setup' if File.exist?( ENV['BUNDLE_GEMFILE'] )
@@ -0,0 +1,7 @@
1
+ development:
2
+ adapter: sqlite3
3
+ database: ":memory:"
4
+
5
+ test:
6
+ adapter: sqlite3
7
+ database: ":memory:"
@@ -0,0 +1,5 @@
1
+ # Load the rails application
2
+ require File.expand_path('../application', __FILE__)
3
+
4
+ # Initialize the rails application
5
+ RailsApp::Application.initialize!
@@ -0,0 +1,27 @@
1
+ RailsApp::Application.configure do
2
+ config.cache_classes = true
3
+ config.eager_load = false
4
+
5
+ if Rails.version > "5"
6
+ config.public_file_server.enabled = true
7
+ config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' }
8
+ else
9
+ config.serve_static_files = true
10
+ config.static_cache_control = 'public, max-age=3600'
11
+ end
12
+
13
+ config.consider_all_requests_local = true
14
+ config.action_controller.perform_caching = false
15
+
16
+ config.action_dispatch.show_exceptions = false
17
+
18
+ config.action_controller.allow_forgery_protection = false
19
+
20
+ config.action_mailer.delivery_method = :test
21
+ config.action_mailer.default_url_options = { host: 'test.host' }
22
+
23
+ config.active_support.deprecation = :stderr
24
+ I18n.enforce_available_locales = false
25
+
26
+ config.active_support.test_order = :sorted
27
+ end
@@ -0,0 +1,9 @@
1
+ Devise.setup do |config|
2
+ config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'
3
+
4
+ require 'devise/orm/active_record'
5
+ config.secret_key = '24213d5a635a381c4d4758564214314d5e514e34405507614c'
6
+ config.case_insensitive_keys = [:email]
7
+
8
+ config.strip_whitespace_keys = [:email]
9
+ end
@@ -0,0 +1,6 @@
1
+ MIGRATION_CLASS =
2
+ if ActiveRecord::VERSION::MAJOR >= 5
3
+ ActiveRecord::Migration[4.2]
4
+ else
5
+ ActiveRecord::Migration
6
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ class DeviseCreateUsers < ActiveRecord::Migration[5.2]
4
+ def change
5
+ create_table :users do |t|
6
+
7
+ ## Database authenticatable
8
+ t.string :email, null: false, default: ""
9
+ t.string :encrypted_password, null: false, default: ""
10
+
11
+ ## Restrictable
12
+ t.date :valid_from
13
+ t.date :valid_until
14
+
15
+ t.timestamps null: false
16
+ end
17
+
18
+ add_index :users, :email, unique: true
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ ENV['RAILS_ENV'] ||= 'test'
2
+
3
+ require 'rails_app/config/environment'
4
+ require 'rails/test_help'
5
+ require 'orm/active_record'
@@ -0,0 +1,68 @@
1
+ require 'test_helper'
2
+
3
+ class RestrictionTests < ActiveSupport::TestCase
4
+
5
+ # Check valid from
6
+ test 'ensure user cannot log in before valid_from' do
7
+
8
+ assert_not( User.new( valid_from: 1.day.from_now ).active_for_authentication? )
9
+
10
+ end
11
+
12
+ test 'ensure user can log in after valid_from' do
13
+
14
+ assert( User.new( valid_from: 1.day.ago ).active_for_authentication? )
15
+
16
+ end
17
+
18
+ # Check valid until
19
+ test 'ensure user cannot log in after valid_until' do
20
+
21
+ assert_not( User.new( valid_until: 1.day.ago ).active_for_authentication? )
22
+
23
+ end
24
+
25
+ test 'ensure user can log in before valid_until' do
26
+
27
+ assert( User.new( valid_until: 1.day.from_now ).active_for_authentication? )
28
+
29
+ end
30
+
31
+ # check ranges
32
+ test 'ensure user cannot log in before date range' do
33
+
34
+ assert_not( User.new( valid_from: 1.day.from_now, valid_until: 2.days.from_now ).active_for_authentication? )
35
+
36
+ end
37
+
38
+ test 'ensure user cannot log in after date range' do
39
+
40
+ assert_not( User.new( valid_from: 2.days.ago, valid_until: 1.days.ago ).active_for_authentication? )
41
+
42
+ end
43
+
44
+ test 'ensure user can log in during date range' do
45
+
46
+ assert( User.new( valid_from: 1.day.ago, valid_until: 1.days.from_now ).active_for_authentication? )
47
+
48
+ end
49
+
50
+ # Edge-cases
51
+ test 'ensure user can still log in if date_until is set to the current date' do
52
+
53
+ assert( User.new( valid_until: Date.today ).active_for_authentication? )
54
+
55
+ end
56
+
57
+ test 'ensure user can log in if date_from is set to the current date' do
58
+
59
+ assert( User.new( valid_from: Date.today ).active_for_authentication? )
60
+
61
+ end
62
+
63
+ test 'ensure user can log in if both date_from and date_until are set to the current date' do
64
+
65
+ assert( User.new( valid_from: Date.today, valid_until: Date.today ).active_for_authentication? )
66
+
67
+ end
68
+ end
@@ -0,0 +1,46 @@
1
+ require 'test_helper'
2
+
3
+ class ValidationTests < ActiveSupport::TestCase
4
+
5
+ # Make sure we can set things independently
6
+ test 'ensure we can set valid_from without valid_until' do
7
+
8
+ assert( User.new( valid_from: Date.today ).valid? )
9
+
10
+ end
11
+
12
+ test 'ensure we can set valid_until without valid_from' do
13
+
14
+ assert( User.new( valid_until: Date.today ).valid? )
15
+
16
+ end
17
+
18
+ # Now check the both
19
+ test 'ensure we can set valid_until and valid_from, as long as they’re chronologically sensible' do
20
+
21
+ assert( User.new( valid_from: ( Date.today - 1.day ), valid_until: Date.today ).valid? )
22
+
23
+ end
24
+
25
+ test 'ensure we can set valid_until and valid_from for the same day' do
26
+
27
+ assert( User.new( valid_from: Date.today, valid_until: Date.today ).valid? )
28
+
29
+ end
30
+
31
+ test 'ensure we cannot set valid_until to a point before valid_until' do
32
+
33
+ assert_not( User.new( valid_from: Date.today, valid_until: ( Date.today - 1.day )).valid? )
34
+
35
+ end
36
+
37
+ # Check messaging while we’re here
38
+ test 'ensure the validation message looks sane' do
39
+
40
+ user = User.new( valid_from: Date.today, valid_until: ( Date.today - 1.day ))
41
+ user.validate
42
+
43
+ assert_equal( user.errors.messages[:valid_until].first, 'Cannot be before Valid from' )
44
+
45
+ end
46
+ end
metadata CHANGED
@@ -1,43 +1,77 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_date_restrictable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Pearse
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-06 00:00:00.000000000 Z
11
+ date: 2018-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: devise
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 4.0.0
19
+ version: '4.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 4.0.0
26
+ version: '4.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rails
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 5.0.0
33
+ version: '5.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.16'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.16'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sqlite3
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 1.3.13
65
+ type: :development
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '1.3'
38
72
  - - ">="
39
73
  - !ruby/object:Gem::Version
40
- version: 5.0.0
74
+ version: 1.3.13
41
75
  description: This allows a Devise user’s validity to be restricted by a date range.
42
76
  This allows administrators to set up accounts that are valid to-, or from-, or between
43
77
  specific dates.
@@ -51,6 +85,7 @@ files:
51
85
  - Gemfile
52
86
  - LICENSE
53
87
  - README.textile
88
+ - Rakefile
54
89
  - config/locales/en.yml
55
90
  - devise_date_restrictable.gemspec
56
91
  - lib/devise_date_restrictable.rb
@@ -59,6 +94,21 @@ files:
59
94
  - lib/devise_date_restrictable/version.rb
60
95
  - lib/generators/devise_date_restrictable/devise_date_restrictable_generator.rb
61
96
  - lib/generators/devise_date_restrictable/templates/migration.rb
97
+ - test/orm/active_record.rb
98
+ - test/rails_app/Rakefile
99
+ - test/rails_app/app/models/user.rb
100
+ - test/rails_app/config.ru
101
+ - test/rails_app/config/application.rb
102
+ - test/rails_app/config/boot.rb
103
+ - test/rails_app/config/database.yml
104
+ - test/rails_app/config/environment.rb
105
+ - test/rails_app/config/environments/test.rb
106
+ - test/rails_app/config/initializers/devise.rb
107
+ - test/rails_app/config/initializers/migration_class.rb
108
+ - test/rails_app/db/migrate/01_devise_create_users.rb
109
+ - test/test_helper.rb
110
+ - test/tests/restriction_tests.rb
111
+ - test/tests/validation_tests.rb
62
112
  homepage: https://github.com/jonpearse/devise_date_restrictable
63
113
  licenses:
64
114
  - MIT
@@ -79,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
129
  version: '0'
80
130
  requirements: []
81
131
  rubyforge_project:
82
- rubygems_version: 2.6.11
132
+ rubygems_version: 2.6.14
83
133
  signing_key:
84
134
  specification_version: 4
85
135
  summary: Devise plugin to restrict access based on a date range.