paper_trail-background 1.0.2 → 1.2.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: 5d7eb4d4736445162a12914384f65ad4760e688bfe6c26787d4ff7336fbb815b
4
- data.tar.gz: d95bfdb749e6ab9a4ea5dfaf21114358fd72d06e491cdb9a63cfa5d19f840823
3
+ metadata.gz: 9e2dd49405269a4a58d9c53508f93b9170df368c38222432bda11b91ba2d7c5a
4
+ data.tar.gz: 1b1f557c3af6f3176135bcbff57f47aec91820a1572b495a40c82711be0fb2f9
5
5
  SHA512:
6
- metadata.gz: 0df8002e3d4be6c5fbfd1685ff15f1ad96c082ec4372b60889ae6e8069644434f279c4be739f69faec47b884a59b4f7e72850d45d7d1d514c1d1c91ab3e38143
7
- data.tar.gz: 4a40ffde33496ad1d3b4a0dd7bed969e50ec18b42d16820b4b58fbc04ebf24bee8f4b0244dcce58bb4d08b2837e82bdf7cb8161bd31070faadafe5d4b0e582ab
6
+ metadata.gz: d050650a0468c2187a8edbf15b486014216452c837a52cc51a8c4c0f71ce0975990399cc244f9f5693a3862a4ffa692837b680fb44c9245db00c39df48451d6b
7
+ data.tar.gz: 49155e0c1239a58b7ac2119fd7aced16ab708cbcf3bb13f52af94167d6d9e4fba6fc4541fbc1e13b7487d38976180302fff73fffbf693931959611e077cc77b9
data/LICENSE ADDED
@@ -0,0 +1,440 @@
1
+ HIPPOCRATIC LICENSE
2
+
3
+ Version 3.0, October 2021
4
+
5
+ https://firstdonoharm.dev/version/3/0/full.txt
6
+
7
+ TERMS AND CONDITIONS
8
+
9
+ TERMS AND CONDITIONS FOR USE, COPY, MODIFICATION, PREPARATION OF DERIVATIVE
10
+ WORK, REPRODUCTION, AND DISTRIBUTION:
11
+
12
+ 1. DEFINITIONS:
13
+
14
+ This section defines certain terms used throughout this license agreement.
15
+
16
+ 1.1. “License” means the terms and conditions, as stated herein, for use, copy,
17
+ modification, preparation of derivative work, reproduction, and distribution of
18
+ Software (as defined below).
19
+
20
+ 1.2. “Licensor” means the copyright and/or patent owner or entity authorized by
21
+ the copyright and/or patent owner that is granting the License.
22
+
23
+ 1.3. “Licensee” means the individual or entity exercising permissions granted by
24
+ this License, including the use, copy, modification, preparation of derivative
25
+ work, reproduction, and distribution of Software (as defined below).
26
+
27
+ 1.4. “Software” means any copyrighted work, including but not limited to
28
+ software code, authored by Licensor and made available under this License.
29
+
30
+ 1.5. “Supply Chain” means the sequence of processes involved in the production
31
+ and/or distribution of a commodity, good, or service offered by the Licensee.
32
+
33
+ 1.6. “Supply Chain Impacted Party” or “Supply Chain Impacted Parties” means any
34
+ person(s) directly impacted by any of Licensee’s Supply Chain, including the
35
+ practices of all persons or entities within the Supply Chain prior to a good or
36
+ service reaching the Licensee.
37
+
38
+ 1.7. “Duty of Care” is defined by its use in tort law, delict law, and/or
39
+ similar bodies of law closely related to tort and/or delict law, including
40
+ without limitation, a requirement to act with the watchfulness, attention,
41
+ caution, and prudence that a reasonable person in the same or similar
42
+ circumstances would use towards any Supply Chain Impacted Party.
43
+
44
+ 1.8. “Worker” is defined to include any and all permanent, temporary, and agency
45
+ workers, as well as piece-rate, salaried, hourly paid, legal young (minors),
46
+ part-time, night, and migrant workers.
47
+
48
+ 2. INTELLECTUAL PROPERTY GRANTS:
49
+
50
+ This section identifies intellectual property rights granted to a Licensee.
51
+
52
+ 2.1. Grant of Copyright License: Subject to the terms and conditions of this
53
+ License, Licensor hereby grants to Licensee a worldwide, non-exclusive,
54
+ no-charge, royalty-free copyright license to use, copy, modify, prepare
55
+ derivative work, reproduce, or distribute the Software, Licensor authored
56
+ modified software, or other work derived from the Software.
57
+
58
+ 2.2. Grant of Patent License: Subject to the terms and conditions of this
59
+ License, Licensor hereby grants Licensee a worldwide, non-exclusive, no-charge,
60
+ royalty-free patent license to make, have made, use, offer to sell, sell,
61
+ import, and otherwise transfer Software.
62
+
63
+ 3. ETHICAL STANDARDS:
64
+
65
+ This section lists conditions the Licensee must comply with in order to have
66
+ rights under this License.
67
+
68
+ The rights granted to the Licensee by this License are expressly made subject to
69
+ the Licensee’s ongoing compliance with the following conditions:
70
+
71
+ * 3.1. The Licensee SHALL NOT, whether directly or indirectly, through agents
72
+ or assigns:
73
+
74
+ * 3.1.1. Infringe upon any person’s right to life or security of person,
75
+ engage in extrajudicial killings, or commit murder, without lawful cause
76
+ (See Article 3, United Nations Universal Declaration of Human Rights;
77
+ Article 6, International Covenant on Civil and Political Rights)
78
+
79
+ * 3.1.2. Hold any person in slavery, servitude, or forced labor (See Article
80
+ 4, United Nations Universal Declaration of Human Rights; Article 8,
81
+ International Covenant on Civil and Political Rights);
82
+
83
+ * 3.1.3. Contribute to the institution of slavery, slave trading, forced
84
+ labor, or unlawful child labor (See Article 4, United Nations Universal
85
+ Declaration of Human Rights; Article 8, International Covenant on Civil and
86
+ Political Rights);
87
+
88
+ * 3.1.4. Torture or subject any person to cruel, inhumane, or degrading
89
+ treatment or punishment (See Article 5, United Nations Universal
90
+ Declaration of Human Rights; Article 7, International Covenant on Civil and
91
+ Political Rights);
92
+
93
+ * 3.1.5. Discriminate on the basis of sex, gender, sexual orientation, race,
94
+ ethnicity, nationality, religion, caste, age, medical disability or
95
+ impairment, and/or any other like circumstances (See Article 7, United
96
+ Nations Universal Declaration of Human Rights; Article 2, International
97
+ Covenant on Economic, Social and Cultural Rights; Article 26, International
98
+ Covenant on Civil and Political Rights);
99
+
100
+ * 3.1.6. Prevent any person from exercising his/her/their right to seek an
101
+ effective remedy by a competent court or national tribunal (including
102
+ domestic judicial systems, international courts, arbitration bodies, and
103
+ other adjudicating bodies) for actions violating the fundamental rights
104
+ granted to him/her/them by applicable constitutions, applicable laws, or by
105
+ this License (See Article 8, United Nations Universal Declaration of Human
106
+ Rights; Articles 9 and 14, International Covenant on Civil and Political
107
+ Rights);
108
+
109
+ * 3.1.7. Subject any person to arbitrary arrest, detention, or exile (See
110
+ Article 9, United Nations Universal Declaration of Human Rights; Article 9,
111
+ International Covenant on Civil and Political Rights);
112
+
113
+ * 3.1.8. Subject any person to arbitrary interference with a person’s
114
+ privacy, family, home, or correspondence without the express written
115
+ consent of the person (See Article 12, United Nations Universal Declaration
116
+ of Human Rights; Article 17, International Covenant on Civil and Political
117
+ Rights);
118
+
119
+ * 3.1.9. Arbitrarily deprive any person of his/her/their property (See
120
+ Article 17, United Nations Universal Declaration of Human Rights);
121
+
122
+ * 3.1.10. Forcibly remove indigenous peoples from their lands or territories
123
+ or take any action with the aim or effect of dispossessing indigenous
124
+ peoples from their lands, territories, or resources, including without
125
+ limitation the intellectual property or traditional knowledge of indigenous
126
+ peoples, without the free, prior, and informed consent of indigenous
127
+ peoples concerned (See Articles 8 and 10, United Nations Declaration on the
128
+ Rights of Indigenous Peoples);
129
+
130
+ * 3.1.11. Fossil Fuel Divestment: Be an individual or entity, or a
131
+ representative, agent, affiliate, successor, attorney, or assign of an
132
+ individual or entity, on the FFI Solutions Carbon Underground 200 list
133
+ [https://www.ffisolutions.com/research-analytics-index-solutions/research-screening/the-carbon-underground-200/?cn-reloaded=1];
134
+
135
+ * 3.1.12. Ecocide: Commit ecocide:
136
+
137
+ * 3.1.12.1. For the purpose of this section, “ecocide” means unlawful or
138
+ wanton acts committed with knowledge that there is a substantial
139
+ likelihood of severe and either widespread or long-term damage to the
140
+ environment being caused by those acts;
141
+
142
+ * 3.1.12.2. For the purpose of further defining ecocide and the terms
143
+ contained in the previous paragraph:
144
+
145
+ * 3.1.12.2.1. “Wanton” means with reckless disregard for damage which
146
+ would be clearly excessive in relation to the social and economic
147
+ benefits anticipated;
148
+
149
+ * 3.1.12.2.2. “Severe” means damage which involves very serious adverse
150
+ changes, disruption, or harm to any element of the environment,
151
+ including grave impacts on human life or natural, cultural, or
152
+ economic resources;
153
+
154
+ * 3.1.12.2.3. “Widespread” means damage which extends beyond a limited
155
+ geographic area, crosses state boundaries, or is suffered by an entire
156
+ ecosystem or species or a large number of human beings;
157
+
158
+ * 3.1.12.2.4. “Long-term” means damage which is irreversible or which
159
+ cannot be redressed through natural recovery within a reasonable
160
+ period of time; and
161
+
162
+ * 3.1.12.2.5. “Environment” means the earth, its biosphere, cryosphere,
163
+ lithosphere, hydrosphere, and atmosphere, as well as outer space
164
+
165
+ (See Section II, Independent Expert Panel for the Legal Definition of
166
+ Ecocide, Stop Ecocide Foundation and the Promise Institute for Human
167
+ Rights at UCLA School of Law, June 2021);
168
+
169
+ * 3.1.13. Extractive Industries: Be an individual or entity, or a
170
+ representative, agent, affiliate, successor, attorney, or assign of an
171
+ individual or entity, that engages in fossil fuel or mineral exploration,
172
+ extraction, development, or sale;
173
+
174
+ * 3.1.14. Boycott / Divestment / Sanctions: Be an individual or entity, or a
175
+ representative, agent, affiliate, successor, attorney, or assign of an
176
+ individual or entity, identified by the Boycott, Divestment, Sanctions
177
+ (“BDS”) movement on its website (https://bdsmovement.net/
178
+ [https://bdsmovement.net/] and
179
+ https://bdsmovement.net/get-involved/what-to-boycott
180
+ [https://bdsmovement.net/get-involved/what-to-boycott]) as a target for
181
+ boycott;
182
+
183
+ * 3.1.15. Taliban: Be an individual or entity that:
184
+
185
+ * 3.1.15.1. engages in any commercial transactions with the Taliban; or
186
+
187
+ * 3.1.15.2. is a representative, agent, affiliate, successor, attorney, or
188
+ assign of the Taliban;
189
+
190
+ * 3.1.16. Myanmar: Be an individual or entity that:
191
+
192
+ * 3.1.16.1. engages in any commercial transactions with the
193
+ Myanmar/Burmese military junta; or
194
+
195
+ * 3.1.16.2. is a representative, agent, affiliate, successor, attorney, or
196
+ assign of the Myanmar/Burmese government;
197
+
198
+ * 3.1.17. Xinjiang Uygur Autonomous Region: Be an individual or entity, or a
199
+ representative, agent, affiliate, successor, attorney, or assign of any
200
+ individual or entity, that does business in, purchases goods from, or
201
+ otherwise benefits from goods produced in the Xinjiang Uygur Autonomous
202
+ Region of China;
203
+
204
+ * 3.1.18. US Tariff Act: Be an individual or entity:
205
+
206
+ * 3.1.18.1. which U.S. Customs and Border Protection (CBP) has currently
207
+ issued a Withhold Release Order (WRO) or finding against based on
208
+ reasonable suspicion of forced labor; or
209
+
210
+ * 3.1.18.2. that is a representative, agent, affiliate, successor,
211
+ attorney, or assign of an individual or entity that does business with
212
+ an individual or entity which currently has a WRO or finding from CBP
213
+ issued against it based on reasonable suspicion of forced labor;
214
+
215
+ * 3.1.19. Mass Surveillance: Be a government agency or multinational
216
+ corporation, or a representative, agent, affiliate, successor, attorney,
217
+ or assign of a government or multinational corporation, which participates
218
+ in mass surveillance programs;
219
+
220
+ * 3.1.20. Military Activities: Be an entity or a representative, agent,
221
+ affiliate, successor, attorney, or assign of an entity which conducts
222
+ military activities;
223
+
224
+ * 3.1.21. Law Enforcement: Be an individual or entity, or a or a
225
+ representative, agent, affiliate, successor, attorney, or assign of an
226
+ individual or entity, that provides good or services to, or otherwise
227
+ enters into any commercial contracts with, any local, state, or federal
228
+ law enforcement agency;
229
+
230
+ * 3.1.22. Media: Be an individual or entity, or a or a representative,
231
+ agent, affiliate, successor, attorney, or assign of an individual or
232
+ entity, that broadcasts messages promoting killing, torture, or other
233
+ forms of extreme violence;
234
+
235
+ * 3.1.23. Interfere with Workers' free exercise of the right to organize and
236
+ associate (See Article 20, United Nations Universal Declaration of Human
237
+ Rights; C087 - Freedom of Association and Protection of the Right to
238
+ Organise Convention, 1948 (No. 87), International Labour Organization;
239
+ Article 8, International Covenant on Economic, Social and Cultural Rights);
240
+ and
241
+
242
+ * 3.1.24. Harm the environment in a manner inconsistent with local, state,
243
+ national, or international law.
244
+
245
+ * 3.2. The Licensee SHALL:
246
+
247
+ * 3.2.1. Social Auditing: Only use social auditing mechanisms that adhere to
248
+ Worker-Driven Social Responsibility Network’s Statement of Principles
249
+ (https://wsr-network.org/what-is-wsr/statement-of-principles/
250
+ [https://wsr-network.org/what-is-wsr/statement-of-principles/]) over
251
+ traditional social auditing mechanisms, to the extent the Licensee uses
252
+ any social auditing mechanisms at all;
253
+
254
+ * 3.2.2. Workers on Board of Directors: Ensure that if the Licensee has a
255
+ Board of Directors, 30% of Licensee’s board seats are held by Workers paid
256
+ no more than 200% of the compensation of the lowest paid Worker of the
257
+ Licensee;
258
+
259
+ * 3.2.3. Supply Chain: Provide clear, accessible supply chain data to the
260
+ public in accordance with the following conditions:
261
+
262
+ * 3.2.3.1. All data will be on Licensee’s website and/or, to the extent
263
+ Licensee is a representative, agent, affiliate, successor, attorney,
264
+ subsidiary, or assign, on Licensee’s principal’s or parent’s website or
265
+ some other online platform accessible to the public via an internet
266
+ search on a common internet search engine; and
267
+
268
+ * 3.2.3.2. Data published will include, where applicable, manufacturers,
269
+ top tier suppliers, subcontractors, cooperatives, component parts
270
+ producers, and farms;
271
+
272
+ * 3.2.4. Provide equal pay for equal work where the performance of such work
273
+ requires equal skill, effort, and responsibility, and which are performed
274
+ under similar working conditions, except where such payment is made
275
+ pursuant to:
276
+
277
+ * 3.2.4.1. A seniority system;
278
+
279
+ * 3.2.4.2. A merit system;
280
+
281
+ * 3.2.4.3. A system which measures earnings by quantity or quality of
282
+ production; or
283
+
284
+ * 3.2.4.4. A differential based on any other factor other than sex, gender,
285
+ sexual orientation, race, ethnicity, nationality, religion, caste, age,
286
+ medical disability or impairment, and/or any other like circumstances
287
+ (See 29 U.S.C.A. § 206(d)(1); Article 23, United Nations Universal
288
+ Declaration of Human Rights; Article 7, International Covenant on
289
+ Economic, Social and Cultural Rights; Article 26, International Covenant
290
+ on Civil and Political Rights); and
291
+
292
+ * 3.2.5. Allow for reasonable limitation of working hours and periodic
293
+ holidays with pay (See Article 24, United Nations Universal Declaration of
294
+ Human Rights; Article 7, International Covenant on Economic, Social and
295
+ Cultural Rights).
296
+
297
+ 4. SUPPLY CHAIN IMPACTED PARTIES:
298
+
299
+ This section identifies additional individuals or entities that a Licensee could
300
+ harm as a result of violating the Ethical Standards section, the condition that
301
+ the Licensee must voluntarily accept a Duty of Care for those individuals or
302
+ entities, and the right to a private right of action that those individuals or
303
+ entities possess as a result of violations of the Ethical Standards section.
304
+
305
+ 4.1. In addition to the above Ethical Standards, Licensee voluntarily accepts a
306
+ Duty of Care for Supply Chain Impacted Parties of this License, including
307
+ individuals and communities impacted by violations of the Ethical Standards. The
308
+ Duty of Care is breached when a provision within the Ethical Standards section
309
+ is violated by a Licensee, one of its successors or assigns, or by an individual
310
+ or entity that exists within the Supply Chain prior to a good or service
311
+ reaching the Licensee.
312
+
313
+ 4.2. Breaches of the Duty of Care, as stated within this section, shall create a
314
+ private right of action, allowing any Supply Chain Impacted Party harmed by the
315
+ Licensee to take legal action against the Licensee in accordance with applicable
316
+ negligence laws, whether they be in tort law, delict law, and/or similar bodies
317
+ of law closely related to tort and/or delict law, regardless if Licensee is
318
+ directly responsible for the harms suffered by a Supply Chain Impacted Party.
319
+ Nothing in this section shall be interpreted to include acts committed by
320
+ individuals outside of the scope of his/her/their employment.
321
+
322
+ 5. NOTICE: This section explains when a Licensee must notify others of the
323
+ License.
324
+
325
+ 5.1. Distribution of Notice: Licensee must ensure that everyone who receives a
326
+ copy of or uses any part of Software from Licensee, with or without changes,
327
+ also receives the License and the copyright notice included with Software (and
328
+ if included by the Licensor, patent, trademark, and attribution notice).
329
+ Licensee must ensure that License is prominently displayed so that any
330
+ individual or entity seeking to download, copy, use, or otherwise receive any
331
+ part of Software from Licensee is notified of this License and its terms and
332
+ conditions. Licensee must cause any modified versions of the Software to carry
333
+ prominent notices stating that Licensee changed the Software.
334
+
335
+ 5.2. Modified Software: Licensee is free to create modifications of the Software
336
+ and distribute only the modified portion created by Licensee, however, any
337
+ derivative work stemming from the Software or its code must be distributed
338
+ pursuant to this License, including this Notice provision.
339
+
340
+ 5.3. Recipients as Licensees: Any individual or entity that uses, copies,
341
+ modifies, reproduces, distributes, or prepares derivative work based upon the
342
+ Software, all or part of the Software’s code, or a derivative work developed by
343
+ using the Software, including a portion of its code, is a Licensee as defined
344
+ above and is subject to the terms and conditions of this License.
345
+
346
+ 6. REPRESENTATIONS AND WARRANTIES:
347
+
348
+ 6.1. Disclaimer of Warranty: TO THE FULL EXTENT ALLOWED BY LAW, THIS SOFTWARE
349
+ COMES “AS IS,” WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED, AND LICENSOR SHALL NOT
350
+ BE LIABLE TO ANY PERSON OR ENTITY FOR ANY DAMAGES OR OTHER LIABILITY ARISING
351
+ FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THIS LICENSE, UNDER ANY
352
+ LEGAL CLAIM.
353
+
354
+ 6.2. Limitation of Liability: LICENSEE SHALL HOLD LICENSOR HARMLESS AGAINST ANY
355
+ AND ALL CLAIMS, DEBTS, DUES, LIABILITIES, LIENS, CAUSES OF ACTION, DEMANDS,
356
+ OBLIGATIONS, DISPUTES, DAMAGES, LOSSES, EXPENSES, ATTORNEYS' FEES, COSTS,
357
+ LIABILITIES, AND ALL OTHER CLAIMS OF EVERY KIND AND NATURE WHATSOEVER, WHETHER
358
+ KNOWN OR UNKNOWN, ANTICIPATED OR UNANTICIPATED, FORESEEN OR UNFORESEEN, ACCRUED
359
+ OR UNACCRUED, DISCLOSED OR UNDISCLOSED, ARISING OUT OF OR RELATING TO LICENSEE’S
360
+ USE OF THE SOFTWARE. NOTHING IN THIS SECTION SHOULD BE INTERPRETED TO REQUIRE
361
+ LICENSEE TO INDEMNIFY LICENSOR, NOR REQUIRE LICENSOR TO INDEMNIFY LICENSEE.
362
+
363
+ 7. TERMINATION
364
+
365
+ 7.1. Violations of Ethical Standards or Breaching Duty of Care: If Licensee
366
+ violates the Ethical Standards section or Licensee, or any other person or
367
+ entity within the Supply Chain prior to a good or service reaching the Licensee,
368
+ breaches its Duty of Care to Supply Chain Impacted Parties, Licensee must remedy
369
+ the violation or harm caused by Licensee within 30 days of being notified of the
370
+ violation or harm. If Licensee fails to remedy the violation or harm within 30
371
+ days, all rights in the Software granted to Licensee by License will be null and
372
+ void as between Licensor and Licensee.
373
+
374
+ 7.2. Failure of Notice: If any person or entity notifies Licensee in writing
375
+ that Licensee has not complied with the Notice section of this License, Licensee
376
+ can keep this License by taking all practical steps to comply within 30 days
377
+ after the notice of noncompliance. If Licensee does not do so, Licensee’s
378
+ License (and all rights licensed hereunder) will end immediately.
379
+
380
+ 7.3. Judicial Findings: In the event Licensee is found by a civil, criminal,
381
+ administrative, or other court of competent jurisdiction, or some other
382
+ adjudicating body with legal authority, to have committed actions which are in
383
+ violation of the Ethical Standards or Supply Chain Impacted Party sections of
384
+ this License, all rights granted to Licensee by this License will terminate
385
+ immediately.
386
+
387
+ 7.4. Patent Litigation: If Licensee institutes patent litigation against any
388
+ entity (including a cross-claim or counterclaim in a suit) alleging that the
389
+ Software, all or part of the Software’s code, or a derivative work developed
390
+ using the Software, including a portion of its code, constitutes direct or
391
+ contributory patent infringement, then any patent license, along with all other
392
+ rights, granted to Licensee under this License will terminate as of the date
393
+ such litigation is filed.
394
+
395
+ 7.5. Additional Remedies: Termination of the License by failing to remedy harms
396
+ in no way prevents Licensor or Supply Chain Impacted Party from seeking
397
+ appropriate remedies at law or in equity.
398
+
399
+ 8. MISCELLANEOUS:
400
+
401
+ 8.1. Conditions: Sections 3, 4.1, 5.1, 5.2, 7.1, 7.2, 7.3, and 7.4 are
402
+ conditions of the rights granted to Licensee in the License.
403
+
404
+ 8.2. Equitable Relief: Licensor and any Supply Chain Impacted Party shall be
405
+ entitled to equitable relief, including injunctive relief or specific
406
+ performance of the terms hereof, in addition to any other remedy to which they
407
+ are entitled at law or in equity.
408
+
409
+ 8.3. Copyleft: Modified software, source code, or other derivative work must be
410
+ licensed, in its entirety, under the exact same conditions as this License.
411
+
412
+ 8.4. Severability: If any term or provision of this License is determined to be
413
+ invalid, illegal, or unenforceable by a court of competent jurisdiction, any
414
+ such determination of invalidity, illegality, or unenforceability shall not
415
+ affect any other term or provision of this License or invalidate or render
416
+ unenforceable such term or provision in any other jurisdiction. If the
417
+ determination of invalidity, illegality, or unenforceability by a court of
418
+ competent jurisdiction pertains to the terms or provisions contained in the
419
+ Ethical Standards section of this License, all rights in the Software granted to
420
+ Licensee shall be deemed null and void as between Licensor and Licensee.
421
+
422
+ 8.5. Section Titles: Section titles are solely written for organizational
423
+ purposes and should not be used to interpret the language within each section.
424
+
425
+ 8.6. Citations: Citations are solely written to provide context for the source
426
+ of the provisions in the Ethical Standards.
427
+
428
+ 8.7. Section Summaries: Some sections have a brief italicized description which
429
+ is provided for the sole purpose of briefly describing the section and should
430
+ not be used to interpret the terms of the License.
431
+
432
+ 8.8. Entire License: This is the entire License between the Licensor and
433
+ Licensee with respect to the claims released herein and that the consideration
434
+ stated herein is the only consideration or compensation to be paid or exchanged
435
+ between them for this License. This License cannot be modified or amended except
436
+ in a writing signed by Licensor and Licensee.
437
+
438
+ 8.9. Successors and Assigns: This License shall be binding upon and inure to the
439
+ benefit of the Licensor’s and Licensee’s respective heirs, successors, and
440
+ assigns.
data/README.md CHANGED
@@ -1,10 +1,5 @@
1
1
  # paper_trail-background
2
2
 
3
- - [![Build](http://img.shields.io/travis-ci/krainboltgreene/paper_trail-background.svg?style=flat-square)](https://travis-ci.org/krainboltgreene/paper_trail-background)
4
- - [![Downloads](http://img.shields.io/gem/dtv/paper_trail-background.svg?style=flat-square)](https://rubygems.org/gems/paper_trail-background)
5
- - [![Version](http://img.shields.io/gem/v/paper_trail-background.svg?style=flat-square)](https://rubygems.org/gems/paper_trail-background)
6
-
7
-
8
3
  Allows you to enqueue version creation/deletion as a background job to avoid having business logic blocked by changelog writing.
9
4
 
10
5
 
@@ -15,20 +10,29 @@ First you'll need to setup a job for processing versions:
15
10
  ``` ruby
16
11
  # The class MUST be named this
17
12
  class VersionJob < ApplicationJob
18
-
19
- # These are settings you'll probably want, I suggest sidekiq-unique-jobs
20
- sidekiq_options(
21
- :queue => "versions",
22
- :unique_across_queues => true,
23
- :lock => :until_executed,
24
- :log_duplicate_payload => true
25
- )
13
+ queue_as :default
26
14
 
27
15
  # This wires up the background job
28
- include PaperTrail::Background::Sidekiq
16
+ include PaperTrail::Background::Job
17
+ end
18
+ ```
19
+
20
+ ## Configuration
21
+ In an initializer, you can specify whether you want to opt into this behavior on a per-model basis:
22
+
23
+ ``` ruby
24
+ PaperTrail::Background::Config.configure do |config|
25
+ config.opt_in = true
29
26
  end
30
27
  ```
31
28
 
29
+ If opt-in behavior is set to `true`, you can enable async paper trails by specifying `async: true` in a given model's paper trail options:
30
+
31
+ ``` ruby
32
+ class SomeModel < ActiveRecord::Base
33
+ has_paper_trail async: true
34
+ end
35
+ ```
32
36
 
33
37
  ## Installing
34
38
 
@@ -43,7 +47,7 @@ Or install it yourself with:
43
47
 
44
48
  ## Contributing
45
49
 
46
- 1. Read the [Code of Conduct](/CONDUCT.md)
50
+ 1. Read the [Code of Conduct](/CONDUCT)
47
51
  2. Fork it
48
52
  3. Create your feature branch (`git checkout -b my-new-feature`)
49
53
  4. Commit your changes (`git commit -am 'Add some feature'`)
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PaperTrail
4
+ module Background
5
+ class Configuration
6
+ attr_accessor :opt_in
7
+ end
8
+
9
+ class Config
10
+ class << self
11
+ def configuration
12
+ @configuration ||= Configuration.new
13
+ end
14
+
15
+ def configure
16
+ yield(configuration)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PaperTrail
4
+ module Background
5
+ module Job
6
+ def perform(version_class, attributes, _event)
7
+ version_class.constantize.create!(attributes)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PaperTrail
4
+ module Background
5
+ module RSpecHelpers
6
+ module InstanceMethods
7
+ # enable versioning for specific blocks (at instance-level)
8
+ def with_versioning(expected_open_transactions: 1, &block)
9
+ was_enabled = ::PaperTrail.enabled?
10
+ ::PaperTrail.enabled = true
11
+
12
+ normally_open_transactions = ActiveRecord::Base.normally_open_transactions
13
+ ActiveRecord::Base.normally_open_transactions = expected_open_transactions
14
+
15
+ # ensure that VersionJobs are executed
16
+ perform_enqueued_jobs only: VersionJob, &block
17
+ ensure
18
+ ::PaperTrail.enabled = was_enabled
19
+ ActiveRecord::Base.normally_open_transactions = normally_open_transactions
20
+ end
21
+ end
22
+
23
+ module ClassMethods
24
+ # enable versioning for specific blocks (at class-level)
25
+ def with_versioning(expected_open_transactions: 1, &block)
26
+ context "with versioning", versioning: true do
27
+ around do |example|
28
+ normally_open_transactions = ActiveRecord::Base.normally_open_transactions
29
+ ActiveRecord::Base.normally_open_transactions = expected_open_transactions
30
+
31
+ perform_enqueued_jobs only: VersionJob do
32
+ example.run
33
+ end
34
+
35
+ ActiveRecord::Base.normally_open_transactions = normally_open_transactions
36
+ end
37
+
38
+ class_exec(&block)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PaperTrail
2
4
  module Background
3
- VERSION = "1.0.2"
5
+ VERSION = "1.2.0"
4
6
  end
5
7
  end
@@ -1,6 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "paper_trail/record_trail"
4
+ require "ar_after_transaction"
5
+
1
6
  module PaperTrail
7
+ require_relative "background/config"
2
8
  require_relative "background/version"
3
- require_relative "background/sidekiq"
9
+ require_relative "background/job"
4
10
 
5
11
  module Background
6
12
  # @api private
@@ -9,6 +15,8 @@ module PaperTrail
9
15
  def record_create
10
16
  return unless enabled?
11
17
 
18
+ return super if @record.paper_trail_options[:async].blank?
19
+
12
20
  event = PaperTrail::Events::Create.new(@record, true)
13
21
 
14
22
  # Merge data from `Event` with data from PT-AT. We no longer use
@@ -25,6 +33,7 @@ module PaperTrail
25
33
  # paper_trail-association_tracking
26
34
  def record_destroy(recording_order)
27
35
  return unless enabled?
36
+ return super if @record.paper_trail_options[:async].blank?
28
37
  return if @record.new_record?
29
38
 
30
39
  in_after_callback = recording_order == "after"
@@ -43,6 +52,7 @@ module PaperTrail
43
52
  # paper_trail-association_tracking
44
53
  def record_update(force:, in_after_callback:, is_touch:)
45
54
  return unless enabled?
55
+ return super if Config.configuration.opt_in && @record.paper_trail_options[:async].blank?
46
56
 
47
57
  event = PaperTrail::Events::Update.new(@record, in_after_callback, is_touch, nil)
48
58
 
@@ -60,6 +70,7 @@ module PaperTrail
60
70
  # paper_trail-association_tracking
61
71
  def record_update_columns(changes)
62
72
  return unless enabled?
73
+ return super if Config.configuration.opt_in && @record.paper_trail_options[:async].blank?
63
74
 
64
75
  event = Events::Update.new(@record, false, false, changes)
65
76
 
@@ -73,15 +84,10 @@ module PaperTrail
73
84
  end
74
85
 
75
86
  private def trigger_write(record, data, event)
76
- version_class = record.class.paper_trail.version_class
77
-
78
- version_class.after_transaction do
79
- VersionJob.perform_async(
80
- version_class,
81
- data.merge(
82
- :item_id => record.id,
83
- :item_type => record.class.name
84
- ),
87
+ record.class.after_transaction do
88
+ VersionJob.perform_later(
89
+ record.class.paper_trail.version_class.name,
90
+ data,
85
91
  event
86
92
  )
87
93
  end
@@ -0,0 +1,222 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ WithData = Struct.new(:data)
6
+ WithVersionClass = Struct.new(:version_class)
7
+
8
+ class SuperDummyClass
9
+ def record_create
10
+ @record = 1
11
+ end
12
+
13
+ def record_update(record)
14
+ @record = record
15
+ end
16
+
17
+ def record_destroy(record)
18
+ @record = record
19
+ end
20
+
21
+ def record_update_columns(record)
22
+ @record = record
23
+ end
24
+ end
25
+
26
+ class DummyClass < SuperDummyClass
27
+ include PaperTrail::Background
28
+
29
+ def initialize(options: {}, record: nil)
30
+ @options = options
31
+ @record = record
32
+ super()
33
+ end
34
+
35
+ def enabled?
36
+ @options[:enabled]
37
+ end
38
+
39
+ def data_for_create
40
+ {}
41
+ end
42
+
43
+ def data_for_destroy
44
+ {}
45
+ end
46
+
47
+ def data_for_update_columns
48
+ {}
49
+ end
50
+
51
+ def force
52
+ true
53
+ end
54
+ end
55
+
56
+ class VersionJob
57
+ def self.perform_later(*args); end
58
+ end
59
+
60
+ RSpec.describe PaperTrail::Background do
61
+ before do
62
+ allow(VersionJob).to receive(:perform_later)
63
+ end
64
+
65
+ describe "#record_create" do
66
+ it "does not trigger a write if not enabled" do
67
+ DummyClass.new(options: { enabled: false }).record_create
68
+
69
+ expect(VersionJob).not_to have_received(:perform_later)
70
+ end
71
+
72
+ context "when enabled and opt_in config is enabled" do
73
+ let(:record) { double("SomeRecord") }
74
+
75
+ before do
76
+ PaperTrail::Background::Config.configure do |config|
77
+ config.opt_in = true
78
+ end
79
+ end
80
+
81
+ it "does not trigger a write if record is opted in but async is blank" do
82
+ allow(record).to receive(:paper_trail_event).and_return(async: nil)
83
+ allow(record).to receive(:paper_trail_options).and_return(async: nil)
84
+ allow(record.class).to receive(:paper_trail).and_return(WithVersionClass.new(Class))
85
+
86
+ DummyClass.new(options: { enabled: true }, record:).record_create
87
+
88
+ expect(VersionJob).not_to have_received(:perform_later)
89
+ end
90
+
91
+ it "triggers a write if record is opted in and async is true" do
92
+ allow(record).to receive(:paper_trail_options).and_return(async: true)
93
+ allow(PaperTrail::Events::Create).to receive(:new).and_return(WithData.new({}))
94
+ allow(record.class).to receive(:paper_trail).and_return(WithVersionClass.new(Class))
95
+ allow(record.class).to receive(:after_transaction).and_yield
96
+
97
+ DummyClass.new(options: { enabled: true }, record:).record_create
98
+
99
+ expect(VersionJob).to have_received(:perform_later)
100
+ end
101
+ end
102
+ end
103
+
104
+ describe "#record_destroy" do
105
+ it "does not trigger a write if not enabled" do
106
+ DummyClass.new(options: { enabled: false }).record_destroy("after")
107
+
108
+ expect(VersionJob).not_to have_received(:perform_later)
109
+ end
110
+
111
+ context "when enabled and opt_in config is enabled" do
112
+ let(:record) { double("SomeRecord") }
113
+
114
+ before do
115
+ PaperTrail::Background::Config.configure do |config|
116
+ config.opt_in = true
117
+ end
118
+ end
119
+
120
+ it "does not trigger a write if record is opted in but async is blank" do
121
+ allow(record).to receive(:paper_trail_options).and_return(async: nil)
122
+
123
+ DummyClass.new(options: { enabled: true }, record:).record_destroy("after")
124
+
125
+ expect(VersionJob).not_to have_received(:perform_later)
126
+ end
127
+
128
+ it "does not trigger a write if record is new" do
129
+ allow(record).to receive_messages(paper_trail_options: { async: true }, new_record?: true)
130
+
131
+ DummyClass.new(options: { enabled: true }, record:).record_destroy("after")
132
+
133
+ expect(VersionJob).not_to have_received(:perform_later)
134
+ end
135
+
136
+ it "triggers a write if record is opted in and async is true" do
137
+ allow(record).to receive_messages(paper_trail_options: { async: true }, new_record?: false)
138
+ allow(PaperTrail::Events::Destroy).to receive(:new).and_return(WithData.new({}))
139
+ allow(record.class).to receive(:paper_trail).and_return(WithVersionClass.new(Class))
140
+ allow(record.class).to receive(:after_transaction).and_yield
141
+
142
+ DummyClass.new(options: { enabled: true }, record:).record_destroy("after")
143
+
144
+ expect(VersionJob).to have_received(:perform_later)
145
+ end
146
+ end
147
+ end
148
+
149
+ describe "#record_update" do
150
+ it "does not trigger a write if not enabled" do
151
+ DummyClass.new(options: { enabled: false }).record_update(force: true, in_after_callback: true, is_touch: false)
152
+
153
+ expect(VersionJob).not_to have_received(:perform_later)
154
+ end
155
+
156
+ context "when enabled and opt_in config is enabled" do
157
+ let(:record) { double("SomeRecord") }
158
+
159
+ before do
160
+ PaperTrail::Background::Config.configure do |config|
161
+ config.opt_in = true
162
+ end
163
+ end
164
+
165
+ it "does not trigger a write if record is opted in but async is blank" do
166
+ allow(record).to receive(:paper_trail_options).and_return(async: nil)
167
+
168
+ DummyClass.new(options: { enabled: true }, record:).record_update(force: true, in_after_callback: true, is_touch: false)
169
+
170
+ expect(VersionJob).not_to have_received(:perform_later)
171
+ end
172
+
173
+ it "triggers a write if record is opted in and async is true" do
174
+ allow(record).to receive_messages(paper_trail_options: { async: true }, new_record?: false)
175
+ allow(PaperTrail::Events::Update).to receive(:new).and_return(WithData.new({}))
176
+ allow(record.class).to receive(:paper_trail).and_return(WithVersionClass.new(Class))
177
+ allow(record.class).to receive(:after_transaction).and_yield
178
+
179
+ DummyClass.new(options: { enabled: true }, record:).record_update(force: true, in_after_callback: true, is_touch: false)
180
+
181
+ expect(VersionJob).to have_received(:perform_later)
182
+ end
183
+ end
184
+ end
185
+
186
+ describe "#record_update_columns" do
187
+ it "does not trigger a write if not enabled" do
188
+ DummyClass.new(options: { enabled: false }).record_update_columns({})
189
+
190
+ expect(VersionJob).not_to have_received(:perform_later)
191
+ end
192
+
193
+ context "when enabled and opt_in config is enabled" do
194
+ let(:record) { double("SomeRecord") }
195
+
196
+ before do
197
+ PaperTrail::Background::Config.configure do |config|
198
+ config.opt_in = true
199
+ end
200
+ end
201
+
202
+ it "does not trigger a write if record is opted in but async is blank" do
203
+ allow(record).to receive(:paper_trail_options).and_return(async: nil)
204
+
205
+ DummyClass.new(options: { enabled: true }, record:).record_update_columns({})
206
+
207
+ expect(VersionJob).not_to have_received(:perform_later)
208
+ end
209
+
210
+ it "triggers a write if record is opted in and async is true" do
211
+ allow(record).to receive_messages(paper_trail_options: { async: true }, new_record?: false)
212
+ allow(PaperTrail::Events::Update).to receive(:new).and_return(WithData.new({}))
213
+ allow(record.class).to receive(:paper_trail).and_return(WithVersionClass.new(Class))
214
+ allow(record.class).to receive(:after_transaction).and_yield
215
+
216
+ DummyClass.new(options: { enabled: true }, record:).record_update_columns({})
217
+
218
+ expect(VersionJob).to have_received(:perform_later)
219
+ end
220
+ end
221
+ end
222
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ar_after_transaction"
4
+
5
+ require_relative "../paper_trail/background/rspec_helpers"
6
+
7
+ RSpec.configure do |config|
8
+ config.include PaperTrail::Background::RSpecHelpers::InstanceMethods
9
+ config.extend PaperTrail::Background::RSpecHelpers::ClassMethods
10
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "paper_trail"
2
4
 
3
5
  module PaperTrail
metadata CHANGED
@@ -1,153 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paper_trail-background
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kurtis Rainbolt-Greene
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-19 00:00:00.000000000 Z
11
+ date: 2024-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.16'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.16'
27
- - !ruby/object:Gem::Dependency
28
- name: rspec
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '3.8'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '3.8'
41
- - !ruby/object:Gem::Dependency
42
- name: rake
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '12.2'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '12.2'
55
- - !ruby/object:Gem::Dependency
56
- name: pry
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - '='
60
- - !ruby/object:Gem::Version
61
- version: 0.11.2
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - '='
67
- - !ruby/object:Gem::Version
68
- version: 0.11.2
69
- - !ruby/object:Gem::Dependency
70
- name: pry-doc
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - '='
74
- - !ruby/object:Gem::Version
75
- version: 0.11.1
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - '='
81
- - !ruby/object:Gem::Version
82
- version: 0.11.1
83
13
  - !ruby/object:Gem::Dependency
84
14
  name: ar_after_transaction
85
15
  requirement: !ruby/object:Gem::Requirement
86
16
  requirements:
87
- - - '='
17
+ - - "~>"
88
18
  - !ruby/object:Gem::Version
89
- version: 0.5.0
19
+ version: 0.10.0
90
20
  type: :runtime
91
21
  prerelease: false
92
22
  version_requirements: !ruby/object:Gem::Requirement
93
23
  requirements:
94
- - - '='
24
+ - - "~>"
95
25
  - !ruby/object:Gem::Version
96
- version: 0.5.0
26
+ version: 0.10.0
97
27
  - !ruby/object:Gem::Dependency
98
28
  name: paper_trail
99
29
  requirement: !ruby/object:Gem::Requirement
100
30
  requirements:
101
- - - '='
31
+ - - ">="
102
32
  - !ruby/object:Gem::Version
103
- version: 10.0.1
33
+ version: '10'
104
34
  type: :runtime
105
35
  prerelease: false
106
36
  version_requirements: !ruby/object:Gem::Requirement
107
37
  requirements:
108
- - - '='
38
+ - - ">="
109
39
  - !ruby/object:Gem::Version
110
- version: 10.0.1
40
+ version: '10'
111
41
  description: A library for making paper_trail a background process
112
42
  email:
113
43
  - kurtis@rainbolt-greene.online
114
- executables:
115
- - setup
116
- - console
44
+ executables: []
117
45
  extensions: []
118
46
  extra_rdoc_files: []
119
47
  files:
48
+ - LICENSE
120
49
  - README.md
121
50
  - Rakefile
122
- - bin/console
123
- - bin/setup
124
51
  - lib/paper_trail-background.rb
52
+ - lib/paper_trail-background/rspec.rb
125
53
  - lib/paper_trail/background.rb
126
- - lib/paper_trail/background/sidekiq.rb
54
+ - lib/paper_trail/background/config.rb
55
+ - lib/paper_trail/background/job.rb
56
+ - lib/paper_trail/background/rspec_helpers.rb
127
57
  - lib/paper_trail/background/version.rb
128
- - lib/paper_trail/background/version_spec.rb
129
- homepage: http://krainboltgreene.github.io/paper_trail-background.rb
58
+ - lib/paper_trail/background_spec.rb
59
+ homepage: https://github.com/krainboltgreene/paper_trail-background.rb
130
60
  licenses:
131
- - ISC
132
- metadata: {}
133
- post_install_message:
61
+ - HL3
62
+ metadata:
63
+ rubygems_mfa_required: 'true'
64
+ post_install_message:
134
65
  rdoc_options: []
135
66
  require_paths:
136
67
  - lib
137
68
  required_ruby_version: !ruby/object:Gem::Requirement
138
69
  requirements:
139
- - - ">="
70
+ - - "~>"
140
71
  - !ruby/object:Gem::Version
141
- version: '0'
72
+ version: '3.2'
142
73
  required_rubygems_version: !ruby/object:Gem::Requirement
143
74
  requirements:
144
75
  - - ">="
145
76
  - !ruby/object:Gem::Version
146
77
  version: '0'
147
78
  requirements: []
148
- rubyforge_project:
149
- rubygems_version: 2.7.9
150
- signing_key:
79
+ rubygems_version: 3.4.10
80
+ signing_key:
151
81
  specification_version: 4
152
82
  summary: A library for making paper_trail a background process
153
83
  test_files: []
data/bin/console DELETED
@@ -1,11 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "paper_trail-background"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- require "pry"
11
- Pry.start
data/bin/setup DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here
@@ -1,9 +0,0 @@
1
- module PaperTrail
2
- module Background
3
- module Sidekiq
4
- def perform(version_class, attributes, event)
5
- version = version_class.constantize.create!(attributes)
6
- end
7
- end
8
- end
9
- end
@@ -1,7 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe PaperTrail::Background::VERSION do
4
- it "should be a string" do
5
- expect(PaperTrail::Background::VERSION).to be_kind_of(String)
6
- end
7
- end