First is entirely unchanged.
Second is changed slightly from previous version, it is parameterized on default units, now, as well as lower bound.
mulhern (2): Changes around handling of size entries in custom spoke. Make size_from_input() and size_from_entry() methods handier.
pyanaconda/storage_utils.py | 22 ++++++---- pyanaconda/ui/gui/spokes/custom.py | 28 +++++++++---- .../ui/gui/spokes/lib/custom_storage_helpers.py | 48 ++++++++++++++++++++-- 3 files changed, 76 insertions(+), 22 deletions(-)
* In size_from_input(), do not round up to any lower bound, just get the size. It's more general that way. * Parameterize size_from_input() on default units. * Parameterize size_from_entry() on a lower bound and on default units. * Add method docstrings.
Should not change any observable behavior.
Signed-off-by: mulhern amulhern@redhat.com --- pyanaconda/storage_utils.py | 22 ++++++---- pyanaconda/ui/gui/spokes/custom.py | 14 +++++-- .../ui/gui/spokes/lib/custom_storage_helpers.py | 48 ++++++++++++++++++++-- 3 files changed, 68 insertions(+), 16 deletions(-)
diff --git a/pyanaconda/storage_utils.py b/pyanaconda/storage_utils.py index 7d26e78..4c35184 100644 --- a/pyanaconda/storage_utils.py +++ b/pyanaconda/storage_utils.py @@ -90,26 +90,30 @@ AUTOPART_DEVICE_TYPES = {AUTOPART_TYPE_LVM: DEVICE_TYPE_LVM, NAMED_DEVICE_TYPES = (DEVICE_TYPE_BTRFS, DEVICE_TYPE_LVM, DEVICE_TYPE_MD, DEVICE_TYPE_LVM_THINP) CONTAINER_DEVICE_TYPES = (DEVICE_TYPE_LVM, DEVICE_TYPE_BTRFS, DEVICE_TYPE_LVM_THINP)
-def size_from_input(input_str): - """Get size from user's input""" +def size_from_input(input_str, units=None): + """ Get a Size object from an input string. + + :param str input_str: a string forming some representation of a size + :param units: use these units if none specified in input_str + :type units: str or NoneType + :returns: a Size object corresponding to input_str + :rtype: :class:`blivet.size.Size` or NoneType + + Units default to bytes if no units in input_str or units. + """
if not input_str: # Nothing to parse return None
- # if no unit was specified, default to MiB. Assume that a string - # ending with anything other than a digit has a unit suffix + # A string ending with a digit contains no units information. if re.search(r'[\d.%s]$' % locale.nl_langinfo(locale.RADIXCHAR), input_str): - input_str += "MiB" + input_str += units or ""
try: size = Size(input_str) except ValueError: return None - else: - # Minimium size for ui-created partitions is 1MiB. - if size.convertTo(spec="MiB") < 1: - size = Size("1 MiB")
return size
diff --git a/pyanaconda/ui/gui/spokes/custom.py b/pyanaconda/ui/gui/spokes/custom.py index 6e7038a..b3e1265 100644 --- a/pyanaconda/ui/gui/spokes/custom.py +++ b/pyanaconda/ui/gui/spokes/custom.py @@ -144,6 +144,12 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker): # The maximum number of places to show when displaying a size MAX_SIZE_PLACES = 2
+ # If the user enters a smaller size, the GUI changes it to this value + MIN_SIZE_ENTRY = Size("1 MiB") + + # Default to these units if the user does not enter any. + SIZE_UNITS_DEFAULT = "MiB" + def __init__(self, data, storage, payload, instclass): StorageChecker.__init__(self, min_ram=isys.MIN_GUI_RAM) NormalSpoke.__init__(self, data, storage, payload, instclass) @@ -925,9 +931,11 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker): if old_size.humanReadable(max_places=self.MAX_SIZE_PLACES) == self._sizeEntry.get_text(): size = old_size else: - # Note that this size may not correspond to user's entry, - # as size_from_entry has a default lower limit. - size = size_from_entry(self._sizeEntry) + size = size_from_entry( + self._sizeEntry, + lower_bound=self.MIN_SIZE_ENTRY, + units=self.SIZE_UNITS_DEFAULT + ) changed_size = ((use_dev.resizable or not use_dev.exists) and size != old_size) old_device_info["size"] = old_size diff --git a/pyanaconda/ui/gui/spokes/lib/custom_storage_helpers.py b/pyanaconda/ui/gui/spokes/lib/custom_storage_helpers.py index 4d0948c..32703c7 100644 --- a/pyanaconda/ui/gui/spokes/lib/custom_storage_helpers.py +++ b/pyanaconda/ui/gui/spokes/lib/custom_storage_helpers.py @@ -78,9 +78,29 @@ CONTAINER_TYPES = {DEVICE_TYPE_LVM: ContainerType(N_("Volume Group"), N_(" # These cannot be specified as mountpoints system_mountpoints = ["/dev", "/proc", "/run", "/sys"]
-def size_from_entry(entry): +def size_from_entry(entry, lower_bound=None, units=None): + """ Get a Size object from an entry field. + + :param lower_bound: lower bound for size returned, + :type lower_bound: :class:`blivet.size.Size` or NoneType + :param units: units to use if none obtained from entry + :type units: str or NoneType + :returns: a Size object corresponding to the text in the entry field + :rtype: :class:`blivet.size.Size` or NoneType + + Units default to bytes if no units specified in entry or units. + + Rounds up to lower_bound, if value in entry field corresponds + to a smaller value. The default for lower_bound is None, yielding + no rounding. + """ size_text = entry.get_text().decode("utf-8").strip() - return size_from_input(size_text) + size = size_from_input(size_text, units=units) + if size is None: + return None + if lower_bound is not None and size < lower_bound: + return lower_bound + return size
def populate_mountpoint_store(store, used_mountpoints): # sure, add whatever you want to this list. this is just a start. @@ -294,6 +314,12 @@ class AddDialog(GUIObject): mainWidgetName = "addDialog" uiFile = "spokes/lib/custom_storage_helpers.glade"
+ # If the user enters a smaller size, the GUI changes it to this value + MIN_SIZE_ENTRY = Size("1 MiB") + + # Default to these units if the user does not enter any. + SIZE_UNITS_DEFAULT = "MiB" + def __init__(self, *args, **kwargs): self.mountpoints = kwargs.pop("mountpoints", []) GUIObject.__init__(self, *args, **kwargs) @@ -320,7 +346,11 @@ class AddDialog(GUIObject): if self._error: return
- self.size = size_from_entry(self.builder.get_object("addSizeEntry")) + self.size = size_from_entry( + self.builder.get_object("addSizeEntry"), + lower_bound=self.MIN_SIZE_ENTRY, + units=self.SIZE_UNITS_DEFAULT + ) self.window.destroy()
def refresh(self): @@ -440,6 +470,12 @@ class ContainerDialog(GUIObject, GUIDialogInputCheckHandler): mainWidgetName = "container_dialog" uiFile = "spokes/lib/custom_storage_helpers.glade"
+ # If the user enters a smaller size, the GUI changes it to this value + MIN_SIZE_ENTRY = Size("1 MiB") + + # Default to these units if the user does not enter any. + SIZE_UNITS_DEFAULT = "MiB" + def __init__(self, *args, **kwargs): GUIDialogInputCheckHandler.__init__(self)
@@ -575,7 +611,11 @@ class ContainerDialog(GUIObject, GUIDialogInputCheckHandler): size = SIZE_POLICY_MAX elif idx == 2: if self._original_size_text != self._sizeEntry.get_text(): - size = size_from_entry(self._sizeEntry) + size = size_from_entry( + self._sizeEntry, + lower_bound=self.MIN_SIZE_ENTRY, + units=self.SIZE_UNITS_DEFAULT + ) if size is None: size = SIZE_POLICY_MAX else:
On Tue, 2014-10-21 at 10:06 -0400, mulhern wrote:
- In size_from_input(), do not round up to any lower bound, just get the
size. It's more general that way.
- Parameterize size_from_input() on default units.
- Parameterize size_from_entry() on a lower bound and on default units.
- Add method docstrings.
Should not change any observable behavior.
Signed-off-by: mulhern amulhern@redhat.com
pyanaconda/storage_utils.py | 22 ++++++---- pyanaconda/ui/gui/spokes/custom.py | 14 +++++-- .../ui/gui/spokes/lib/custom_storage_helpers.py | 48 ++++++++++++++++++++-- 3 files changed, 68 insertions(+), 16 deletions(-)
diff --git a/pyanaconda/storage_utils.py b/pyanaconda/storage_utils.py index 7d26e78..4c35184 100644 --- a/pyanaconda/storage_utils.py +++ b/pyanaconda/storage_utils.py @@ -90,26 +90,30 @@ AUTOPART_DEVICE_TYPES = {AUTOPART_TYPE_LVM: DEVICE_TYPE_LVM, NAMED_DEVICE_TYPES = (DEVICE_TYPE_BTRFS, DEVICE_TYPE_LVM, DEVICE_TYPE_MD, DEVICE_TYPE_LVM_THINP) CONTAINER_DEVICE_TYPES = (DEVICE_TYPE_LVM, DEVICE_TYPE_BTRFS, DEVICE_TYPE_LVM_THINP)
-def size_from_input(input_str):
- """Get size from user's input"""
+def size_from_input(input_str, units=None):
I think 'units' should default to 'MiB' as that's what e.g. pykickstart does. Otherwise the SIZE_UNITS_DEFAULT constant should be moved to pyanaconda/constants.py so that it can be used in other places as well enforcing consistency between those places.
----- Original Message -----
From: "Vratislav Podzimek" vpodzime@redhat.com To: "anaconda patch review" anaconda-patches@lists.fedorahosted.org Sent: Wednesday, October 22, 2014 1:55:25 AM Subject: Re: [anaconda:master 2/2] Make size_from_input() and size_from_entry() methods handier.
On Tue, 2014-10-21 at 10:06 -0400, mulhern wrote:
- In size_from_input(), do not round up to any lower bound, just get the
size. It's more general that way.
- Parameterize size_from_input() on default units.
- Parameterize size_from_entry() on a lower bound and on default units.
- Add method docstrings.
Should not change any observable behavior.
Signed-off-by: mulhern amulhern@redhat.com
pyanaconda/storage_utils.py | 22 ++++++---- pyanaconda/ui/gui/spokes/custom.py | 14 +++++-- .../ui/gui/spokes/lib/custom_storage_helpers.py | 48 ++++++++++++++++++++-- 3 files changed, 68 insertions(+), 16 deletions(-)
diff --git a/pyanaconda/storage_utils.py b/pyanaconda/storage_utils.py index 7d26e78..4c35184 100644 --- a/pyanaconda/storage_utils.py +++ b/pyanaconda/storage_utils.py @@ -90,26 +90,30 @@ AUTOPART_DEVICE_TYPES = {AUTOPART_TYPE_LVM: DEVICE_TYPE_LVM, NAMED_DEVICE_TYPES = (DEVICE_TYPE_BTRFS, DEVICE_TYPE_LVM, DEVICE_TYPE_MD, DEVICE_TYPE_LVM_THINP) CONTAINER_DEVICE_TYPES = (DEVICE_TYPE_LVM, DEVICE_TYPE_BTRFS, DEVICE_TYPE_LVM_THINP)
-def size_from_input(input_str):
- """Get size from user's input"""
+def size_from_input(input_str, units=None):
I think 'units' should default to 'MiB' as that's what e.g. pykickstart does. Otherwise the SIZE_UNITS_DEFAULT constant should be moved to pyanaconda/constants.py so that it can be used in other places as well enforcing consistency between those places.
-- Vratislav Podzimek
Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic
anaconda-patches mailing list anaconda-patches@lists.fedorahosted.org https://lists.fedorahosted.org/mailman/listinfo/anaconda-patches
OK, SIZE_UNITS_DEFAULT moved out to pyanaconda/constants.py.
- mulhern
anaconda-patches@lists.fedorahosted.org