protected_record 0.0.3 → 0.0.4

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: 3ba5e182fe0caec23566af06a804659fd64927ce
4
- data.tar.gz: dd283cab9d1fef2b38b4468acc7c57f332b4af76
3
+ metadata.gz: 2ca5f6df32648cad9acee2ed43774965181ef3b4
4
+ data.tar.gz: c9f887c42afc82b5a793b3e9b689102dc1492df6
5
5
  SHA512:
6
- metadata.gz: 0c8a5c244a1ca72eb8a70e9c4afe89664ff1307e5db0832192fd39faea382efd305bb6ce8d08d81bd00fd5273dbe4732d9942c12d37c7041aa9035c678c5dcb2
7
- data.tar.gz: a609d10024a34d026e45203bf85179d2b188e4d3ddeb9a8595eea7dc6f0532f8cfb2db972f37eab1c3e4643e7c1a65db2da41f255e244e190e4b711dba91ea19
6
+ metadata.gz: c9ff4028860f759cb5a5dd2d9212d2d873b4e6e3b400343199ff37a5f93c852b7510410aa843630fbc1dcfce50979e6826c3c66b9014af8d14ecbfa4027b4518
7
+ data.tar.gz: 30c2e5c35108ef953ad05c1f5fa676f15f7f74e5fe11c5adeabc1cf5555a70f9a24e7257f422b9700581e84e03c7a7606b5ea7a02d94a26953c3e11d1c1ea1b2
data/README.md CHANGED
@@ -1,67 +1,83 @@
1
1
  # protected_record
2
+
2
3
  ## Setup for rails applications
