thyng 0.0.1 → 0.1.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
  SHA1:
3
- metadata.gz: b4c7db9aae62d6681d2dd971af42314dc2ea35fc
4
- data.tar.gz: 9034618eaa475198878a3118f98cc4c0fef811f3
3
+ metadata.gz: e0b5dc2a14fbbdd60ebf9ccabf39ba7941135625
4
+ data.tar.gz: 68e9d08bda758ec2cccb6757a000aaaa87b81f69
5
5
  SHA512:
6
- metadata.gz: ea41f1e43df85be3bdd184e86bc6fd8312fec68d9c6712658eeaf30e3169b1b57e0055a9e56220ec42e8db723edaa515fa937cbfc9d4820065b3b3e439b86af5
7
- data.tar.gz: 96cda3cee7960ec56f2950770977266a3ea920dce091ade504f334d024ca2190a4cdb4314231c53b3dbd97d4c6207ca3a325c553e4872c17de208ef5189d5a02
6
+ metadata.gz: 5b0163c7ad518c69df3795cdc8389b74892722a523cc8db8b75d64b5ceae86f10fd9efcf1ee0b6c73ee6e4d143f8a3c1437a8e1686a0e3230b87eb5a8fd8b98f
7
+ data.tar.gz: 27f6f95c63327a67fa76ca4d190b95cfbc31baf80cdd36eff8f54d371941e2758a98fb650d53d4e648492490d717db3969b8ed74f53c866ffe0814efd644510c
data/README.md CHANGED
@@ -2,16 +2,16 @@
2
2
 
3
3
  ##### Ruby objects with public state to encourage storage as data only collections.
4
4
 
5
- ### What?
5
+ #### What?
6
6
  A `thyng` is a ruby object with the convention of saving state in **key:value** pairs that are public on the object rather than in private **instance variables**.
7
7
 
8
- ### How?
8
+ #### How?
9
9
  Instead of private attributes a `thyng` has public aspects. Basic access to these can be declared with `asect_reader`, `aspect_write` & `aspect_accessor`.
10
10
 
11
- ### Why?
12
- Will all internal state a `thyng` can be reconstructed completly from its data. This allows it to be passed as JSON a json object and easily be stored in a database.
11
+ #### Why?
12
+ With all state external a `thyng` can be reconstructed completly from its data. This allows it to be passed as JSON or easily stored in a database.
13
13
 
14
- ### Simple example
14
+ #### Simple example
15
15
 
16
16
  ```ruby
17
17
  class Person < Thyng
@@ -27,7 +27,7 @@ puts person
27
27
  # => {name: 'Fester'}
28
28
  ```
29
29
 
30
- ### Show me the money
30
+ #### Show me the money
31
31
  *Thyng objects are subclassed from ruby hashes. This means most database orm's know exactly how handle them*
32
32
 
