示例#1
0
def test_exchange_save():
    database = DatabaseChooser("testy")
    data = {
        ("testy", "A"): {},
        ("testy", "C"): {"type": "biosphere"},
        ("testy", "B"): {
            "exchanges": [
                {"input": ("testy", "A"), "amount": 1, "type": "technosphere"},
                {"input": ("testy", "B"), "amount": 1, "type": "production"},
                {"input": ("testy", "C"), "amount": 1, "type": "biosphere"},
            ]
        },
    }
    then = datetime.datetime.now().isoformat()
    database.write(data)
    act = database.get("B")
    exc = [x for x in act.production()][0]
    exc["amount"] = 2
    exc.save()
    assert databases[database.name].get("dirty")
    assert database.metadata.get("dirty")
    assert database.metadata["modified"] > then

    exc = [x for x in act.production()][0]
    assert exc["amount"] == 2
示例#2
0
 def test_base_class(self):
     database = DatabaseChooser("a database")
     self.assertEqual(database._metadata, databases)
     self.assertEqual(
         [x[0] for x in database.dtype_fields],
         [numpy_string(x) for x in ('input', 'output', 'row', 'col', 'type')]
     )
示例#3
0
def test_untyped_exchange_error():
    database = DatabaseChooser("testy")
    database_data = {
        ("testy", "A"): {"exchanges": [{"amount": 1, "input": ("testy", "A")}]},
    }
    with pytest.raises(UntypedExchange):
        database.write(database_data, process=False)
示例#4
0
 def test_dirty_activities(self):
     database = DatabaseChooser("testy")
     data = {
         ("testy", "A"): {},
         ("testy", "C"): {'type': 'biosphere'},
         ("testy", "B"): {'exchanges': [
             {'input': ("testy", "A"),
              'amount': 1,
              'type': 'technosphere'},
             {'input': ("testy", "B"),
              'amount': 1,
              'type': 'production'},
             {'input': ("testy", "C"),
              'amount': 1,
              'type': 'biosphere'},
         ]},
     }
     database.write(data)
     act = database.get("B")
     exc = [x for x in act.production()][0]
     exc['amount'] = 2
     exc.save()
     self.assertTrue(databases['testy']['dirty'])
     lca = act.lca()
     self.assertFalse(databases['testy'].get('dirty'))
     self.assertEqual(
         lca.supply_array[lca.activity_dict[("testy", "A")]],
         0.5
     )
示例#5
0
def test_no_input_raises_invalid_exchange():
    database = DatabaseChooser("testy")
    database_data = {
        ("testy", "A"): {"exchanges": [{"amount": 1}]},
    }
    with pytest.raises(InvalidExchange):
        database.write(database_data, process=False)
示例#6
0
def test_processed_array():
    database = DatabaseChooser("a database")
    database.write(
        {
            ("a database", "2"): {
                "type": "process",
                "exchanges": [
                    {
                        "input": ("a database", "2"),
                        "amount": 42,
                        "uncertainty_type": 7,
                        "type": "production",
                    }
                ],
            }
        }
    )
    package = load_datapackage(ZipFS(database.filepath_processed()))
    print(package.resources)
    array = package.get_resource("a_database_technosphere_matrix.data")[0]

    assert array.shape == (1,)
    assert array[0] == 42

    array = package.get_resource("a_database_technosphere_matrix.distributions")[0]
    assert array.shape == (1,)
    assert array[0]["uncertainty_type"] == 7
def test_delete_activity_parameters():
    db = DatabaseChooser("example")
    db.register()

    a = db.new_activity(code="A", name="An activity")
    a.save()
    b = db.new_activity(code="B", name="Another activity")
    b.save()
    a.new_exchange(amount=0,
                   input=b,
                   type="technosphere",
                   formula="foo * bar + 4").save()

    activity_data = [{
        'name': 'reference_me',
        'formula': 'sqrt(25)',
        'database': 'example',
        'code': "B",
    }, {
        'name': 'bar',
        'formula': 'reference_me + 2',
        'database': 'example',
        'code': "A",
    }]
    parameters.new_activity_parameters(activity_data, "my group")
    parameters.add_exchanges_to_group("my group", a)

    assert ActivityParameter.select().count() == 2
    assert ParameterizedExchange.select().count() == 1

    a.delete()
    assert ActivityParameter.select().count() == 1
    assert not ParameterizedExchange.select().count()
示例#8
0
    def test_exchange_save(self):
        database = DatabaseChooser("testy")
        data = {
            ("testy", "A"): {},
            ("testy", "C"): {'type': 'biosphere'},
            ("testy", "B"): {'exchanges': [
                {'input': ("testy", "A"),
                 'amount': 1,
                 'type': 'technosphere'},
                {'input': ("testy", "B"),
                 'amount': 1,
                 'type': 'production'},
                {'input': ("testy", "C"),
                 'amount': 1,
                 'type': 'biosphere'},
            ]},
        }
        then = datetime.datetime.now().isoformat()
        database.write(data)
        act = database.get("B")
        exc = [x for x in act.production()][0]
        exc['amount'] = 2
        exc.save()
        self.assertTrue(databases[database.name].get("dirty"))
        self.assertTrue(database.metadata.get("dirty"))
        self.assertTrue(database.metadata['modified'] > then)

        exc = [x for x in act.production()][0]
        self.assertEqual(exc['amount'], 2)
