def pull(self, images, file_name=None, save=True, **kwargs):
force = False<EOL>if "<STR_LIT>" in kwargs:<EOL><INDENT>force = kwargs['<STR_LIT>']<EOL><DEDENT>if not isinstance(images, list):<EOL><INDENT>images = [images]<EOL><DEDENT>bot.debug('<STR_LIT>' % len(images))<EOL>finished = []<EOL>for image in images:<EOL><INDENT>names = parse_image_name(remove_uri(image))<EOL>collection = self._get_collection(names['<STR_LIT>'])<EOL>if collection is None:<EOL><INDENT>bot.error('<STR_LIT>' % names['<STR_LIT>'])<EOL>collections = self.get_collections()<EOL>if collections:<EOL><INDENT>bot.info('<STR_LIT>' %'<STR_LIT:\n>'.join(collections))<EOL><DEDENT>sys.exit(<NUM_LIT:1>)<EOL><DEDENT>image_name = os.path.basename(names['<STR_LIT>'])<EOL>try:<EOL><INDENT>obj_tuple = self.conn.get_object(names['<STR_LIT>'], image_name)<EOL><DEDENT>except ClientException:<EOL><INDENT>bot.exit('<STR_LIT>' % names['<STR_LIT>'])<EOL><DEDENT>if names['<STR_LIT:version>'] == None:<EOL><INDENT>names['<STR_LIT:version>'] = obj_tuple[<NUM_LIT:0>]['<STR_LIT>']<EOL><DEDENT>if file_name is None:<EOL><INDENT>file_name = self._get_storage_name(names)<EOL><DEDENT>if os.path.exists(file_name) and force is False:<EOL><INDENT>bot.error('<STR_LIT>')<EOL>sys.exit(<NUM_LIT:1>) <EOL><DEDENT>with open(file_name, '<STR_LIT:wb>') as filey:<EOL><INDENT>filey.write(obj_tuple[<NUM_LIT:1>])<EOL><DEDENT>if save is True:<EOL><INDENT>names.update(obj_tuple[<NUM_LIT:0>])<EOL>container = self.add(image_path = file_name,<EOL>image_uri = names['<STR_LIT>'],<EOL>metadata = names)<EOL>image_file = container.image<EOL>if os.path.exists(image_file):<EOL><INDENT>bot.debug('<STR_LIT>' %image_file)<EOL>bot.custom(prefix="<STR_LIT>", message=image_file)<EOL>finished.append(image_file)<EOL><DEDENT><DEDENT>else:<EOL><INDENT>bot.error('<STR_LIT>' % path)<EOL><DEDENT><DEDENT>if len(finished) == <NUM_LIT:1>:<EOL><INDENT>finished = finished[<NUM_LIT:0>]<EOL><DEDENT>return finished<EOL>
pull an image from storage using Swift. The image is found based on the
       storage uri

       Parameters
       ==========
       images: refers to the uri given by the user to pull in the format
       <collection>/<namespace>. You should have an API that is able to 
       retrieve a container based on parsing this uri.
       file_name: the user's requested name for the file. It can 
                  optionally be None if the user wants a default.
       save: if True, you should save the container to the database
             using self.add()

       Returns
       =======
       finished: a single container path, or list of paths