rails-gdpr-export 1.0.2 → 2.0.0

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
  SHA256:
3
- metadata.gz: c0db6f0772529c9ff00bc550f978c2a1130e3a0c26bee3ed7ae885d2edb03ac4
4
- data.tar.gz: 7e759a11d04018a00cb3873560ecda0a93999e60a1fcaa1113bfd04b2a5c3ba3
3
+ metadata.gz: ad4eb505cc305ad42540e9e9ab33929f59a150efba6b9d06563dc6c740136b45
4
+ data.tar.gz: fb96f6b4c657d858cddf8ec3e9e79eb197f61b4a6962de4f5a9912093395540d
5
5
  SHA512:
6
- metadata.gz: e09269397d19fd581611e99566fd6e3e6e37bef7c9c1a0e3c5c706151913a0c3d37bea7a27e655acc7f37d0dc1bbcc5762453a441b5c3653c867b5b425205b21
7
- data.tar.gz: 87f8158262f3a001f0dbb5fc5fb16c71278a19bff6226f89a16fd5704e0c4fd408055d8bfc6d6db6c6a90c8e9fcf484d1fa2d8838eab5cbcf727322bd39c085b
6
+ metadata.gz: 2252ca7bd625c33236d582a49444dd5e8a2362632a3c94f5fdc2dd67482f32092a2a5726d3139f5700cfc8cd27d718001d0bb9035139af6b1e93f6309d89efce
7
+ data.tar.gz: a31b4ed3fdfff06f7fbc0a99b69054b6024bda5a679c90711b1ec8d3c745f54f2446f86716fc152d4d0ad80a51c54228dd1dbb56a1f496f0a2bdf670fcd77118
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rails-gdpr-export (1.0.2)
4
+ rails-gdpr-export (2.0.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -41,23 +41,27 @@ The call target is a rails model and its arguments are:
41
41
  renamed_fields: {<field_from_db> => <field_name_in_output>}
42
42
  table_name: <the new table name in output>
43
43
  description: <a comment>
44
- join: <an association>}
44
+ joins: [<an array of associations>]}
45
45
  ```
46
+ When `joins` is specified, the fields of an association should be defined as `<association_name> <field_name>`.
46
47
 
47
48
  #### Example
48
49
 
49
50
  ```ruby
50
51
  User.gdpr_collect :email, :last_sign_in_at, :type, :forward_mailbox,
52
+ "program title",
51
53
  {user_id: :id,
52
54
  renamed_fields: {sign_in_count: "sign in count",
53
55
  current_sign_in_at: "time of current sign in",
54
56
  chosen_program_id: "chosen program",
55
57
  current_sign_in_ip: "current IP address",
56
- last_sign_in_ip: "previously used IP address"}}
58
+ last_sign_in_ip: "previously used IP address"},
59
+ joins: [:program]}
57
60
  ```
58
61
 
59
62
  From your `User` model, you want to retrieve the values of the fields `email, last_sign_in_at,
60
63
  type, forward_mailbox`, in addition to the fields `sign_in_count, current_sign_in_at, chosen_program_id, current_sign_in_ip, last_sign_in_ip`. However for the latter you want their csv header to be renamed. And the field representing the user in the `User` model is `id`.
64
+ `User` has also an association with `program` and you want to value of its field `title`.
61
65
 
62
66
  ### Data export
63
67
  Finally, call `GdprExporter.export(<user_id>)` to return a csv formatted output of all the fields you specified previously.
@@ -18,7 +18,7 @@ module GdprExporter
18
18
  # Collects data through all the tagged models and generates a csv
19
19
  # formatted output
20
20
  def self.export(user_id)
21
- CSV.generate do |csv|
21
+ CSV.generate(force_quotes: true) do |csv|
22
22
  get_klasses.each do |klass|
23
23
  rows = klass.gdpr_query(user_id)
24
24
  klass.gdpr_export(rows, csv)
@@ -91,12 +91,17 @@ module GdprExporter
91
91
  # Adds the class method 'gdpr_query' to the eigenclass.
92
92
  # It will execute the query.
93
93
  self.define_singleton_method(:gdpr_query) do |_user_id|
94
- if hash_params[:join]
95
- self.select(query_fields).where(user_id_field => _user_id).
96
- joins(hash_params[:join])
97
- else
98
- self.select(query_fields).where(user_id_field => _user_id)
94
+ result = self.where(user_id_field => _user_id)
95
+
96
+ # When there are multiple joins defined, just keep calling 'joins'
97
+ # for each association.
98
+ if hash_params[:joins]
99
+ result = hash_params[:joins].inject(result) do | query, assoc |
100
+ query.send(:joins, assoc)
101
+ end
99
102
  end
103
+
104
+ result
100
105
  end
101
106
 
102
107
  # Adds a method to export to csv to the eigenclass.
@@ -105,11 +110,26 @@ module GdprExporter
105
110
 
106
111
  csv << (hash_params[:table_name] ? [hash_params[:table_name]] :
107
112
  [self.to_s])
113
+
114
+ if hash_params[:desc]
115
+ csv << ['Description:', hash_params[:desc]]
116
+ end
117
+
108
118
  csv << csv_headers
109
119
  rows.each do |r|
110
- csv << query_fields.map{ |f| r.send(f) }
120
+ csv << query_fields.map do |f|
121
+ f_splitted = f.to_s.split(' ')
122
+ if (f_splitted.size == 2)
123
+ # field f is coming from an assoc, i.e. field has been defined
124
+ # as "<tablename> <field>" in gdpr_collect then to get its value
125
+ # do r.<tablename>.<field>
126
+ f_splitted.inject(r) { |result, method| result.send(method) }
127
+ else
128
+ # No association involved, simply retrieve the field value.
129
+ r.send(f)
130
+ end
131
+ end
111
132
  end
112
- csv << ['Comment:', hash_params[:desc]] if hash_params[:desc]
113
133
  csv << []
114
134
  end
115
135
  end
@@ -1,5 +1,5 @@
1
1
  module Exts
2
2
  module Gdpr
3
- VERSION = "1.0.2"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
  end
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Chrislain Razafimahefa"]
10
10
  spec.email = ["razafima@gmail.com"]
11
11
 
12
- spec.summary = %q{A gem to export personal data in compliance with GDPR.}
12
+ spec.summary = %q{A rails gem to export personal data in compliance with GDPR.}
13
13
  spec.homepage = "https://github.com/epfl-exts/rails-gdpr-export"
14
14
  spec.license = "MIT"
15
15
 
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: 1.0.2
4
+ version: 2.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-16 00:00:00.000000000 Z
11
+ date: 2018-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -95,5 +95,5 @@ rubyforge_project:
95
95
  rubygems_version: 2.7.6
96
96
  signing_key:
97
97
  specification_version: 4
98
- summary: A gem to export personal data in compliance with GDPR.
98
+ summary: A rails gem to export personal data in compliance with GDPR.
99
99
  test_files: []