anonymizer 0.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.
@@ -0,0 +1,28 @@
1
+
2
+ <?xml version="1.0" encoding="iso-8859-1"?>
3
+ <!DOCTYPE html
4
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
5
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6
+
7
+ <!--
8
+
9
+ Files
10
+
11
+ -->
12
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
13
+ <head>
14
+ <title>Files</title>
15
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
16
+ <link rel="stylesheet" href="rdoc-style.css" type="text/css" />
17
+ <base target="docwin" />
18
+ </head>
19
+ <body>
20
+ <div id="index">
21
+ <h1 class="section-bar">Files</h1>
22
+ <div id="index-entries">
23
+ <a href="files/bin/anonymize_data_rb.html">bin/anonymize_data.rb</a><br />
24
+ <a href="files/lib/anonymizer_rb.html">lib/anonymizer.rb</a><br />
25
+ </div>
26
+ </div>
27
+ </body>
28
+ </html>
@@ -0,0 +1,31 @@
1
+
2
+ <?xml version="1.0" encoding="iso-8859-1"?>
3
+ <!DOCTYPE html
4
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
5
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6
+
7
+ <!--
8
+
9
+ Methods
10
+
11
+ -->
12
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
13
+ <head>
14
+ <title>Methods</title>
15
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
16
+ <link rel="stylesheet" href="rdoc-style.css" type="text/css" />
17
+ <base target="docwin" />
18
+ </head>
19
+ <body>
20
+ <div id="index">
21
+ <h1 class="section-bar">Methods</h1>
22
+ <div id="index-entries">
23
+ <a href="classes/Anonymizer.html#M000004">anonymize (Anonymizer)</a><br />
24
+ <a href="classes/Anonymizer.html#M000003">new (Anonymizer)</a><br />
25
+ <a href="classes/Array.html#M000001">pick (Array)</a><br />
26
+ <a href="classes/Array.html#M000002">pick! (Array)</a><br />
27
+ <a href="classes/Anonymizer.html#M000005">record_to (Anonymizer)</a><br />
28
+ </div>
29
+ </div>
30
+ </body>
31
+ </html>
@@ -0,0 +1,24 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
5
+
6
+ <!--
7
+
8
+ RDoc Documentation
9
+
10
+ -->
11
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
12
+ <head>
13
+ <title>RDoc Documentation</title>
14
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
15
+ </head>
16
+ <frameset rows="20%, 80%">
17
+ <frameset cols="25%,35%,45%">
18
+ <frame src="fr_file_index.html" title="Files" name="Files" />
19
+ <frame src="fr_class_index.html" name="Classes" />
20
+ <frame src="fr_method_index.html" name="Methods" />
21
+ </frameset>
22
+ <frame src="files/bin/anonymize_data_rb.html" name="docwin" />
23
+ </frameset>
24
+ </html>
@@ -0,0 +1,208 @@
1
+
2
+ body {
3
+ font-family: Verdana,Arial,Helvetica,sans-serif;
4
+ font-size: 90%;
5
+ margin: 0;
6
+ margin-left: 40px;
7
+ padding: 0;
8
+ background: white;
9
+ }
10
+
11
+ h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
12
+ h1 { font-size: 150%; }
13
+ h2,h3,h4 { margin-top: 1em; }
14
+
15
+ a { background: #eef; color: #039; text-decoration: none; }
16
+ a:hover { background: #039; color: #eef; }
17
+
18
+ /* Override the base stylesheet's Anchor inside a table cell */
19
+ td > a {
20
+ background: transparent;
21
+ color: #039;
22
+ text-decoration: none;
23
+ }
24
+
25
+ /* and inside a section title */
26
+ .section-title > a {
27
+ background: transparent;
28
+ color: #eee;
29
+ text-decoration: none;
30
+ }
31
+
32
+ /* === Structural elements =================================== */
33
+
34
+ div#index {
35
+ margin: 0;
36
+ margin-left: -40px;
37
+ padding: 0;
38
+ font-size: 90%;
39
+ }
40
+
41
+
42
+ div#index a {
43
+ margin-left: 0.7em;
44
+ }
45
+
46
+ div#index .section-bar {
47
+ margin-left: 0px;
48
+ padding-left: 0.7em;
49
+ background: #ccc;
50
+ font-size: small;
51
+ }
52
+
53
+
54
+ div#classHeader, div#fileHeader {
55
+ width: auto;
56
+ color: white;
57
+ padding: 0.5em 1.5em 0.5em 1.5em;
58
+ margin: 0;
59
+ margin-left: -40px;
60
+ border-bottom: 3px solid #006;
61
+ }
62
+
63
+ div#classHeader a, div#fileHeader a {
64
+ background: inherit;
65
+ color: white;
66
+ }
67
+
68
+ div#classHeader td, div#fileHeader td {
69
+ background: inherit;
70
+ color: white;
71
+ }
72
+
73
+
74
+ div#fileHeader {
75
+ background: #057;
76
+ }
77
+
78
+ div#classHeader {
79
+ background: #048;
80
+ }
81
+
82
+
83
+ .class-name-in-header {
84
+ font-size: 180%;
85
+ font-weight: bold;
86
+ }
87
+
88
+
89
+ div#bodyContent {
90
+ padding: 0 1.5em 0 1.5em;
91
+ }
92
+
93
+ div#description {
94
+ padding: 0.5em 1.5em;
95
+ background: #efefef;
96
+ border: 1px dotted #999;
97
+ }
98
+
99
+ div#description h1,h2,h3,h4,h5,h6 {
100
+ color: #125;;
101
+ background: transparent;
102
+ }
103
+
104
+ div#validator-badges {
105
+ text-align: center;
106
+ }
107
+ div#validator-badges img { border: 0; }
108
+
109
+ div#copyright {
110
+ color: #333;
111
+ background: #efefef;
112
+ font: 0.75em sans-serif;
113
+ margin-top: 5em;
114
+ margin-bottom: 0;
115
+ padding: 0.5em 2em;
116
+ }
117
+
118
+
119
+ /* === Classes =================================== */
120
+
121
+ table.header-table {
122
+ color: white;
123
+ font-size: small;
124
+ }
125
+
126
+ .type-note {
127
+ font-size: small;
128
+ color: #DEDEDE;
129
+ }
130
+
131
+ .xxsection-bar {
132
+ background: #eee;
133
+ color: #333;
134
+ padding: 3px;
135
+ }
136
+
137
+ .section-bar {
138
+ color: #333;
139
+ border-bottom: 1px solid #999;
140
+ margin-left: -20px;
141
+ }
142
+
143
+
144
+ .section-title {
145
+ background: #79a;
146
+ color: #eee;
147
+ padding: 3px;
148
+ margin-top: 2em;
149
+ margin-left: -30px;
150
+ border: 1px solid #999;
151
+ }
152
+
153
+ .top-aligned-row { vertical-align: top }
154
+ .bottom-aligned-row { vertical-align: bottom }
155
+
156
+ /* --- Context section classes ----------------------- */
157
+
158
+ .context-row { }
159
+ .context-item-name { font-family: monospace; font-weight: bold; color: black; }
160
+ .context-item-value { font-size: small; color: #448; }
161
+ .context-item-desc { color: #333; padding-left: 2em; }
162
+
163
+ /* --- Method classes -------------------------- */
164
+ .method-detail {
165
+ background: #efefef;
166
+ padding: 0;
167
+ margin-top: 0.5em;
168
+ margin-bottom: 1em;
169
+ border: 1px dotted #ccc;
170
+ }
171
+ .method-heading {
172
+ color: black;
173
+ background: #ccc;
174
+ border-bottom: 1px solid #666;
175
+ padding: 0.2em 0.5em 0 0.5em;
176
+ }
177
+ .method-signature { color: black; background: inherit; }
178
+ .method-name { font-weight: bold; }
179
+ .method-args { font-style: italic; }
180
+ .method-description { padding: 0 0.5em 0 0.5em; }
181
+
182
+ /* --- Source code sections -------------------- */
183
+
184
+ a.source-toggle { font-size: 90%; }
185
+ div.method-source-code {
186
+ background: #262626;
187
+ color: #ffdead;
188
+ margin: 1em;
189
+ padding: 0.5em;
190
+ border: 1px dashed #999;
191
+ overflow: hidden;
192
+ }
193
+
194
+ div.method-source-code pre { color: #ffdead; overflow: hidden; }
195
+
196
+ /* --- Ruby keyword styles --------------------- */
197
+
198
+ .standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
199
+
200
+ .ruby-constant { color: #7fffd4; background: transparent; }
201
+ .ruby-keyword { color: #00ffff; background: transparent; }
202
+ .ruby-ivar { color: #eedd82; background: transparent; }
203
+ .ruby-operator { color: #00ffee; background: transparent; }
204
+ .ruby-identifier { color: #ffdead; background: transparent; }
205
+ .ruby-node { color: #ffa07a; background: transparent; }
206
+ .ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
207
+ .ruby-regexp { color: #ffa07a; background: transparent; }
208
+ .ruby-value { color: #7fffd4; background: transparent; }
@@ -0,0 +1,118 @@
1
+ require 'fileutils'
2
+ require 'yaml'
3
+
4
+ class Anonymizer
5
+
6
+ # an array of strings, the paths to the items to be anonymized
7
+ attr_accessor :filepaths
8
+ # a string, the directory to which all of the anoymizations and the key should be copied
9
+ attr_accessor :destination_dir
10
+ # a hash, the keys are the original filepaths, the values are the corresponding anonymized names
11
+ attr_accessor :anonymizations
12
+
13
+
14
+ # Creates a new instance with an array of filepaths (strings)
15
+ # A new set of anaonymizations will be created automatically at initialization. If you want to reshuffle the
16
+ # anonymizations you can call anonymize at any time afterward.
17
+ def initialize(filepaths)
18
+ @filepaths = filepaths
19
+ @anonymizations = Hash.new
20
+ anonymize
21
+ end
22
+
23
+
24
+ # Reshuffles the anonymized names
25
+ def anonymize
26
+ keys = Array.new(@filepaths)
27
+ idx = 0
28
+ ndigits = (Math.log10(@filepaths.length)+1).floor
29
+ until keys.empty?
30
+ @anonymizations[keys.pick!] = "%0#{ndigits}d" % idx
31
+ idx += 1
32
+ end
33
+ end
34
+
35
+
36
+ # Copies the collection of files/directories to the destination directory using the current anonymized names. Records
37
+ # the anonymizations in a keymap.yml file.
38
+ #
39
+ # === Options
40
+ # :inclue_csv => true -- writes the csv format keymap in addition to the yaml
41
+ #
42
+ # :keymap_name => "basename" -- uses an alternate file basename for the keymap files (the default is "keymap")
43
+ #
44
+ def record_to(destination_dir, options = {})
45
+ raise(IOError, "Destination directory not found.") unless File.exists?(destination_dir) and File.directory?(destination_dir)
46
+ @anonymizations.each do |orig, anon|
47
+ copy_directory_or_file(orig, File.join(destination_dir, anon))
48
+ end
49
+ keymap_filename = options[:keymap_name].nil? ? "keymap" : options[:keymap_name]
50
+ write_yml(destination_dir, keymap_filename + '.yml')
51
+ write_csv(destination_dir, keymap_filename + '.csv') if options[:include_csv]
52
+ end
53
+
54
+
55
+ private
56
+
57
+
58
+ # recursively copies directories, simply copies files preserving file extension.
59
+ def copy_directory_or_file(orig, dest)
60
+ raise(IOError, "Original file or directory not found: #{orig}") unless File.exists?(orig)
61
+ if File.directory?(orig) # recursively copy directories
62
+ FileUtils.cp_r(orig, dest)
63
+ else # simple copy of files, but preserve file extensions
64
+ ext = File.extname(orig)
65
+ FileUtils.cp(orig, dest + ext)
66
+ end
67
+ end
68
+
69
+
70
+ # creates yaml text based on current anonymization
71
+ def to_yaml
72
+ @anonymizations.to_yaml
73
+ end
74
+
75
+
76
+ # creates csv text based on current anonymization
77
+ def to_csv
78
+ csv_contents = ""
79
+ @anonymizations.each do |orig, anon|
80
+ csv_contents += "#{orig}, #{anon}\n"
81
+ end
82
+ return csv_contents
83
+ end
84
+
85
+
86
+ # writes the current anonymization yaml to a file
87
+ def write_yml(destination_dir,keymap_filename)
88
+ File.open(File.join(destination_dir,keymap_filename), 'w') do |out|
89
+ YAML.dump(@anonymizations, out)
90
+ end
91
+ end
92
+
93
+
94
+ # writes the current anonymization csv to a file
95
+ def write_csv(destination_dir,keymap_filename)
96
+ File.open(File.join(destination_dir,keymap_filename), 'w') do |out|
97
+ out.write(to_csv)
98
+ end
99
+ end
100
+
101
+ end
102
+
103
+
104
+
105
+ # Augments the ruby array class with a couple convenient random picking methods
106
+ class Array
107
+
108
+ # Picks one value from the array at random, array remains unchanged.
109
+ def pick
110
+ at(rand(length))
111
+ end
112
+
113
+ # Removes and returns one element of the array at random, the original array is changed by this method.
114
+ def pick!
115
+ delete_at(rand(length))
116
+ end
117
+
118
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: anonymizer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Kristopher J. Kosmatka
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-10 00:00:00 -06:00
13
+ default_executable: anonymize_data.rb
14
+ dependencies: []
15
+
16
+ description: Anonymizes a collection of files and/or directories for interrater reliabiliy analyses and the like.
17
+ email: kk4@medicine.wisc.edu
18
+ executables:
19
+ - anonymize_data.rb
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.rdoc
24
+ files:
25
+ - .gitignore
26
+ - Manifest
27
+ - README.rdoc
28
+ - Rakefile
29
+ - VERSION
30
+ - anonymizer-0.1.0.gem
31
+ - anonymizer.gemspec
32
+ - bin/anonymize_data.rb
33
+ - doc/classes/Anonymizer.html
34
+ - doc/classes/Anonymizer.src/M000003.html
35
+ - doc/classes/Anonymizer.src/M000004.html
36
+ - doc/classes/Anonymizer.src/M000005.html
37
+ - doc/classes/Array.html
38
+ - doc/classes/Array.src/M000001.html
39
+ - doc/classes/Array.src/M000002.html
40
+ - doc/created.rid
41
+ - doc/files/bin/anonymize_data_rb.html
42
+ - doc/files/lib/anonymizer_rb.html
43
+ - doc/fr_class_index.html
44
+ - doc/fr_file_index.html
45
+ - doc/fr_method_index.html
46
+ - doc/index.html
47
+ - doc/rdoc-style.css
48
+ - lib/anonymizer.rb
49
+ has_rdoc: true
50
+ homepage: http://github.com/brainmap/anonymizer
51
+ licenses: []
52
+
53
+ post_install_message:
54
+ rdoc_options:
55
+ - --charset=UTF-8
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ version:
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ requirements: []
71
+
72
+ rubyforge_project:
73
+ rubygems_version: 1.3.5
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: Anonymizes a collection of files and/or directories for interrater reliabiliy analyses and the like.
77
+ test_files: []
78
+