emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/ebdb 3a652fe 1/3: Adjust initialize-instance for record


From: Eric Abrahamsen
Subject: [elpa] externals/ebdb 3a652fe 1/3: Adjust initialize-instance for records
Date: Fri, 27 Oct 2017 19:06:55 -0400 (EDT)

branch: externals/ebdb
commit 3a652fe5dd315a64abaa8877f80d44d34a06572d
Author: Eric Abrahamsen <address@hidden>
Commit: Eric Abrahamsen <address@hidden>

    Adjust initialize-instance for records
    
    * ebdb.el (initialize-instance): Fix the insurance regarding timestamp
      and creation-date fields. Should be addressing the "slots" argument,
      not the record's slots.
    * ebdb-test.el (ebdb-auto-insert-timestamp-creation): Test all this.
---
 ebdb-test.el | 33 +++++++++++++++++++++++++++++++++
 ebdb.el      | 21 +++++++++++++--------
 2 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/ebdb-test.el b/ebdb-test.el
index e6158f6..b2285e2 100644
--- a/ebdb-test.el
+++ b/ebdb-test.el
@@ -135,6 +135,39 @@
            rec (ebdb-parse 'ebdb-field-mail "address@hidden"))
           :type 'ebdb-readonly-db))))))
 
+(ert-deftest ebdb-auto-insert-timestamp-creation ()
+  "Test the creation of timestamp and creation-date fields.
+Actually exercises the `initialize-instance' methods of records."
+  (ebdb-test-with-records
+    (ebdb-test-with-database (db ebdb-test-database-1)
+      (let* ((r1 (make-instance ebdb-default-record-class))
+            (r2 (make-instance ebdb-default-record-class
+                               :timestamp nil
+                               :creation-date nil))
+            (r2-date (slot-value (slot-value r2 'creation-date) 'timestamp)))
+       ;; `make-instance' with no :timestamp or :creation-date values
+       ;; should get the fields correctly.
+       (should (and (stringp (ebdb-string (slot-value r1 'timestamp)))
+                    (stringp (ebdb-string (slot-value r1 'creation-date)))))
+       (delete-instance r1)
+       ;; `make-instance' with tags set to nil should still get
+       ;; correct fields (can happen in migration).
+       (should (and (stringp (ebdb-string (slot-value r2 'timestamp)))
+                    (stringp (ebdb-string (slot-value r2 'creation-date)))))
+       ;; Creating a record, saving it to the database, then
+       ;; re-loading it shouldn't change the creation date.
+       (ebdb-db-add-record db r2)
+       (ebdb-db-save db)
+       (sleep-for 2)
+       (ebdb-db-unload db)
+       (setq db (eieio-persistent-read (slot-value db 'file) 'ebdb-db t))
+       (should (equal r2-date
+                      (slot-value
+                       (slot-value
+                        (car ebdb-record-tracker)
+                        'creation-date)
+                       'timestamp)))))))
+
 (ert-deftest ebdb-cant-find-related-role ()
   "Find org record from a role field.
 If it doesn't exist, raise `ebdb-related-unfound'."
diff --git a/ebdb.el b/ebdb.el
index 26c3b67..e783ec4 100644
--- a/ebdb.el
+++ b/ebdb.el
@@ -2572,14 +2572,19 @@ RECORD is responsible for parsing it correctly.")
   ;; created (whether manually or loaded).
   (let ((cache (make-instance 'ebdb-cache)))
     (setq slots (plist-put slots :cache cache))
-    (with-slots (timestamp creation-date) record
-      (unless creation-date
-       (setf creation-date (make-instance 'ebdb-field-creation-date))
-       (ebdb-stamp-time creation-date))
-      (unless timestamp
-       (setf timestamp (make-instance 'ebdb-field-timestamp))
-       (ebdb-stamp-time timestamp))
-      (cl-call-next-method record slots))))
+    (unless (plist-get slots :timestamp)
+      (setq slots
+           (plist-put slots :timestamp
+                      (make-instance 'ebdb-field-timestamp)))
+      (ebdb-stamp-time (plist-get slots :timestamp))
+      (setf (slot-value record 'dirty) t))
+    (unless (plist-get slots :creation-date)
+      (setq slots
+           (plist-put slots :creation-date
+                      (make-instance 'ebdb-field-creation-date)))
+      (ebdb-stamp-time (plist-get slots :creation-date))
+      (setf (slot-value record 'dirty) t))
+    (cl-call-next-method record slots)))
 
 (cl-defmethod ebdb-init-record ((record ebdb-record))
   "Initiate a record after loading a database or creating a new



reply via email to

[Prev in Thread] Current Thread [Next in Thread]