33
33
  ```ruby
@@ -37,6 +37,8 @@ class Person < Thyng
37
37
  end
38
38
 
39
39
  class Credentials < Thyng
40
+ extend Thyng::CryptedAspect
41
+
40
42
  aspect_accessor :email
41
43
  crypted_accessor :password # <- Oooh!
42
44
  end
@@ -70,11 +72,49 @@ Or install it yourself as:
70
72
 
71
73
  ## Usage
72
74
 
73
- TODO: Write usage instructions here
75
+ #### Plain aspects
76
+ *See introduction Example*
77
+
78
+ #### Crypted aspects
79
+ To use this you must first add the module to thyng or your subclass of thyng. This will add the `crypted_accessor` method to your class.
80
+
81
+ `crypted_accessor` takes an aspect and adds five methods to you class. These are reader and writer methods for both the Bcrypt object and raw crypted string, as well as a check_aspect method
82
+
83
+ **Example**
84
+ ```ruby
85
+ class Credentials < Thyng
86
+ extend Thyng::CryptedAspect
87
+
88
+ aspect_accessor :email
89
+ crypted_accessor :password
90
+ end
91
+
92
+ credentials = Credentials.new email: 'test@example.com', password: 'password'
93
+ # => {:email=>"test@example.com", "crypted_password"=>"$2a$10$Bw4qH9Hp3iMG7c97SIBgJ.ahpXbL8M95FyDU7O.UHo4zgnxcm3bBi"}
94
+
95
+ credentials.password.class
96
+ # => BCrypt::Password
97
+
98
+ credentials.crypted_password.class
99
+ # => BCrypt::Password
100
+
101
+ credentials.check_password? 'password'
102
+ # => true
103
+
104
+ password_hash = BCrypt::Password.create('secret')
105
+ # => "$2a$10$O5DChGjqYxAU7yxo/J9.7uK55XPeWQxP0hU7nPYQNE85yDbl3H3I6"
106
+
107
+ credentials.crypted_password = password_hash
108
+ # => "$2a$10$O5DChGjqYxAU7yxo/J9.7uK55XPeWQxP0hU7nPYQNE85yDbl3H3I6"
109
+
110
+ credentials.check_password? 'secret'
111
+ # => true
112
+
113
+ ```
74
114
 
75
115
  ## Contributing
76
116
 
77
- 1. Fork it ( https://github.com/[my-github-username]/thyng/fork )
117
+ 1. Fork it ( https://github.com/CrowdHailer/thyng/fork )
78
118
  2. Create your feature branch (`git checkout -b my-new-feature`)
79
119
  3. Commit your changes (`git commit -am 'Add some feature'`)
80
120
  4. Push to the branch (`git push origin my-new-feature`)
data/lib/thyng.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "thyng/version"
2
+ require "thyng/crypted_aspect"
2
3
 
3
4
  class Thyng < Hash
4
5
  def initialize(args={})
@@ -0,0 +1,22 @@
1
+ require 'bcrypt'
2
+
3
+ class Thyng < Hash
4
+ module CryptedAspect
5
+ def crypted_accessor(aspect)
6
+ crypted_aspect = "crypted_#{aspect}"
7
+ aspect_accessor crypted_aspect
8
+
9
+ define_method "#{aspect}=", ->(value) {
10
+ send "#{crypted_aspect}=", BCrypt::Password.create(value)
11
+ }
12
+
13
+ define_method aspect, -> () {
14
+ BCrypt::Password.new send(crypted_aspect)
15
+ }
16
+
17
+ define_method "check_#{aspect}?", -> (test_value) {
18
+ send(aspect) == test_value
19
+ }
20
+ end
21
+ end
22
+ end
data/lib/thyng/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Thyng < Hash
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,34 @@
1
+ require_relative '../test_config'
2
+
3
+ class CryptedTest < MiniTest::Test
4
+ def password
5
+ 'password'
6
+ end
7
+
8
+ def crypted_example
9
+ Class.new Thyng do
10
+ extend Thyng::CryptedAspect
11
+ crypted_accessor :password
12
+ end
13
+ end
14
+
15
+ def test_creates_writer_to_crypted_value
16
+ example = crypted_example.new
17
+ assert example.respond_to?('crypted_password='), 'Should be able to write crypted value'
18
+ end
19
+
20
+ def test_creates_reader_to_crypted_value
21
+ example = crypted_example.new
22
+ assert example.respond_to?('crypted_password'), 'Should be able to read crypted value'
23
+ end
24
+
25
+ def test_aspect_is_saved_encrypted
26
+ example = crypted_example.new password: password
27
+ assert_equal BCrypt::Password, example.password.class
28
+ end
29
+
30
+ def test_can_check_against_encrypted_value
31
+ example = crypted_example.new password: password
32
+ assert_equal true, example.check_password?(password)
33
+ end
34
+ end
data/test/test_config.rb CHANGED
@@ -1,2 +1,8 @@
1
1
  require 'thyng'
2
- require 'minitest/autorun'
2
+ require 'minitest/autorun'
3
+ require 'minitest/reporters'
4
+
5
+ reporter_options = {color: true, slow_count: 5}
6
+ Minitest::Reporters.use! [Minitest::Reporters::DefaultReporter.new(reporter_options)]
7
+
8
+ BCrypt::Engine.cost = 1
data/thyng.gemspec CHANGED
@@ -10,21 +10,10 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["peterhsaxton@gmail.com"]
11
11
  spec.summary = %q{Ruby objects with public state to encourage storage as data only collections}
12
12
  spec.description = %q{
13
- Thyng
14
-
15
- Ruby objects with public state to encourage storage as data only collections.
16
-
17
- What?
18
-
19
- A thyng is a ruby object with the convention of saving state in key:value pairs that are public on the object rather than in private instance variables.
20
-
21
- How?
22
-
13
+ Create Ruby objects with public state to encourage their storage as data only collections.
23
14
  Instead of private attributes a thyng has public aspects. Basic access to these can be declared with asect_reader, aspect_write & aspect_accessor.
24
-
25
- Why?
26
-
27
- Will all internal state a thyng can be reconstructed completly from its data. This allows it to be passed as JSON a json object and easily be stored in a database.
15
+ Thyng is a subclass of a plain Ruby Hash allowing merging, filtering etc of the objects aspects.
16
+ With all state external a thyng can be reconstructed completly from its data. This allows it to be passed as JSON or easily stored in a database.
28
17
  }
29
18
  spec.homepage = "https://github.com/CrowdHailer/Thyng"
30
19
  spec.license = "MIT"
@@ -37,4 +26,7 @@ Gem::Specification.new do |spec|
37
26
  spec.add_development_dependency "bundler", "~> 1.7"
38
27
  spec.add_development_dependency "rake", "~> 10.0"
39
28
  spec.add_development_dependency "minitest", "~> 5.4.3"
29
+ spec.add_development_dependency "minitest-reporters", "~> 1.0.6"
30
+
31
+ spec.add_dependency "bcrypt", "~> 3.1.7"
40
32
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thyng
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Saxton
@@ -52,14 +52,41 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 5.4.3
55
- description: "\n Thyng\n \n Ruby objects with public state to encourage storage
56
- as data only collections.\n\n What?\n\n A thyng is a ruby object with the
57
- convention of saving state in key:value pairs that are public on the object rather
58
- than in private instance variables.\n\n How?\n\n Instead of private attributes
59
- a thyng has public aspects. Basic access to these can be declared with asect_reader,
60
- aspect_write & aspect_accessor.\n\n Why?\n\n Will all internal state a thyng
61
- can be reconstructed completly from its data. This allows it to be passed as JSON
62
- a json object and easily be stored in a database.\n "
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest-reporters
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.0.6
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.0.6
69
+ - !ruby/object:Gem::Dependency
70
+ name: bcrypt
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 3.1.7
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 3.1.7
83
+ description: "\n Create Ruby objects with public state to encourage their storage
84
+ as data only collections.\n Instead of private attributes a thyng has public
85
+ aspects. Basic access to these can be declared with asect_reader, aspect_write &
86
+ aspect_accessor.\n Thyng is a subclass of a plain Ruby Hash allowing merging,
87
+ filtering etc of the objects aspects.\n With all state external a thyng can be
88
+ reconstructed completly from its data. This allows it to be passed as JSON or easily
89
+ stored in a database.\n "
63
90
  email:
64
91
  - peterhsaxton@gmail.com
65
92
  executables: []
@@ -72,12 +99,14 @@ files:
72
99
  - README.md
73
100
  - Rakefile
74
101
  - lib/thyng.rb
102
+ - lib/thyng/crypted_aspect.rb
75
103
  - lib/thyng/version.rb
76
104
  - tasks/test.rake
77
105
  - test/core/accessor_test.rb
78
106
  - test/core/initializer_test.rb
79
107
  - test/core/reader_test.rb
80
108
  - test/core/writer_test.rb
109
+ - test/crypted/crypted_test.rb
81
110
  - test/test_config.rb
82
111
  - test/version/version_test.rb
83
112
  - thyng.gemspec
@@ -110,5 +139,6 @@ test_files:
110
139
  - test/core/initializer_test.rb
111
140
  - test/core/reader_test.rb
112
141
  - test/core/writer_test.rb
142
+ - test/crypted/crypted_test.rb
113
143
  - test/test_config.rb
114
144
  - test/version/version_test.rb