has_tokens 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.
- data/.gitignore +5 -0
- data/.rspec +1 -0
- data/.travis.yml +11 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/has_tokens.gemspec +22 -0
- data/lib/has_tokens/version.rb +3 -0
- data/lib/has_tokens.rb +31 -0
- data/spec/active_record_integration_spec.rb +20 -0
- data/spec/creating_tokens_spec.rb +65 -0
- metadata +71 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/has_tokens.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "has_tokens/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "has_tokens"
|
7
|
+
s.version = HasTokens::VERSION
|
8
|
+
s.authors = ["coreyhaines", "josh cheek"]
|
9
|
+
s.email = ["coreyhaines@gmail.com", "josh.cheek@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Creates tokens for accessing ActiveRecord objects}
|
12
|
+
s.description = %q{Allows you to declaratively specify token-based access for your ActiveRecord objects.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "has_tokens"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency "rspec"
|
22
|
+
end
|
data/lib/has_tokens.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "has_tokens/version"
|
2
|
+
|
3
|
+
module HasTokens
|
4
|
+
|
5
|
+
def self.on(klass)
|
6
|
+
klass.class_eval do
|
7
|
+
include HasTokens
|
8
|
+
class << self
|
9
|
+
attr_reader :token_definitions
|
10
|
+
|
11
|
+
def has_tokens(token_definitions)
|
12
|
+
@token_definitions = token_definitions
|
13
|
+
token_definitions.keys.each do |token_name|
|
14
|
+
define_singleton_method "for_#{token_name}" do |token|
|
15
|
+
send "find_by_#{token_name}_token!", token
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
TokenChars = (1..9).to_a + ('a'..'z').to_a
|
24
|
+
|
25
|
+
def generate_tokens
|
26
|
+
self.class.token_definitions.each do |token_name, size|
|
27
|
+
return if self.send("#{token_name}_token")
|
28
|
+
self.send "#{token_name}_token=", (1..size).map{TokenChars.sample}.join
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'has_tokens'
|
2
|
+
|
3
|
+
class ActiveRecordDummyWithTokens
|
4
|
+
HasTokens.on self
|
5
|
+
attr_accessor :public_token, :admin_token
|
6
|
+
|
7
|
+
has_tokens :public => 5, :admin => 10
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
describe "Looking up by the tokens with for_<token_name>" do
|
12
|
+
it "calls the appropriate ActiveRecord finder" do
|
13
|
+
admin_version = stub
|
14
|
+
ActiveRecordDummyWithTokens.should_receive(:find_by_admin_token!).with("admin_token") { admin_version }
|
15
|
+
ActiveRecordDummyWithTokens.for_admin("admin_token").should be(admin_version)
|
16
|
+
public_version = stub
|
17
|
+
ActiveRecordDummyWithTokens.should_receive(:find_by_public_token!).with("public_token") { public_version }
|
18
|
+
ActiveRecordDummyWithTokens.for_public("public_token").should be(public_version)
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'has_tokens'
|
2
|
+
|
3
|
+
class WantsOneToken
|
4
|
+
HasTokens.on self
|
5
|
+
|
6
|
+
attr_accessor :public_token
|
7
|
+
|
8
|
+
has_tokens :public => 5
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
describe "Creating a single token with #generate_tokens" do
|
13
|
+
let(:tokened) { WantsOneToken.new }
|
14
|
+
before do
|
15
|
+
tokened.generate_tokens
|
16
|
+
end
|
17
|
+
|
18
|
+
it "sets the appropriate token property" do
|
19
|
+
tokened.public_token.should_not be_nil
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "the generated token" do
|
23
|
+
it 'is unique' do
|
24
|
+
tokened2 = WantsOneToken.new
|
25
|
+
tokened2.generate_tokens
|
26
|
+
tokened.public_token.should_not == tokened2.public_token
|
27
|
+
end
|
28
|
+
|
29
|
+
it "has the length that was given" do
|
30
|
+
tokened.public_token.length.should == 5
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class WantsMultipleTokens
|
36
|
+
HasTokens.on self
|
37
|
+
|
38
|
+
attr_accessor :public_token, :admin_token
|
39
|
+
|
40
|
+
has_tokens :public => 5, :admin => 10
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "Creating multiple tokens with #generate_tokens" do
|
44
|
+
let(:tokened) { WantsMultipleTokens.new }
|
45
|
+
before do
|
46
|
+
tokened.generate_tokens
|
47
|
+
end
|
48
|
+
|
49
|
+
it "sets all the token properties" do
|
50
|
+
tokened.public_token.should_not be_nil
|
51
|
+
tokened.admin_token.should_not be_nil
|
52
|
+
end
|
53
|
+
|
54
|
+
it "has the length that was given for each token" do
|
55
|
+
tokened.public_token.length.should == 5
|
56
|
+
tokened.admin_token.length.should == 10
|
57
|
+
end
|
58
|
+
|
59
|
+
it "does not over-write an existing token" do
|
60
|
+
tokened = WantsMultipleTokens.new
|
61
|
+
tokened.admin_token = "existing"
|
62
|
+
tokened.generate_tokens
|
63
|
+
tokened.admin_token.should eq("existing")
|
64
|
+
end
|
65
|
+
end
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: has_tokens
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- coreyhaines
|
9
|
+
- josh cheek
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2012-03-06 00:00:00.000000000Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rspec
|
17
|
+
requirement: &2157904600 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *2157904600
|
26
|
+
description: Allows you to declaratively specify token-based access for your ActiveRecord
|
27
|
+
objects.
|
28
|
+
email:
|
29
|
+
- coreyhaines@gmail.com
|
30
|
+
- josh.cheek@gmail.com
|
31
|
+
executables: []
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- .gitignore
|
36
|
+
- .rspec
|
37
|
+
- .travis.yml
|
38
|
+
- Gemfile
|
39
|
+
- Rakefile
|
40
|
+
- has_tokens.gemspec
|
41
|
+
- lib/has_tokens.rb
|
42
|
+
- lib/has_tokens/version.rb
|
43
|
+
- spec/active_record_integration_spec.rb
|
44
|
+
- spec/creating_tokens_spec.rb
|
45
|
+
homepage: ''
|
46
|
+
licenses: []
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
requirements: []
|
64
|
+
rubyforge_project: has_tokens
|
65
|
+
rubygems_version: 1.8.17
|
66
|
+
signing_key:
|
67
|
+
specification_version: 3
|
68
|
+
summary: Creates tokens for accessing ActiveRecord objects
|
69
|
+
test_files:
|
70
|
+
- spec/active_record_integration_spec.rb
|
71
|
+
- spec/creating_tokens_spec.rb
|