3
- I've created an engine to provide the necessary migrations as well as a basic interface for traiging change requests. You are free to use this gem without the engine, but you'll need to visit [protected_record_manager](https://github.com/rthbound/protected_record_manager/tree/master/db/migrate) and copy the migrations into your app manually.
4
4
 
5
- Add to your Rails application's Gemfile:
5
+ I've created an engine to provide the necessary migrations as well as a (very)
6
+ basic interface for triaging `ProtectedRecord::ChangeRequest::Record` objects.
7
+ You are free to use this gem without the engine, but you'll need to
8
+ [grab these](//github.com/rthbound/protected_record_manager/tree/master/db/migrate).
6
9
 
7
- gem "protected_record_manager"
8
-
9
- And to your Rails application's `routes.rb`:
10
- ```ruby
11
- mount ProtectedRecordManager::Engine, :at => "/protected_record_manager", as: "protected_record_manager"
12
- ```
13
- Which will provide a user interface for triaging change requests at:
14
- ```
15
- http://localhost:3000/protected_record_manager/change_requests
16
- ```
17
- **Important:** Only users with `@user.protected_record_manager == true` will be able to access these resources.
10
+ ### Your models
18
11
 
19
- Now copy over and run the migrations:
20
- ```
21
- $ rake protected_record_manager:install:migrations
22
- $ rake db:migrate
23
- ```
24
- Lastly, you'll need to prepare your models. There's two types of models at play here:
12
+ Prepare your models.
13
+ There's **two types** of models at play here:
14
+
15
+ 1. User (for now I expect a `User` class and `current\_user` method
16
+ 2. Your records .. these are the models you want to track
25
17
 
26
- 1. User (for now I expect a `User` class and `current_user` method
27
- 2. records .. these are the models you want to track
18
+ So, in your models
28
19
 
29
- So in `user.rb`
30
20
  ```ruby
21
+ # app/models/user.rb
31
22
  include ProtectedRecord::ChangeRequest::Changer
32
23
  include ProtectedRecord::ChangeLog::Changer
33
24
  ```
34
25
 
35
- And in any model where you want to use protection:
36
26
  ```ruby
27
+ # app/models/any.rb
28
+
37
29
  include ProtectedRecord::ChangeRequest::Changeling
38
30
  include ProtectedRecord::ChangeLog::Changeling
39
31
  ```
32
+
40
33
  ## Usage
34
+
41
35
  1. protected_record will prevent changes to attributes you specify as protected.
42
- 2. Any attempted change will be logged as a `ProtectedRecord::ChangeRequest::Record`.
43
- 3. If any changes are allowed through the filter, protected_record will create a `ProtectedRecord::ChangeLog::Record` to log who changed what, and for which record.
44
- 4. **Important**: ProtectedRecord is opt-in only. It does not change the way behavior of any AR methods, nor does it use any callbacks. In order to update with protection, use the following:
36
+ 2. Any attempted change will be logged as a
37
+ `ProtectedRecord::ChangeRequest::Record`.
38
+ 3. If any changes are allowed through the filter, protected_record
39
+ will create a `ProtectedRecord::ChangeLog::Record` to log who changed what,
40
+ and for which record.
41
+ 4. **Important**: ProtectedRecord is opt-in only. It does not change the
42
+ behavior of any AR methods, nor does it place any callbacks in your models.
43
+ In order to update with protection, use the following:
44
+
45
+ This user can change anything but `:do_not_resuscitate`and `:organ_donor`.
46
+ Rejected changes will create `ProtectedRecord::ChangeRequest::Record` objects.
47
+ Permitted changes will create `ProtectedRecord::ChangeLog::Record` objects.
45
48
 
46
49
  ```ruby
47
- result = ProtectedRecord::UseCase::Update.new({
48
- params: record_params,
50
+ ready = ProtectedRecord::UseCase::Update.new({
51
+ user: current_user,
52
+ params: record_params,
49
53
  protected_record: @record,
50
- user: current_user,
51
- protected_keys: %w{ do_not_resuscitate organ_donor }
52
- }).execute!
54
+ protected_keys: %w{ do_not_resuscitate organ_donor }
55
+ })
53
56
 
54
- # UseCase module will filter changes to protected_keys,
55
- # creating a "change request" rather than applying changes
57
+ result = ready.execute!
56
58
 
57
- # UseCase module will allow other changes to be applied,
58
- # creating a "change log" entry for the observed changes
59
- update_result.successful? #=> true
59
+ result.successful? #=> true
60
60
  ```
61
- and call methods like
61
+
62
+ and
63
+
62
64
  ```ruby
65
+ # Who changed what, and when
63
66
  @user.change_log_records
67
+
68
+ # Who attempted to change what, and when
64
69
  @user.change_request_records
70
+
71
+ # What changed, and when
65
72
  @record.change_log_records
73
+
74
+ # What changes were attempted, and when
66
75
  @record.change_request_records
67
76
  ```
77
+
78
+ ## Contributing
79
+
80
+ Please do. There's plenty that could be done to round out both the interface
81
+ and the the feature set.
82
+
83
+ Issues and pull requests would be most appreciated.
@@ -1,3 +1,5 @@
1
+ require "json"
2
+
1
3
  module ProtectedRecord
2
4
  module UseCase
3
5
  module ChangeLog
@@ -28,7 +30,7 @@ module ProtectedRecord
28
30
  @record = @record_class.new
29
31
  @record.user = @user
30
32
  @record.recordable = @changed_object
31
- @record.observed_changes = ActiveSupport::JSON.encode(@changed_object.previous_changes)
33
+ @record.observed_changes = JSON.generate(@changed_object.previous_changes)
32
34
  end
33
35
  end
34
36
  end
@@ -1,3 +1,3 @@
1
1
  module ProtectedRecord
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -1,6 +1,7 @@
1
1
  # Testing frameworks
2
2
  require "minitest/spec"
3
3
  require "minitest/autorun"
4
+ require "minitest/mock"
4
5
 
5
6
  # Debugger
6
7
  require "pry"
@@ -1,2 +1,120 @@
1
1
  require "minitest_helper"
2
+ require "active_record"
2
3
 
4
+ describe ProtectedRecord::UseCase::ChangeFilter::Create do
5
+ describe "new" do
6
+ before do
7
+ class TestCase
8
+ include ActiveModel::Dirty
9
+
10
+ define_attribute_methods [:knowledge, :power]
11
+
12
+ def knowledge
13
+ @knowledge
14
+ end
15
+
16
+ def power
17
+ @power
18
+ end
19
+
20
+ def knowledge=(val)
21
+ knowledge_will_change! unless val == @knowledge
22
+ @knowledge = val
23
+ end
24
+
25
+ def power=(val)
26
+ power_will_change! unless val == @power
27
+ @power = val
28
+ end
29
+
30
+ def save
31
+ @previously_changed = changes
32
+ @changed_attributes.clear
33
+ end
34
+
35
+ def initialize(attributes = {})
36
+ attributes.each do |name, value|
37
+ send("#{name}=", value)
38
+ end
39
+ end
40
+ #####
41
+ end
42
+
43
+ @subject = ProtectedRecord::UseCase::ChangeLog::Create
44
+
45
+ @protected_record = TestCase.new(knowledge: "power", power: "money")
46
+ @protected_record.save
47
+
48
+ @mock_change_log_record_class = MiniTest::Mock.new
49
+ @mock_change_log_record = MiniTest::Mock.new
50
+ @mock_user = MiniTest::Mock.new
51
+ @changes = JSON.generate(@protected_record.previous_changes)
52
+ @mock_change_log_record_class.expect(:new, @mock_change_log_record)
53
+ @mock_change_log_record.expect(:user=, @mock_user, [@mock_user])
54
+ @mock_change_log_record.expect(:recordable=, @protected_record, [@protected_record])
55
+ @mock_change_log_record.expect(:observed_changes=, @changes, [@changes])
56
+ @mock_change_log_record.expect(:save, true)
57
+
58
+ @dependencies = {
59
+ record_class: @mock_change_log_record_class,
60
+ user: @mock_user,
61
+ changed_object: @protected_record
62
+ }
63
+ end
64
+
65
+ it "initializes with required options" do
66
+ subject = @subject.new(@dependencies)
67
+
68
+ subject.must_be_instance_of @subject
69
+ end
70
+
71
+ it "initializes when options with defaults are omitted" do
72
+ subject = @subject.new(@dependencies.reject { |k| k == :record_class })
73
+
74
+ subject.must_be_instance_of @subject
75
+ end
76
+
77
+ it "fails to initialize without :user" do
78
+ begin
79
+ @subject.new(@dependencies.reject { |k| k == :user })
80
+ rescue => e
81
+ e.must_be_kind_of RuntimeError
82
+ end
83
+ end
84
+
85
+ it "fails to initialize without :changed_object" do
86
+ begin
87
+ @subject.new(@dependencies.reject { |k| k == :changed_object })
88
+ rescue => e
89
+ e.must_be_kind_of RuntimeError
90
+ end
91
+ end
92
+
93
+ it "returns a result" do
94
+ result = @subject.new(@dependencies).execute!
95
+
96
+ @mock_change_log_record.verify
97
+
98
+ result.must_be_kind_of(PayDirt::Result)
99
+ end
100
+
101
+ it "does the deed" do
102
+ result = @subject.new(@dependencies).execute!
103
+
104
+ @mock_change_log_record.verify
105
+
106
+ result.successful?.must_equal true
107
+ end
108
+
109
+ it "it's not successful if #save fails" do
110
+ @mock_change_log_record.save
111
+ @mock_change_log_record.expect(:save, false)
112
+
113
+ result = @subject.new(@dependencies).execute!
114
+
115
+ @mock_change_log_record.verify
116
+
117
+ result.successful?.must_equal false
118
+ end
119
+ end
120
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protected_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tad Hosford
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-24 00:00:00.000000000 Z
11
+ date: 2013-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pay_dirt