Completed
Pull Request — master (#931)
by James
01:24
created

zipline.assets.generate_asset_db_metadata()   A

Complexity

Conditions 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 1
dl 0
loc 9
rs 9.6667
1
import sqlalchemy as sa
2
3
4
def generate_asset_db_metadata(bind=None):
5
    metadata = sa.MetaData(bind=bind)
6
    _version_table_schema(metadata)
7
    _equities_table_schema(metadata)
8
    _futures_exchanges_schema(metadata)
9
    _futures_root_symbols_schema(metadata)
10
    _futures_contracts_schema(metadata)
11
    _asset_router_schema(metadata)
12
    return metadata
13
14
15
# Define a version number for the database generated by these writers
16
# Increment this version number any time a breaking change is made to the
17
# schema and readers of the database
18
ASSET_DB_VERSION = 0
19
20
21
# A list of the names of all tables in the assets db
22
asset_db_table_names = ['version_info', 'equities', 'futures_exchanges',
23
                        'futures_root_symbols', 'futures_contracts',
24
                        'asset_router']
25
26
27
def _equities_table_schema(metadata):
28
    return sa.Table(
29
        'equities',
30
        metadata,
31
        sa.Column(
32
            'sid',
33
            sa.Integer,
34
            unique=True,
35
            nullable=False,
36
            primary_key=True,
37
        ),
38
        sa.Column('symbol', sa.Text),
39
        sa.Column('company_symbol', sa.Text, index=True),
40
        sa.Column('share_class_symbol', sa.Text),
41
        sa.Column('fuzzy_symbol', sa.Text, index=True),
42
        sa.Column('asset_name', sa.Text),
43
        sa.Column('start_date', sa.Integer, default=0, nullable=False),
44
        sa.Column('end_date', sa.Integer, nullable=False),
45
        sa.Column('first_traded', sa.Integer, nullable=False),
46
        sa.Column('exchange', sa.Text),
47
    )
48
49
50
def _futures_exchanges_schema(metadata):
51
    return sa.Table(
52
        'futures_exchanges',
53
        metadata,
54
        sa.Column(
55
            'exchange',
56
            sa.Text,
57
            unique=True,
58
            nullable=False,
59
            primary_key=True,
60
        ),
61
        sa.Column('timezone', sa.Text),
62
    )
63
64
65
def _futures_root_symbols_schema(metadata):
66
    return sa.Table(
67
        'futures_root_symbols',
68
        metadata,
69
        sa.Column(
70
            'root_symbol',
71
            sa.Text,
72
            unique=True,
73
            nullable=False,
74
            primary_key=True,
75
        ),
76
        sa.Column('root_symbol_id', sa.Integer),
77
        sa.Column('sector', sa.Text),
78
        sa.Column('description', sa.Text),
79
        sa.Column(
80
            'exchange',
81
            sa.Text,
82
            sa.ForeignKey('futures_exchanges.exchange'),
83
        ),
84
    )
85
86
87
def _futures_contracts_schema(metadata):
88
    return sa.Table(
89
        'futures_contracts',
90
        metadata,
91
        sa.Column(
92
            'sid',
93
            sa.Integer,
94
            unique=True,
95
            nullable=False,
96
            primary_key=True,
97
        ),
98
        sa.Column('symbol', sa.Text, unique=True, index=True),
99
        sa.Column(
100
            'root_symbol',
101
            sa.Text,
102
            sa.ForeignKey('futures_root_symbols.root_symbol'),
103
            index=True
104
        ),
105
        sa.Column('asset_name', sa.Text),
106
        sa.Column('start_date', sa.Integer, default=0, nullable=False),
107
        sa.Column('end_date', sa.Integer, nullable=False),
108
        sa.Column('first_traded', sa.Integer, nullable=False),
109
        sa.Column(
110
            'exchange',
111
            sa.Text,
112
            sa.ForeignKey('futures_exchanges.exchange'),
113
        ),
114
        sa.Column('notice_date', sa.Integer, nullable=False),
115
        sa.Column('expiration_date', sa.Integer, nullable=False),
116
        sa.Column('auto_close_date', sa.Integer, nullable=False),
117
        sa.Column('contract_multiplier', sa.Float),
118
    )
119
120
121
def _asset_router_schema(metadata):
122
    return sa.Table(
123
        'asset_router',
124
        metadata,
125
        sa.Column(
126
            'sid',
127
            sa.Integer,
128
            unique=True,
129
            nullable=False,
130
            primary_key=True),
131
        sa.Column('asset_type', sa.Text),
132
    )
133
134
135
def _version_table_schema(metadata):
136
    return sa.Table(
137
        'version_info',
138
        metadata,
139
        sa.Column(
140
            'id',
141
            sa.Integer,
142
            unique=True,
143
            nullable=False,
144
            primary_key=True,
145
        ),
146
        sa.Column(
147
            'version',
148
            sa.Integer,
149
            unique=True,
150
            nullable=False,
151
        ),
152
        # This constraint ensures a single entry in this table
153
        sa.CheckConstraint('id <= 1'),
154
    )
155