| @@ -218,6 +218,13 @@ class Persona(object): | |||
| return self._identity | |||
| def new_version(self, *args): | |||
| '''Update the Persona's Identity object.''' | |||
| self._identity = self.sign(self._identity.new_version(*args)) | |||
| return self._identity | |||
| def store(self, fname): | |||
| '''Store the Persona to a file. If there is a private | |||
| key associated w/ the Persona, it will be saved as well.''' | |||
| @@ -457,17 +464,36 @@ def enumeratedir(_dir, created_by_ref): | |||
| def main(): | |||
| from optparse import OptionParser | |||
| import sys | |||
| parser = OptionParser() | |||
| parser.add_option('-a', action='append', dest='add', | |||
| default=[], help='add the arg as metadata for files, tag=value') | |||
| parser.add_option('-d', action='append', dest='delete', | |||
| default=[], help='delete the arg as metadata from files. Either specify tag, and all tags are removed, or specify tag=value and that specific tag will be removed.') | |||
| parser.add_option('-g', action='store_true', dest='generateident', | |||
| default=False, help='generate an identity') | |||
| parser.add_option('-l', action='store_true', dest='list', | |||
| default=False, help='list metadata') | |||
| options, args = parser.parse_args() | |||
| # this is shared between generateident and add | |||
| addprops = map(lambda x: x.split('=', 1), options.add) | |||
| if options.generateident: | |||
| identfname = os.path.expanduser('~/.medashare_identity.pasn1') | |||
| if os.path.exists(identfname): | |||
| print >>sys.stderr, 'Error: Identity already created.' | |||
| sys.exit(1) | |||
| persona = Persona() | |||
| persona.generate_key() | |||
| persona.new_version(*addprops) | |||
| persona.store(identfname) | |||
| return | |||
| storefname = os.path.expanduser('~/.medashare_store.pasn1') | |||
| import sys | |||
| #print >>sys.stderr, `storefname` | |||
| @@ -480,7 +506,6 @@ def main(): | |||
| for k, v in _iterdictlist(j): | |||
| print '%s:\t%s' % (k, v) | |||
| elif options.add: | |||
| addprops = map(lambda x: x.split('=', 1), options.add) | |||
| for i in args: | |||
| for j in objstr.by_file(i): | |||
| nobj = j.new_version(*addprops) | |||
| @@ -805,6 +830,24 @@ class _TestCases(unittest.TestCase): | |||
| with mock.patch('os.path.expanduser', side_effect=expandusermock) \ | |||
| as eu: | |||
| with nested(mock.patch('sys.stdout', | |||
| StringIO.StringIO()), mock.patch('sys.argv', | |||
| [ 'progname', '-g', '-a', 'name=A Test User' ])) as (stdout, argv): | |||
| main() | |||
| self.assertEqual(stdout.getvalue(), | |||
| '') | |||
| eu.assert_called_with('~/.medashare_identity.pasn1') | |||
| persona = Persona.load(identfname) | |||
| self.assertEqual(persona.get_identity().name, 'A Test User') | |||
| with nested(mock.patch('sys.stderr', | |||
| StringIO.StringIO()), mock.patch('sys.argv', | |||
| [ 'progname', '-g', '-a', 'name=A Test User' ])) as (stderr, argv): | |||
| self.assertRaises(SystemExit, main) | |||
| self.assertEqual(stderr.getvalue(), | |||
| 'Error: Identity already created.\n') | |||
| eu.assert_called_with('~/.medashare_identity.pasn1') | |||
| with nested(mock.patch('sys.stdout', | |||
| StringIO.StringIO()), mock.patch('sys.argv', | |||
| [ 'progname', '-l', testfname ])) as (stdout, argv): | |||