rails-gdpr-export 0.1.1 → 1.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +22 -21
- data/lib/gdpr_exporter.rb +112 -0
- data/lib/{exts/gdpr → gdpr_exporter}/version.rb +1 -1
- data/rails-gdpr-export.gemspec +1 -1
- metadata +4 -4
- data/lib/exts/gdpr.rb +0 -114
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7071e26a9662f67d80d9c59a8ee5dcb3d896682b63094b8fd37c288f73ebb052
|
4
|
+
data.tar.gz: 0f10a671e075a4fc691b88a99d905434e93ce189b81adc90a7e89a59fac5c1c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96fa84ddc1af458eb2e6a545644159c5fae81667cbc032182b70ac6f8fc99d6071f996be7cf3a1f9ad67086e12254849e2c2eb8324d8a54ee15e631d01696cda
|
7
|
+
data.tar.gz: efb60c1bf1fc6e1503d856b5e57ef591d6c9f7e52a1f169a861395469ebcc53ec0c1b171cb0c0498bdc132a7536e5ffe22b90317f99abd271640db3550b15e06
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -20,17 +20,30 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
|
23
|
-
|
23
|
+
This gem allows you to specify fields that you want to retrieve from your models and to export them in a csv format.
|
24
|
+
|
25
|
+
### Initialization
|
26
|
+
|
27
|
+
To initialize the gem usage, loads the GdprExporter module into activerecord classes. Do this at initialization time through an initializer. E.g. create a initializers/gdpr.rb file and add the following:
|
24
28
|
|
25
29
|
```ruby
|
26
|
-
|
30
|
+
ActiveRecord::Base.send :include, GdprExporter
|
31
|
+
```
|
27
32
|
|
28
|
-
|
29
|
-
ActiveRecord::Base.send :include, Exts::Gdpr
|
33
|
+
### Data collection
|
30
34
|
|
35
|
+
In order to specify the fields that you want to return to the user you need to call `ruby gdpr_collect`.
|
36
|
+
The call target is a rails model and its arguments are as follows:
|
37
|
+
* set of simple fields: i.e. fields that will be output as is
|
38
|
+
* a hash of params:
|
39
|
+
{user_id: <the field in the model used as alias for the user id>
|
40
|
+
renamed_fields: {<field_from_db> => <field_name_in_output>}
|
41
|
+
table_name: <the new table name in output>
|
42
|
+
description: <a comment>
|
43
|
+
join: <an association>}
|
31
44
|
|
32
|
-
|
33
|
-
|
45
|
+
|
46
|
+
```ruby
|
34
47
|
User.gdpr_collect :email, :last_sign_in_at, :stripe_customer_id,
|
35
48
|
:type, :forward_mailbox,
|
36
49
|
{user_id: :id,
|
@@ -39,25 +52,13 @@ User.gdpr_collect :email, :last_sign_in_at, :stripe_customer_id,
|
|
39
52
|
chosen_program_id: "chosen program",
|
40
53
|
current_sign_in_ip: "current IP address",
|
41
54
|
last_sign_in_ip: "previously used IP address"}}
|
42
|
-
|
43
|
-
|
44
|
-
Subscription.gdpr_collect :stripe_id, :stripe_plan_id,
|
45
|
-
:exmatriculated_at, :current_period_end, :status,
|
46
|
-
:notified_at, :pause_reason, :pause_error,
|
47
|
-
:start_at, :initial_start_at, :completed_at,
|
48
|
-
:amount, :paused_at, :rules_accepted_at,
|
49
|
-
{user_id: :user_id,
|
50
|
-
join: :program,
|
51
|
-
renamed_fields: {title: "program title"}}
|
52
55
|
```
|
53
56
|
|
54
|
-
|
55
|
-
|
56
|
-
## Development
|
57
|
+
```
|
57
58
|
|
58
|
-
|
59
|
+
### Data export
|
60
|
+
Call `ruby GdprExporter.export(<user_id>)` and it will return a csv formatted output.
|
59
61
|
|
60
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
61
62
|
|
62
63
|
## Contributing
|
63
64
|
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "gdpr_exporter/version"
|
4
|
+
require 'csv'
|
5
|
+
|
6
|
+
module GdprExporter
|
7
|
+
# Stores all the classes that have been tagged for gdpr collection
|
8
|
+
@@klasses = []
|
9
|
+
|
10
|
+
def self.get_klasses
|
11
|
+
@@klasses
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.add_klass(klass)
|
15
|
+
@@klasses << klass
|
16
|
+
end
|
17
|
+
|
18
|
+
# Collects data through all the tagged models and generates a csv
|
19
|
+
# formatted output
|
20
|
+
def self.export(user_id)
|
21
|
+
CSV.generate do |csv|
|
22
|
+
get_klasses.each do |klass|
|
23
|
+
rows = klass.gdpr_query(user_id)
|
24
|
+
klass.gdpr_export(rows, csv)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Instruments the classes implementing this module with instance and class
|
30
|
+
# methods.
|
31
|
+
def self.included base
|
32
|
+
base.send :include, InstanceMethods
|
33
|
+
base.extend ClassMethods
|
34
|
+
end
|
35
|
+
|
36
|
+
module InstanceMethods
|
37
|
+
end
|
38
|
+
|
39
|
+
module ClassMethods
|
40
|
+
# Declared in each model class with interest in collecting gdpr data.
|
41
|
+
# Instruments the singleton of those classes so that gdpr data can be
|
42
|
+
# collected and exported to csv.
|
43
|
+
#
|
44
|
+
# Arguments are:
|
45
|
+
# - set of simple fields: i.e. fields that will be output as is
|
46
|
+
# - a hash of params:
|
47
|
+
# {renamed_fields: {<field_from_db> => <field_name_in_output>}
|
48
|
+
# table_name: <the new table name in output>
|
49
|
+
# description: <a comment>
|
50
|
+
# join: <an association>}
|
51
|
+
def gdpr_collect(*args)
|
52
|
+
# Params handling
|
53
|
+
if args.class == Hash # when user provides the hash_params only
|
54
|
+
simple_fields, hash_params = [[], args]
|
55
|
+
else
|
56
|
+
simple_fields, hash_params = [args[0..-2], args.last]
|
57
|
+
end
|
58
|
+
|
59
|
+
unless hash_params.class == Hash
|
60
|
+
raise "Gdpr fields collection error: last argument must be a hash!"
|
61
|
+
end
|
62
|
+
|
63
|
+
unless hash_params.key?(:user_id)
|
64
|
+
raise "Gdpr fields collection error: the field aliasing user_id is not declared for '#{self}'!"
|
65
|
+
end
|
66
|
+
|
67
|
+
# Adds the eigen class to the set of classes eligible for gdpr data collection.
|
68
|
+
GdprExporter.add_klass(self)
|
69
|
+
|
70
|
+
# Adds instance fields to the eigenclass. They store
|
71
|
+
# all the fields and info we are interested in.
|
72
|
+
@gdpr_simple_fields = simple_fields
|
73
|
+
@gdpr_hash_params = hash_params
|
74
|
+
# Add readers for the instance vars declared above (for testing reasons)
|
75
|
+
self.class.send :attr_reader, :gdpr_simple_fields
|
76
|
+
self.class.send :attr_reader, :gdpr_hash_params
|
77
|
+
|
78
|
+
# Build the csv header and prepare the fields used for querying
|
79
|
+
user_id_field = hash_params[:user_id]
|
80
|
+
csv_headers = [:user_id].concat @gdpr_simple_fields
|
81
|
+
query_fields = [user_id_field].concat @gdpr_simple_fields
|
82
|
+
|
83
|
+
if hash_params[:renamed_fields]
|
84
|
+
csv_headers.concat hash_params[:renamed_fields].values
|
85
|
+
query_fields.concat hash_params[:renamed_fields].keys
|
86
|
+
end
|
87
|
+
|
88
|
+
# Adds the class method 'gdpr_query' to the eigenclass.
|
89
|
+
# It will execute the query.
|
90
|
+
self.define_singleton_method(:gdpr_query) do |_user_id|
|
91
|
+
if hash_params[:join]
|
92
|
+
self.select(query_fields).where(user_id_field => _user_id).
|
93
|
+
joins(hash_params[:join])
|
94
|
+
else
|
95
|
+
self.select(query_fields).where(user_id_field => _user_id)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Adds a method to export to csv to the eigenclass.
|
100
|
+
self.define_singleton_method(:gdpr_export) do |rows, csv|
|
101
|
+
csv << (hash_params[:table_name] ? [hash_params[:table_name]] :
|
102
|
+
[self.to_s])
|
103
|
+
csv << csv_headers
|
104
|
+
rows.each do |r|
|
105
|
+
csv << query_fields.map{ |f| r.send(f) }
|
106
|
+
end
|
107
|
+
csv << ['Comment:', hash_params[:desc]] if hash_params[:desc]
|
108
|
+
csv << []
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
data/rails-gdpr-export.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-gdpr-export
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chrislain Razafimahefa
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-05-
|
11
|
+
date: 2018-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -69,8 +69,8 @@ files:
|
|
69
69
|
- Rakefile
|
70
70
|
- bin/console
|
71
71
|
- bin/setup
|
72
|
-
- lib/
|
73
|
-
- lib/
|
72
|
+
- lib/gdpr_exporter.rb
|
73
|
+
- lib/gdpr_exporter/version.rb
|
74
74
|
- rails-gdpr-export.gemspec
|
75
75
|
homepage: https://github.com/epfl-exts/rails-gdpr-export
|
76
76
|
licenses:
|
data/lib/exts/gdpr.rb
DELETED
@@ -1,114 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "exts/gdpr/version"
|
4
|
-
require 'csv'
|
5
|
-
|
6
|
-
module Exts
|
7
|
-
module Gdpr
|
8
|
-
# Stores all the classes that have been tagged for gdpr collection
|
9
|
-
@@klasses = []
|
10
|
-
|
11
|
-
def self.get_klasses
|
12
|
-
@@klasses
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.add_klass(klass)
|
16
|
-
@@klasses << klass
|
17
|
-
end
|
18
|
-
|
19
|
-
# Collects data through all the tagged models and generates a csv
|
20
|
-
# formatted output
|
21
|
-
def self.export(user_id)
|
22
|
-
CSV.generate do |csv|
|
23
|
-
get_klasses.each do |klass|
|
24
|
-
rows = klass.gdpr_query(user_id)
|
25
|
-
klass.gdpr_export(rows, csv)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# Instruments the classes implementing this module with instance and class
|
31
|
-
# methods.
|
32
|
-
def self.included base
|
33
|
-
base.send :include, InstanceMethods
|
34
|
-
base.extend ClassMethods
|
35
|
-
end
|
36
|
-
|
37
|
-
module InstanceMethods
|
38
|
-
end
|
39
|
-
|
40
|
-
module ClassMethods
|
41
|
-
# Declared in each model class with interest in collecting gdpr data.
|
42
|
-
# Instruments the singleton of those classes so that gdpr data can be
|
43
|
-
# collected and exported to csv.
|
44
|
-
#
|
45
|
-
# Arguments are:
|
46
|
-
# - set of simple fields: i.e. fields that will be output as is
|
47
|
-
# - a hash of params:
|
48
|
-
# {renamed_fields: {<field_from_db> => <field_name_in_output>}
|
49
|
-
# table_name: <the new table name in output>
|
50
|
-
# description: <a comment>
|
51
|
-
# join: <an association>}
|
52
|
-
def gdpr_collect(*args)
|
53
|
-
# Params handling
|
54
|
-
if args.class == Hash # when user provides the hash_params only
|
55
|
-
simple_fields, hash_params = [[], args]
|
56
|
-
else
|
57
|
-
simple_fields, hash_params = [args[0..-2], args.last]
|
58
|
-
end
|
59
|
-
|
60
|
-
unless hash_params.class == Hash
|
61
|
-
raise "Gdpr fields collection error: last argument must be a hash!"
|
62
|
-
end
|
63
|
-
|
64
|
-
unless hash_params.key?(:user_id)
|
65
|
-
raise "Gdpr fields collection error: the field aliasing user_id is not declared for '#{self}'!"
|
66
|
-
end
|
67
|
-
|
68
|
-
# Adds the eigen class to the set of classes eligible for gdpr data collection.
|
69
|
-
Gdpr.add_klass(self)
|
70
|
-
|
71
|
-
# Adds instance fields to the eigenclass. They store
|
72
|
-
# all the fields and info we are interested in.
|
73
|
-
@gdpr_simple_fields = simple_fields
|
74
|
-
@gdpr_hash_params = hash_params
|
75
|
-
# Add readers for the instance vars declared above (for testing reasons)
|
76
|
-
self.class.send :attr_reader, :gdpr_simple_fields
|
77
|
-
self.class.send :attr_reader, :gdpr_hash_params
|
78
|
-
|
79
|
-
# Build the csv header and prepare the fields used for querying
|
80
|
-
user_id_field = hash_params[:user_id]
|
81
|
-
csv_headers = [:user_id].concat @gdpr_simple_fields
|
82
|
-
query_fields = [user_id_field].concat @gdpr_simple_fields
|
83
|
-
|
84
|
-
if hash_params[:renamed_fields]
|
85
|
-
csv_headers.concat hash_params[:renamed_fields].values
|
86
|
-
query_fields.concat hash_params[:renamed_fields].keys
|
87
|
-
end
|
88
|
-
|
89
|
-
# Adds the class method 'gdpr_query' to the eigenclass.
|
90
|
-
# It will execute the query.
|
91
|
-
self.define_singleton_method(:gdpr_query) do |_user_id|
|
92
|
-
if hash_params[:join]
|
93
|
-
self.select(query_fields).where(user_id_field => _user_id).
|
94
|
-
joins(hash_params[:join])
|
95
|
-
else
|
96
|
-
self.select(query_fields).where(user_id_field => _user_id)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
# Adds a method to export to csv to the eigenclass.
|
101
|
-
self.define_singleton_method(:gdpr_export) do |rows, csv|
|
102
|
-
csv << (hash_params[:table_name] ? [hash_params[:table_name]] :
|
103
|
-
[self.to_s])
|
104
|
-
csv << csv_headers
|
105
|
-
rows.each do |r|
|
106
|
-
csv << query_fields.map{ |f| r.send(f) }
|
107
|
-
end
|
108
|
-
csv << ['Comment:', hash_params[:desc]] if hash_params[:desc]
|
109
|
-
csv << []
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|