示例#9
0
def extract_brightway2_databases(database_names):
    """Extract a Brightway2 SQLiteBackend database to the Wurst internal format.

    ``database_names`` is a list of database names. You should already be in the correct project.

    Returns a list of dataset documents."""
    ERROR = "Must pass list of database names"
    if isinstance(database_names, str):
        database_names = [database_names]
    assert isinstance(database_names, (list, tuple, set)), ERROR

    databases = [DatabaseChooser(name) for name in database_names]
    ERROR = "Wrong type of database object (must be SQLiteBackend)"
    assert all(isinstance(obj, SQLiteBackend) for obj in databases), ERROR

    # Construct generators for both activities and exchanges
    # Need to be clever to minimize copying and memory use
    activity_qs = ActivityDataset.select().where(ActivityDataset.database << database_names)
    exchange_qs = ExchangeDataset.select().where(ExchangeDataset.output_database << database_names)

    # Retrieve all activity data
    print("Getting activity data")
    activities = [extract_activity(o) for o in tqdm(activity_qs)]
    # Add each exchange to the activity list of exchanges
    print("Adding exchange data to activities")
    add_exchanges_to_consumers(activities, exchange_qs)
    # Add details on exchanges which come from our databases
    print("Filling out exchange data")
    add_input_info_for_indigenous_exchanges(activities, database_names)
    add_input_info_for_external_exchanges(activities, database_names)
    return activities
示例#10
0
def test_raise_wrong_database():
    data = {
        ("foo", '1'): {}
    }
    d = DatabaseChooser("bar")
    with pytest.raises(WrongDatabase):
        d.write(data)
示例#11
0
def test_process_without_exchanges_still_in_processed_array():
    database = DatabaseChooser("a database")
    database.write({("a database", "foo"): {}})

    package = load_datapackage(ZipFS(database.filepath_processed()))
    array = package.get_resource("a_database_technosphere_matrix.data")[0]
    assert array[0] == 1
    assert array.shape == (1,)
示例#12
0
    def __init__(self, destination_db):

        # Check that database exists
        if len(DatabaseChooser(destination_db)) == 0:
            raise NameError('The database selected is empty. Make sure the name is correct and that the current'
                            ' brightway2 project contains the database.')
        self.destination = destination_db
        self.db = wurst.extract_brightway2_databases(self.destination)
示例#13
0
 def test_zero_amount_is_valid_exchange(self):
     database = DatabaseChooser("testy")
     database.register()
     database_data = {
         ("testy", "A"): {'exchanges': [
             {'input': ('testy', 'A'), 'type': 'technosphere', 'amount': 0.}
         ]},
     }
     database.write(database_data, process=False)
示例#14
0
def test_process_adds_to_mappings():
    database = DatabaseChooser("testy")
    database_data = {
        ("testy", "A"): {'location': 'CH'},
        ("testy", "B"): {'location': 'DE'},
    }
    database.write(database_data)
    assert ("testy", "A") in mapping and ("testy", "B") in mapping
    assert "CH" in geomapping and "DE" in geomapping
示例#15
0
def test_change_code(activity):
    db = DatabaseChooser("a database")
    assert len(db) == 1
    old_key = activity.key[:]
    activity["code"] = "a new one"
    assert len(db) == 1
    assert get_activity(("a database", "a new one"))
    with pytest.raises(DoesNotExist):
        get_activity(old_key)
示例#16
0
def test_no_amount_raises_invalid_exchange():
    database = DatabaseChooser("testy")
    database_data = {
        ("testy", "A"): {
            "exchanges": [{"input": ("testy", "A"), "type": "technosphere"}]
        },
    }
    with pytest.raises(InvalidExchange):
        database.write(database_data, process=False)
示例#17
0
 def test_untyped_exchange_error(self):
     database = DatabaseChooser("testy")
     database.register()
     database_data = {
         ("testy", "A"): {'exchanges': [
             {'amount': 1, 'input': ('testy', 'A')}
         ]},
     }
     with self.assertRaises(UntypedExchange):
         database.write(database_data, process=False)
示例#18
0
 def test_no_input_raises_invalid_exchange(self):
     database = DatabaseChooser("testy")
     database.register()
     database_data = {
         ("testy", "A"): {'exchanges': [
             {'amount': 1}
         ]},
     }
     with self.assertRaises(InvalidExchange):
         database.write(database_data, process=False)
