cia 0.5.3 → 0.5.4

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.
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cia (0.5.3)
4
+ cia (0.5.4)
5
+ json
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
@@ -25,6 +26,7 @@ GEM
25
26
  bump (0.3.9)
26
27
  diff-lcs (1.1.3)
27
28
  i18n (0.6.1)
29
+ json (1.8.0)
28
30
  multi_json (1.5.0)
29
31
  rake (10.0.3)
30
32
  rspec (2.12.0)
data/Readme.md CHANGED
@@ -81,7 +81,9 @@ CIA.audit(:actor => current_user, :my_pretty_audit_property => "12345") do
81
81
  ...
82
82
  end
83
83
 
84
-
84
+ # storing complex objects in old/new and reducing it's size if it's to big (serialized via json)
85
+ value = CIA::AttributeChange.serialize_for_storage(["some", "complex"*1000, "object"]){|too_big| too_big.delete_at(1); too_big }
86
+ CIA::AttributeChange.create!(:old_value => value)
85
87
  ```
86
88
 
87
89
 
@@ -9,4 +9,5 @@ Gem::Specification.new name, CIA::VERSION do |s|
9
9
  s.homepage = "http://github.com/grosser/#{name}"
10
10
  s.files = `git ls-files`.split("\n")
11
11
  s.license = 'MIT'
12
+ s.add_runtime_dependency "json"
12
13
  end
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: /Users/mgrosser/code/tools/cia
3
3
  specs:
4
- cia (0.5.2)
4
+ cia (0.5.3)
5
+ json
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
@@ -16,6 +17,7 @@ GEM
16
17
  rake
17
18
  bump (0.3.9)
18
19
  diff-lcs (1.1.3)
20
+ json (1.8.0)
19
21
  rake (0.9.2.2)
20
22
  rspec (2.10.0)
21
23
  rspec-core (~> 2.10.0)
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: /Users/mgrosser/code/tools/cia
3
3
  specs:
4
- cia (0.5.2)
4
+ cia (0.5.3)
5
+ json
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
@@ -25,6 +26,7 @@ GEM
25
26
  bump (0.3.9)
26
27
  diff-lcs (1.1.3)
27
28
  i18n (0.6.1)
29
+ json (1.8.0)
28
30
  multi_json (1.5.0)
29
31
  rake (10.0.3)
30
32
  rspec (2.12.0)
@@ -1,3 +1,5 @@
1
+ require "json"
2
+
1
3
  module CIA
2
4
  class AttributeChange < ActiveRecord::Base
3
5
  include SourceValidation
@@ -20,6 +22,25 @@ module CIA
20
22
  scoped(:conditions => {:attribute_name => attribute})
21
23
  end
22
24
 
25
+ def self.max_value_size
26
+ @max_value_size ||= columns.detect { |c| c.name == "old_value" }.limit
27
+ end
28
+
29
+ def self.serialize_for_storage(item, &block)
30
+ raise "Pass me a block to reduce size" unless block_given?
31
+ before, json = nil
32
+
33
+ loop do
34
+ json = JSON.dump(item)
35
+ raise "The block did not reduce the size" if before && json.bytesize >= before
36
+ before = json.bytesize
37
+ break if max_value_size >= before
38
+ item = yield(item)
39
+ end
40
+
41
+ json
42
+ end
43
+
23
44
  private
24
45
 
25
46
  def source_must_be_present?
@@ -1,3 +1,3 @@
1
1
  module CIA
2
- VERSION = '0.5.3'
2
+ VERSION = '0.5.4'
3
3
  end
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require 'spec_helper'
2
3
 
3
4
  describe CIA::AttributeChange do
@@ -62,4 +63,38 @@ describe CIA::AttributeChange do
62
63
  change.valid?.should be_true
63
64
  end
64
65
  end
66
+
67
+ describe ".max_value_size" do
68
+ it "is the width of the old/new column" do
69
+ CIA::AttributeChange.max_value_size.should == 255
70
+ end
71
+ end
72
+
73
+ describe ".serialize_for_storage" do
74
+ it "stores as json" do
75
+ CIA::AttributeChange.serialize_for_storage([["xxx"]]){}.should == '[["xxx"]]'
76
+ end
77
+
78
+ it "calls the block to remove an item" do
79
+ CIA::AttributeChange.serialize_for_storage([["xxx"], ["x"*300], ["yyy"]]){ |array| array.delete_at(1); array }.should == '[["xxx"],["yyy"]]'
80
+ end
81
+
82
+ it "blows up if block fails to reduce size to prevent loops" do
83
+ expect{
84
+ CIA::AttributeChange.serialize_for_storage([["xxx"], ["x"*300], ["yyy"]]){ |array| array }
85
+ }.to raise_error
86
+ end
87
+
88
+ it "takes multibyte into account" do
89
+ called = false
90
+ CIA::AttributeChange.serialize_for_storage(["å" * 200]){ |array| called = true; "x" }
91
+ called.should == true
92
+ end
93
+
94
+ it "does not go crazy on multibytes" do
95
+ called = false
96
+ CIA::AttributeChange.serialize_for_storage(["å" * 100]){ |array| called = true; "x" }
97
+ called.should == false
98
+ end
99
+ end
65
100
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cia
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.5.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-23 00:00:00.000000000 Z
13
- dependencies: []
12
+ date: 2013-05-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
14
30
  description:
15
31
  email: michael@grosser.it
16
32
  executables: []
@@ -54,7 +70,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
54
70
  version: '0'
55
71
  segments:
56
72
  - 0
57
- hash: 2131541393242182873
73
+ hash: 1152273165294657851
58
74
  required_rubygems_version: !ruby/object:Gem::Requirement
59
75
  none: false
60
76
  requirements:
@@ -63,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
79
  version: '0'
64
80
  segments:
65
81
  - 0
66
- hash: 2131541393242182873
82
+ hash: 1152273165294657851
67
83
  requirements: []
68
84
  rubyforge_project:
69
85
  rubygems_version: 1.8.25