thyng 0.0.1 → 0.1.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: 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