示例#19
0
 def test_no_amount_raises_invalid_exchange(self):
     database = DatabaseChooser("testy")
     database.register()
     database_data = {
         ("testy", "A"): {'exchanges': [
             {'input': ('testy', 'A'), 'type': 'technosphere'}
         ]},
     }
     with self.assertRaises(InvalidExchange):
         database.write(database_data, process=False)
示例#20
0
def test_zero_amount_is_valid_exchange():
    database = DatabaseChooser("testy")
    database_data = {
        ("testy", "A"): {
            "exchanges": [
                {"input": ("testy", "A"), "type": "technosphere", "amount": 0.0}
            ]
        },
    }
    database.write(database_data, process=False)
示例#21
0
def test_find_graph_dependents():
    databases['one'] = {'depends': ['two', 'three']}
    databases['two'] = {'depends': ['four', 'five']}
    databases['three'] = {'depends': ['four']}
    databases['four'] = {'depends': ['six']}
    databases['five'] = {'depends': ['two']}
    databases['six'] = {'depends': []}
    assert (
        DatabaseChooser('one').find_graph_dependents() ==
        {'one', 'two', 'three', 'four', 'five', 'six'}
    )
示例#22
0
def test_new_activity():
    database = DatabaseChooser("a database")
    database.register()
    act = database.new_activity("foo", this="that", name="something")
    act.save()

    act = database.get("foo")
    assert act["database"] == "a database"
    assert act["code"] == "foo"
    assert act["location"] == "GLO"
    assert act["this"] == "that"
示例#23
0
def test_process_checks_process_type():
    database = DatabaseChooser("a database")
    database.write(
        {
            ("a database", "foo"): {"exchanges": [], "type": "process"},
            ("a database", "bar"): {"type": "definitely not a process"},
        },
        process=True,
    )
    # This shouldn't raise an error
    assert database.process() is None
示例#24
0
 def test_process_without_exchanges_still_in_processed_array(self):
     database = DatabaseChooser("a database")
     database.write({("a database", "foo"): {}})
     fp = os.path.join(
         projects.dir,
         "processed",
         database.filename + ".npy"
     )
     array = np.load(fp)
     self.assertEqual(array['amount'][0], 1)
     self.assertEqual(array.shape, (1,))
示例#25
0
    def test_new_activity(self):
        database = DatabaseChooser("a database")
        database.register()
        act = database.new_activity('foo', this="that", name='something')
        act.save()

        act = database.get('foo')
        self.assertEqual(act['database'], 'a database')
        self.assertEqual(act['code'], 'foo')
        self.assertEqual(act['location'], 'GLO')
        self.assertEqual(act['this'], 'that')
示例#26
0
def test_deletes_from_database():
    d = DatabaseChooser("biosphere")
    d.write(biosphere)
    assert "biosphere" in databases
    del databases['biosphere']
    assert next(sqlite3_lci_db.execute_sql(
        "select count(*) from activitydataset where database = 'biosphere'"
    )) == (0,)
    assert next(sqlite3_lci_db.execute_sql(
        "select count(*) from exchangedataset where output_database = 'biosphere'"
    )) == (0,)
示例#27
0
 def test_process_geomapping_array(self):
     database = DatabaseChooser("a database")
     database.register()
     database.write({})
     fp = os.path.join(
         projects.dir,
         "processed",
         database.filename + ".geomapping.npy"
     )
     array = np.load(fp)
     fieldnames = {'activity', 'geo', 'row', 'col'}
     self.assertFalse(fieldnames.difference(set(array.dtype.names)))
示例#28
0
def test_process_unknown_object():
    database = DatabaseChooser("testy")
    data = {
        ("testy", "A"): {},
        ("testy", "B"): {
            "exchanges": [
                {"input": ("testy", "A"), "amount": 1, "type": "technosphere"},
                {"input": ("testy", "C"), "amount": 1, "type": "technosphere"},
            ]
        },
    }
    with pytest.raises(UnknownObject):
        database.write(data)
示例#29
0
def test_method_processed_array(reset):
    database = DatabaseChooser("foo")
    database.write({("foo", "bar"): {}})

    method = Method(("a", "method"))
    method.write([[("foo", "bar"), 42]])
    package = load_datapackage(ZipFS(method.filepath_processed()))
    data = package.get_resource("a_method_matrix_data.data")[0]
    assert np.allclose(data, [42])

    indices = package.get_resource("a_method_matrix_data.indices")[0]
    assert np.allclose(indices["row"], get_id(("foo", "bar")))
    assert np.allclose(indices["col"], geomapping[config.global_location])
示例#30
0
def test_process_invalid_exchange_value():
    database = DatabaseChooser("testy")
    data = {
        ("testy", "A"): {},
        ("testy", "B"): {
            "exchanges": [
                {"input": ("testy", "A"), "amount": np.nan, "type": "technosphere"},
                {"input": ("testy", "C"), "amount": 1, "type": "technosphere"},
            ]
        },
    }
    with pytest.raises(ValueError):
        database.write(data)