dm-metamapper 0.0.11 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/dm-metamapper.rb +2 -1
- data/lib/dm-metamapper/generators/cpp.rb +1 -1
- data/lib/dm-metamapper/property.rb +3 -5
- data/lib/dm-metamapper/version.rb +6 -0
- data/lib/templates/cpp/class.hpp.erb +8 -1
- data/lib/templates/cpp/dmmm_comparators.hpp~ +75 -0
- data/lib/templates/cpp/dmmm_dbface.cpp~ +190 -0
- data/lib/templates/cpp/dmmm_dbface.h~ +47 -0
- data/lib/templates/cpp/dmmm_fields.hpp.erb~ +27 -0
- data/lib/templates/cpp/dmmm_fields.hpp~ +31 -0
- data/lib/templates/cpp/dmmm_id.h~ +75 -0
- data/lib/templates/cpp/dmmm_identifiers.hpp~ +208 -0
- data/lib/templates/cpp/dmmm_utils.cpp.erb~ +8 -0
- data/lib/templates/cpp/dmmm_utils.hpp~ +39 -0
- data/lib/templates/cpp/instance.hpp.erb +1 -1
- metadata +36 -34
- data/.autospec +0 -6
- data/.gitignore +0 -6
- data/Gemfile +0 -22
- data/Rakefile +0 -24
- data/VERSION +0 -1
- data/example/.gitignore +0 -1
- data/example/Makefile +0 -4
- data/example/example.cpp +0 -78
- data/example/example.rb +0 -50
- data/spec/dm-metamapper/generator_spec.rb +0 -62
- data/spec/dm-metamapper/template_spec.rb +0 -29
- data/spec/spec.opts +0 -4
- data/spec/spec_helper.rb +0 -10
data/lib/dm-metamapper.rb
CHANGED
@@ -27,7 +27,7 @@ module DataMapper
|
|
27
27
|
"Field<I_#{decolonize(model.name)}>"
|
28
28
|
elsif key_to_parent[prop.name]
|
29
29
|
"Field<I_#{key_to_parent[prop.name]}>"
|
30
|
-
elsif
|
30
|
+
elsif DataMapper::Property::Enum === prop
|
31
31
|
name = prop.name.to_s.upcase
|
32
32
|
enums[name] = prop
|
33
33
|
"Field<Enum#{decolonize(model.name)}#{name}>"
|
@@ -34,6 +34,13 @@ public:
|
|
34
34
|
if (!parent._constraint.nil())
|
35
35
|
_constraint._cond += " AND " + parent._constraint._cond;
|
36
36
|
}
|
37
|
+
|
38
|
+
T_<%= class_name %>(const I_<%= parent %>& parentId)
|
39
|
+
{
|
40
|
+
_tables.push_back("<%= model.storage_name %>");
|
41
|
+
|
42
|
+
_constraint._cond = "(<%= model.storage_name + "." + r[1].child_key.first.name.to_s %> = " + parentId.to_s() + ")";
|
43
|
+
}
|
37
44
|
<% end %>
|
38
45
|
|
39
46
|
<% model.generated_properties.each do |property| %>
|
@@ -74,7 +81,7 @@ public:
|
|
74
81
|
for(size_t i = 0; i < res.size(); ++i){
|
75
82
|
<% model.generated_properties.each do |property| %>
|
76
83
|
r[i]._f_<%= property.name %>._base =
|
77
|
-
<% if
|
84
|
+
<% if DataMapper::Property::Enum === property %>
|
78
85
|
(<%= property.cpp_name %>::Base)UTILS::fromString<size_t>(res[i]["<%= property.name %>"]);
|
79
86
|
<% else %>
|
80
87
|
UTILS::fromString<<%= property.cpp_name %>::Base>(res[i]["<%= property.name %>"]);
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#ifndef PPORM_COMPARATORS_H
|
2
|
+
#define PPORM_COMPARATORS_H
|
3
|
+
|
4
|
+
#include <string>
|
5
|
+
|
6
|
+
#include <sstream>
|
7
|
+
|
8
|
+
namespace PPORM {
|
9
|
+
template<class E>
|
10
|
+
typename E::ConditionType operator== (E e, const typename E::ComparerType& x){
|
11
|
+
typename E::ConditionType c;
|
12
|
+
c._cond = e._field + " = '" + toString(x) + "'";
|
13
|
+
return c;
|
14
|
+
}
|
15
|
+
|
16
|
+
template<class E>
|
17
|
+
typename E::ConditionType operator< (E e, const typename E::ComparerType& x){
|
18
|
+
typename E::ConditionType c;
|
19
|
+
c._cond = e._field + " < '" + toString(x) + "'";
|
20
|
+
return c;
|
21
|
+
}
|
22
|
+
|
23
|
+
template<class E>
|
24
|
+
typename E::ConditionType operator<= (E e, const typename E::ComparerType& x){
|
25
|
+
typename E::ConditionType c;
|
26
|
+
c._cond = e._field + " <= '" + toString(x) + "'";
|
27
|
+
return c;
|
28
|
+
}
|
29
|
+
|
30
|
+
template<class E>
|
31
|
+
typename E::ConditionType operator> (E e, const typename E::ComparerType& x){
|
32
|
+
typename E::ConditionType c;
|
33
|
+
c._cond = e._field + " > '" + toString(x) + "'";
|
34
|
+
return c;
|
35
|
+
}
|
36
|
+
|
37
|
+
template<class E>
|
38
|
+
typename E::ConditionType operator>= (E e, const typename E::ComparerType& x){
|
39
|
+
typename E::ConditionType c;
|
40
|
+
c._cond = e._field + " >= '" + toString(x) + "'";
|
41
|
+
return c;
|
42
|
+
}
|
43
|
+
|
44
|
+
template<class E>
|
45
|
+
typename E::ConditionType operator!= (E e, const typename E::ComparerType& x){
|
46
|
+
typename E::ConditionType c;
|
47
|
+
c._cond = e._field + " != '" + toString(x) + "'";
|
48
|
+
return c;
|
49
|
+
}
|
50
|
+
|
51
|
+
template<class E>
|
52
|
+
typename E::ConditionType operator%= (E e, const typename E::ComparerType& x){
|
53
|
+
typename E::ConditionType c;
|
54
|
+
c._cond = e._field + " LIKE '" + toString(x) + "'";
|
55
|
+
return c;
|
56
|
+
}
|
57
|
+
|
58
|
+
template<class C>
|
59
|
+
C operator&& (const C& c1, const C& c2){
|
60
|
+
C c;
|
61
|
+
c._cond = "(" + c1._cond + ") AND (" + c2._cond + ")";
|
62
|
+
return c;
|
63
|
+
}
|
64
|
+
|
65
|
+
template<class C>
|
66
|
+
C operator|| (const C& c1, const C& c2){
|
67
|
+
C c;
|
68
|
+
c._cond = "(" + c1._cond + ") OR (" + c2._cond + ")";
|
69
|
+
return c;
|
70
|
+
}
|
71
|
+
|
72
|
+
|
73
|
+
} //namespace PPORM
|
74
|
+
|
75
|
+
#endif //PPORM_COMPARATORS_H
|
@@ -0,0 +1,190 @@
|
|
1
|
+
#include "dbface.h"
|
2
|
+
#include "utils.hpp"
|
3
|
+
using namespace mysqlpp;
|
4
|
+
using namespace std;
|
5
|
+
|
6
|
+
DBFace* DBFace::_this = NULL;
|
7
|
+
|
8
|
+
DBFace::DBFace(const string& database, const string& host,
|
9
|
+
const string& user, const string& password)
|
10
|
+
:_database(database)
|
11
|
+
{
|
12
|
+
_this = this;
|
13
|
+
if (!_connection.connect(database.c_str(), host.c_str(),
|
14
|
+
user.c_str(), password.c_str())){
|
15
|
+
cerr << "Could not connect to DB";
|
16
|
+
exit(-1);
|
17
|
+
}
|
18
|
+
_dbtype2BaseType["int"] = "int";
|
19
|
+
_dbtype2BaseType["bigint"] = "int";
|
20
|
+
_dbtype2BaseType["tinyint"] = "int";
|
21
|
+
_dbtype2BaseType["text"] = "std::string";
|
22
|
+
_dbtype2BaseType["float"] = "double";
|
23
|
+
_dbtype2BaseType["datetime"] = "std::string";
|
24
|
+
_dbtype2BaseType["date"] = "std::string";
|
25
|
+
_dbtype2BaseType["varchar"] = "std::string";
|
26
|
+
}
|
27
|
+
|
28
|
+
bool
|
29
|
+
DBFace::select(const std::string& table,
|
30
|
+
const std::vector<string>& columns,
|
31
|
+
const std::string& where,
|
32
|
+
const std::string& additional,
|
33
|
+
QueryRes& rRes)
|
34
|
+
{
|
35
|
+
Query q = _connection.query();
|
36
|
+
|
37
|
+
q << "SELECT ";
|
38
|
+
for (size_t i = 0; i < columns.size(); ++i){
|
39
|
+
if (i > 0)
|
40
|
+
q << ",";
|
41
|
+
q << columns[i];
|
42
|
+
}
|
43
|
+
q << " FROM " << table;
|
44
|
+
if (where.size())
|
45
|
+
q << " WHERE " << where;
|
46
|
+
if (additional.size())
|
47
|
+
q << " " << additional;
|
48
|
+
// cout << q << endl;
|
49
|
+
StoreQueryResult mysqlRes;
|
50
|
+
try{
|
51
|
+
mysqlRes = q.store();
|
52
|
+
}
|
53
|
+
catch (const mysqlpp::Exception& er) {
|
54
|
+
cerr << "Query failed: " << q << endl << er.what();
|
55
|
+
return false;
|
56
|
+
}
|
57
|
+
|
58
|
+
for (size_t i = 0; i < mysqlRes.num_rows(); ++i){
|
59
|
+
rRes.resize(rRes.size() + 1);
|
60
|
+
for (size_t j = 0; j < columns.size(); ++j)
|
61
|
+
rRes.back()[columns[j]] = toString(mysqlRes[i][columns[j].c_str()]);
|
62
|
+
}
|
63
|
+
return true;
|
64
|
+
}
|
65
|
+
|
66
|
+
bool
|
67
|
+
DBFace:: selectTables(QueryRes& rRes)
|
68
|
+
{
|
69
|
+
vector<string> columns;
|
70
|
+
columns.push_back("table_name");
|
71
|
+
string where = "table_schema='" + _database + "'";
|
72
|
+
return select("information_schema.tables", columns, where, "", rRes);
|
73
|
+
}
|
74
|
+
|
75
|
+
|
76
|
+
bool
|
77
|
+
DBFace::selectColumns(const string& table, QueryRes& rRes)
|
78
|
+
{
|
79
|
+
vector<string> columns;
|
80
|
+
columns.push_back("column_name");
|
81
|
+
columns.push_back("data_type");
|
82
|
+
string where =
|
83
|
+
"table_schema='" + _database +
|
84
|
+
"'" + " and table_name='" + table + "'";
|
85
|
+
return select("information_schema.columns", columns, where, "", rRes);
|
86
|
+
}
|
87
|
+
|
88
|
+
|
89
|
+
void
|
90
|
+
DBFace::getTables(vector<Table>& rTables)
|
91
|
+
{
|
92
|
+
QueryRes res;
|
93
|
+
selectTables(res);
|
94
|
+
for (size_t i = 0; i < res.size(); ++i){
|
95
|
+
rTables.resize(rTables.size() + 1);
|
96
|
+
Table& table = rTables.back();
|
97
|
+
table._name = res[i]["table_name"];
|
98
|
+
QueryRes resCols;
|
99
|
+
selectColumns(res[i]["table_name"], resCols);
|
100
|
+
table._hasId = false;
|
101
|
+
for (size_t j = 0; j < resCols.size(); ++j){
|
102
|
+
Column col;
|
103
|
+
col._field = resCols[j]["column_name"];
|
104
|
+
col._type = resCols[j]["data_type"];
|
105
|
+
table._columns.push_back(col);
|
106
|
+
if (col._field == "id")
|
107
|
+
table._hasId = true;
|
108
|
+
}
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
bool
|
113
|
+
DBFace::executeQuery(Query& q)
|
114
|
+
{
|
115
|
+
boost::mutex::scoped_lock lock(_mutex);
|
116
|
+
try{
|
117
|
+
q.execute();
|
118
|
+
}
|
119
|
+
catch (const mysqlpp::Exception& er) {
|
120
|
+
cerr << "Query failed: " << q << endl << er.what();
|
121
|
+
return false;
|
122
|
+
}
|
123
|
+
return true;
|
124
|
+
}
|
125
|
+
|
126
|
+
bool
|
127
|
+
DBFace::insert(const string& table,
|
128
|
+
const map<string, string>& field2Val)
|
129
|
+
{
|
130
|
+
if (field2Val.size() == 0)
|
131
|
+
return true;
|
132
|
+
|
133
|
+
Query q = _connection.query();
|
134
|
+
q << "INSERT INTO " << table << " (";
|
135
|
+
for (map<string, string>::const_iterator it = field2Val.begin();
|
136
|
+
it != field2Val.end(); ++it)
|
137
|
+
{
|
138
|
+
if (it != field2Val.begin())
|
139
|
+
q << ",";
|
140
|
+
q << it->first;
|
141
|
+
}
|
142
|
+
q << ")VALUES(";
|
143
|
+
for (map<string, string>::const_iterator it = field2Val.begin();
|
144
|
+
it != field2Val.end(); ++it)
|
145
|
+
{
|
146
|
+
if (it != field2Val.begin())
|
147
|
+
q << ",";
|
148
|
+
q << quote << it->second;
|
149
|
+
}
|
150
|
+
q << ")";
|
151
|
+
return executeQuery(q);
|
152
|
+
}
|
153
|
+
|
154
|
+
bool
|
155
|
+
DBFace::update(const string& table,
|
156
|
+
const map<string, string>& field2Val,
|
157
|
+
const string& where)
|
158
|
+
{
|
159
|
+
Query q = _connection.query();
|
160
|
+
|
161
|
+
q << "UPDATE " << table << " SET ";
|
162
|
+
for (map<string, string>::const_iterator it = field2Val.begin();
|
163
|
+
it != field2Val.end(); ++it)
|
164
|
+
{
|
165
|
+
if (it != field2Val.begin())
|
166
|
+
q << ",";
|
167
|
+
q << it->first << "=" << quote << it->second;
|
168
|
+
}
|
169
|
+
if (where.size())
|
170
|
+
q << " WHERE " << where;
|
171
|
+
// cout << q << endl;
|
172
|
+
return executeQuery(q);
|
173
|
+
}
|
174
|
+
|
175
|
+
string
|
176
|
+
DBFace::now()
|
177
|
+
{
|
178
|
+
Query q = _connection.query();
|
179
|
+
|
180
|
+
q << "SELECT NOW()";
|
181
|
+
StoreQueryResult mysqlRes;
|
182
|
+
try{
|
183
|
+
mysqlRes = q.store();
|
184
|
+
}
|
185
|
+
catch (const mysqlpp::Exception& er) {
|
186
|
+
cerr << "Query failed: " << q << endl << er.what();
|
187
|
+
return string();
|
188
|
+
}
|
189
|
+
return toString(mysqlRes[0]["now()"]);
|
190
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#ifndef DBFACE_H
|
2
|
+
#define DBFACE_H
|
3
|
+
|
4
|
+
#include <map>
|
5
|
+
#include <mysql++.h>
|
6
|
+
#include <boost/thread/mutex.hpp>
|
7
|
+
#include "pporm.h"
|
8
|
+
|
9
|
+
|
10
|
+
class DBFace{
|
11
|
+
public:
|
12
|
+
static DBFace* instance() { return _this; }
|
13
|
+
|
14
|
+
DBFace(const std::string& database, const std::string& host,
|
15
|
+
const std::string& user, const std::string& password);
|
16
|
+
|
17
|
+
bool insert(const std::string& table,
|
18
|
+
const std::map<std::string, std::string>& field2Val);
|
19
|
+
bool update(const std::string& table,
|
20
|
+
const std::map<std::string, std::string>& field2Val,
|
21
|
+
const std::string& where);
|
22
|
+
bool select(const std::string& table,
|
23
|
+
const std::vector<std::string>& columns,
|
24
|
+
const std::string& where,
|
25
|
+
const std::string& additional,
|
26
|
+
QueryRes& rRes);
|
27
|
+
bool selectTables(QueryRes& rRes);
|
28
|
+
bool selectColumns(const std::string& table, QueryRes& rRes);
|
29
|
+
void getTables(std::vector<Table>& rTables);
|
30
|
+
const std::map<std::string, std::string>& dbtype2BaseType() const
|
31
|
+
{ return _dbtype2BaseType; }
|
32
|
+
|
33
|
+
std::string now();
|
34
|
+
|
35
|
+
private:
|
36
|
+
bool executeQuery(mysqlpp::Query& rQuery);
|
37
|
+
|
38
|
+
private:
|
39
|
+
mysqlpp::Connection _connection;
|
40
|
+
const std::string _database;
|
41
|
+
std::map<std::string, std::string> _dbtype2BaseType;
|
42
|
+
mutable boost::mutex _mutex;
|
43
|
+
static DBFace* _this;
|
44
|
+
};
|
45
|
+
|
46
|
+
|
47
|
+
#endif //DB_H
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#ifndef PPORM_FIELDS_H
|
2
|
+
#define PPORM_FIELDS_H
|
3
|
+
|
4
|
+
#include <string>
|
5
|
+
|
6
|
+
#include <sstream>
|
7
|
+
|
8
|
+
#include "utils.hpp"
|
9
|
+
|
10
|
+
namespace PPORM {
|
11
|
+
|
12
|
+
template<class T>
|
13
|
+
struct Field{
|
14
|
+
Field<T>() :_dirty(false) {}
|
15
|
+
typedef T Base;
|
16
|
+
bool _dirty;
|
17
|
+
T _base;
|
18
|
+
}; //class Field
|
19
|
+
|
20
|
+
typedef Field<int> F_Integer;
|
21
|
+
typedef Field<double> F_Float;
|
22
|
+
typedef Field<std::string> F_String;
|
23
|
+
typedef Field<bool> F_TrueString;
|
24
|
+
|
25
|
+
} //namespace PPORM
|
26
|
+
|
27
|
+
#endif //PPORM_FIELDS_H
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#ifndef PPORM_FIELDS_H
|
2
|
+
#define PPORM_FIELDS_H
|
3
|
+
|
4
|
+
#include <string>
|
5
|
+
|
6
|
+
#include <sstream>
|
7
|
+
|
8
|
+
#include "utils.hpp"
|
9
|
+
|
10
|
+
namespace PPORM {
|
11
|
+
|
12
|
+
template<class T>
|
13
|
+
struct Field{
|
14
|
+
Field<T>() :_dirty(false) {}
|
15
|
+
typedef T Base;
|
16
|
+
bool _dirty;
|
17
|
+
T _base;
|
18
|
+
}; //class Field
|
19
|
+
|
20
|
+
typedef Field<int> F_bigint;
|
21
|
+
typedef Field<std::string> F_date;
|
22
|
+
typedef Field<std::string> F_datetime;
|
23
|
+
typedef Field<double> F_float;
|
24
|
+
typedef Field<int> F_int;
|
25
|
+
typedef Field<std::string> F_text;
|
26
|
+
typedef Field<int> F_tinyint;
|
27
|
+
typedef Field<std::string> F_varchar;
|
28
|
+
|
29
|
+
} //namespace PPORM
|
30
|
+
|
31
|
+
#endif //PPORM_FIELDS_H
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#ifndef _ID_HPP
|
2
|
+
#define _ID_HPP
|
3
|
+
|
4
|
+
#include <iosfwd>
|
5
|
+
#include <string>
|
6
|
+
#include <sstream>
|
7
|
+
|
8
|
+
namespace PPORM{
|
9
|
+
template<class T>
|
10
|
+
class Id {
|
11
|
+
|
12
|
+
public:
|
13
|
+
explicit Id(size_t id) : _id(id) {}
|
14
|
+
Id() {}
|
15
|
+
|
16
|
+
inline Id operator++() {
|
17
|
+
++_id; return *this;
|
18
|
+
}
|
19
|
+
|
20
|
+
inline Id operator++(int) {
|
21
|
+
Id val=*this;
|
22
|
+
++*this;
|
23
|
+
return val;
|
24
|
+
}
|
25
|
+
|
26
|
+
inline bool operator==(const Id& that) const {
|
27
|
+
return _id == that._id;
|
28
|
+
}
|
29
|
+
inline bool operator< (const Id& that) const {
|
30
|
+
return _id < that._id;
|
31
|
+
}
|
32
|
+
inline bool operator<=(const Id& that) const {
|
33
|
+
return _id <= that._id;
|
34
|
+
}
|
35
|
+
inline bool operator> (const Id& that) const {
|
36
|
+
return _id > that._id;
|
37
|
+
}
|
38
|
+
inline bool operator!=(const Id& that) const {
|
39
|
+
return ! (*this == that);
|
40
|
+
}
|
41
|
+
|
42
|
+
std::string to_s() const {
|
43
|
+
std::ostringstream oss;
|
44
|
+
oss << _id;
|
45
|
+
return oss.str();
|
46
|
+
}
|
47
|
+
|
48
|
+
|
49
|
+
inline size_t& serialization() { return _id; }
|
50
|
+
|
51
|
+
private:
|
52
|
+
size_t _id;
|
53
|
+
|
54
|
+
};
|
55
|
+
|
56
|
+
|
57
|
+
}; //namespace PPORM
|
58
|
+
|
59
|
+
template<class T>
|
60
|
+
std::ostream&
|
61
|
+
operator<< (std::ostream& os, const PPORM::Id<T>& id)
|
62
|
+
{
|
63
|
+
os << id.to_s();
|
64
|
+
return os;
|
65
|
+
}
|
66
|
+
|
67
|
+
template<class T>
|
68
|
+
std::istream&
|
69
|
+
operator>> (std::istream& is, PPORM::Id<T>& id)
|
70
|
+
{
|
71
|
+
is >> id.serialization();
|
72
|
+
return is;
|
73
|
+
}
|
74
|
+
|
75
|
+
#endif //_ID_HPP
|
@@ -0,0 +1,208 @@
|
|
1
|
+
#ifndef PPORM_IDENTIFIERS_HPP
|
2
|
+
#define PPORM_IDENTIFIERS_HPP
|
3
|
+
|
4
|
+
#include "id.hpp"
|
5
|
+
|
6
|
+
namespace PPORM {
|
7
|
+
|
8
|
+
class DummyO_AccountIssues;
|
9
|
+
typedef Id<DummyO_AccountIssues> I_AccountIssues;
|
10
|
+
|
11
|
+
class DummyO_AccountResearchKeywords;
|
12
|
+
typedef Id<DummyO_AccountResearchKeywords> I_AccountResearchKeywords;
|
13
|
+
|
14
|
+
class DummyO_Accounts;
|
15
|
+
typedef Id<DummyO_Accounts> I_Accounts;
|
16
|
+
|
17
|
+
class DummyO_AdminProps;
|
18
|
+
typedef Id<DummyO_AdminProps> I_AdminProps;
|
19
|
+
|
20
|
+
class DummyO_Assignments;
|
21
|
+
typedef Id<DummyO_Assignments> I_Assignments;
|
22
|
+
|
23
|
+
class DummyO_Backlinks;
|
24
|
+
typedef Id<DummyO_Backlinks> I_Backlinks;
|
25
|
+
|
26
|
+
class DummyO_Broadcasts;
|
27
|
+
typedef Id<DummyO_Broadcasts> I_Broadcasts;
|
28
|
+
|
29
|
+
class DummyO_Canonicals;
|
30
|
+
typedef Id<DummyO_Canonicals> I_Canonicals;
|
31
|
+
|
32
|
+
class DummyO_ClankPages;
|
33
|
+
typedef Id<DummyO_ClankPages> I_ClankPages;
|
34
|
+
|
35
|
+
class DummyO_ClankPlacements;
|
36
|
+
typedef Id<DummyO_ClankPlacements> I_ClankPlacements;
|
37
|
+
|
38
|
+
class DummyO_ClankSourceKeywords;
|
39
|
+
typedef Id<DummyO_ClankSourceKeywords> I_ClankSourceKeywords;
|
40
|
+
|
41
|
+
class DummyO_ClankSources;
|
42
|
+
typedef Id<DummyO_ClankSources> I_ClankSources;
|
43
|
+
|
44
|
+
class DummyO_Competitions;
|
45
|
+
typedef Id<DummyO_Competitions> I_Competitions;
|
46
|
+
|
47
|
+
class DummyO_Contacts;
|
48
|
+
typedef Id<DummyO_Contacts> I_Contacts;
|
49
|
+
|
50
|
+
class DummyO_Diagnostics;
|
51
|
+
typedef Id<DummyO_Diagnostics> I_Diagnostics;
|
52
|
+
|
53
|
+
class DummyO_Differentials;
|
54
|
+
typedef Id<DummyO_Differentials> I_Differentials;
|
55
|
+
|
56
|
+
class DummyO_DriveBackLogs;
|
57
|
+
typedef Id<DummyO_DriveBackLogs> I_DriveBackLogs;
|
58
|
+
|
59
|
+
class DummyO_DriveTasks;
|
60
|
+
typedef Id<DummyO_DriveTasks> I_DriveTasks;
|
61
|
+
|
62
|
+
class DummyO_Emphases;
|
63
|
+
typedef Id<DummyO_Emphases> I_Emphases;
|
64
|
+
|
65
|
+
class DummyO_ErrorReports;
|
66
|
+
typedef Id<DummyO_ErrorReports> I_ErrorReports;
|
67
|
+
|
68
|
+
class DummyO_GoogleSuggestions;
|
69
|
+
typedef Id<DummyO_GoogleSuggestions> I_GoogleSuggestions;
|
70
|
+
|
71
|
+
class DummyO_HashCount;
|
72
|
+
typedef Id<DummyO_HashCount> I_HashCount;
|
73
|
+
|
74
|
+
class DummyO_HistoricalRankingPowers;
|
75
|
+
typedef Id<DummyO_HistoricalRankingPowers> I_HistoricalRankingPowers;
|
76
|
+
|
77
|
+
class DummyO_HistoricalScores;
|
78
|
+
typedef Id<DummyO_HistoricalScores> I_HistoricalScores;
|
79
|
+
|
80
|
+
class DummyO_HttpErrors;
|
81
|
+
typedef Id<DummyO_HttpErrors> I_HttpErrors;
|
82
|
+
|
83
|
+
class DummyO_Images;
|
84
|
+
typedef Id<DummyO_Images> I_Images;
|
85
|
+
|
86
|
+
class DummyO_IssuePageClasses;
|
87
|
+
typedef Id<DummyO_IssuePageClasses> I_IssuePageClasses;
|
88
|
+
|
89
|
+
class DummyO_IssuePages;
|
90
|
+
typedef Id<DummyO_IssuePages> I_IssuePages;
|
91
|
+
|
92
|
+
class DummyO_Issues;
|
93
|
+
typedef Id<DummyO_Issues> I_Issues;
|
94
|
+
|
95
|
+
class DummyO_KeywordExclusions;
|
96
|
+
typedef Id<DummyO_KeywordExclusions> I_KeywordExclusions;
|
97
|
+
|
98
|
+
class DummyO_Keywords;
|
99
|
+
typedef Id<DummyO_Keywords> I_Keywords;
|
100
|
+
|
101
|
+
class DummyO_Links;
|
102
|
+
typedef Id<DummyO_Links> I_Links;
|
103
|
+
|
104
|
+
class DummyO_LoggedActions;
|
105
|
+
typedef Id<DummyO_LoggedActions> I_LoggedActions;
|
106
|
+
|
107
|
+
class DummyO_MirrorLogs;
|
108
|
+
typedef Id<DummyO_MirrorLogs> I_MirrorLogs;
|
109
|
+
|
110
|
+
class DummyO_NonHtmls;
|
111
|
+
typedef Id<DummyO_NonHtmls> I_NonHtmls;
|
112
|
+
|
113
|
+
class DummyO_Notifications;
|
114
|
+
typedef Id<DummyO_Notifications> I_Notifications;
|
115
|
+
|
116
|
+
class DummyO_PageClasses;
|
117
|
+
typedef Id<DummyO_PageClasses> I_PageClasses;
|
118
|
+
|
119
|
+
class DummyO_PageHeaders;
|
120
|
+
typedef Id<DummyO_PageHeaders> I_PageHeaders;
|
121
|
+
|
122
|
+
class DummyO_PageSearchKeywords;
|
123
|
+
typedef Id<DummyO_PageSearchKeywords> I_PageSearchKeywords;
|
124
|
+
|
125
|
+
class DummyO_PageTrackedKeywords;
|
126
|
+
typedef Id<DummyO_PageTrackedKeywords> I_PageTrackedKeywords;
|
127
|
+
|
128
|
+
class DummyO_Pages;
|
129
|
+
typedef Id<DummyO_Pages> I_Pages;
|
130
|
+
|
131
|
+
class DummyO_PlacementContacts;
|
132
|
+
typedef Id<DummyO_PlacementContacts> I_PlacementContacts;
|
133
|
+
|
134
|
+
class DummyO_Rankings;
|
135
|
+
typedef Id<DummyO_Rankings> I_Rankings;
|
136
|
+
|
137
|
+
class DummyO_Redirects;
|
138
|
+
typedef Id<DummyO_Redirects> I_Redirects;
|
139
|
+
|
140
|
+
class DummyO_SavedSearches;
|
141
|
+
typedef Id<DummyO_SavedSearches> I_SavedSearches;
|
142
|
+
|
143
|
+
class DummyO_SearchCompetitionKeywords;
|
144
|
+
typedef Id<DummyO_SearchCompetitionKeywords> I_SearchCompetitionKeywords;
|
145
|
+
|
146
|
+
class DummyO_SearchCompetitions;
|
147
|
+
typedef Id<DummyO_SearchCompetitions> I_SearchCompetitions;
|
148
|
+
|
149
|
+
class DummyO_SearchEngineSearchKeywords;
|
150
|
+
typedef Id<DummyO_SearchEngineSearchKeywords> I_SearchEngineSearchKeywords;
|
151
|
+
|
152
|
+
class DummyO_SearchEngines;
|
153
|
+
typedef Id<DummyO_SearchEngines> I_SearchEngines;
|
154
|
+
|
155
|
+
class DummyO_SearchKeywords;
|
156
|
+
typedef Id<DummyO_SearchKeywords> I_SearchKeywords;
|
157
|
+
|
158
|
+
class DummyO_Searches;
|
159
|
+
typedef Id<DummyO_Searches> I_Searches;
|
160
|
+
|
161
|
+
class DummyO_Sessions;
|
162
|
+
typedef Id<DummyO_Sessions> I_Sessions;
|
163
|
+
|
164
|
+
class DummyO_Settings;
|
165
|
+
typedef Id<DummyO_Settings> I_Settings;
|
166
|
+
|
167
|
+
class DummyO_StatusUpdateTypes;
|
168
|
+
typedef Id<DummyO_StatusUpdateTypes> I_StatusUpdateTypes;
|
169
|
+
|
170
|
+
class DummyO_StatusUpdates;
|
171
|
+
typedef Id<DummyO_StatusUpdates> I_StatusUpdates;
|
172
|
+
|
173
|
+
class DummyO_TableSettings;
|
174
|
+
typedef Id<DummyO_TableSettings> I_TableSettings;
|
175
|
+
|
176
|
+
class DummyO_Taggings;
|
177
|
+
typedef Id<DummyO_Taggings> I_Taggings;
|
178
|
+
|
179
|
+
class DummyO_Tags;
|
180
|
+
typedef Id<DummyO_Tags> I_Tags;
|
181
|
+
|
182
|
+
class DummyO_ToolsCompetitors;
|
183
|
+
typedef Id<DummyO_ToolsCompetitors> I_ToolsCompetitors;
|
184
|
+
|
185
|
+
class DummyO_ToolsResearchKeywords;
|
186
|
+
typedef Id<DummyO_ToolsResearchKeywords> I_ToolsResearchKeywords;
|
187
|
+
|
188
|
+
class DummyO_ToolsSuggestions;
|
189
|
+
typedef Id<DummyO_ToolsSuggestions> I_ToolsSuggestions;
|
190
|
+
|
191
|
+
class DummyO_Tooltips;
|
192
|
+
typedef Id<DummyO_Tooltips> I_Tooltips;
|
193
|
+
|
194
|
+
class DummyO_TrackedBacklinks;
|
195
|
+
typedef Id<DummyO_TrackedBacklinks> I_TrackedBacklinks;
|
196
|
+
|
197
|
+
class DummyO_TrackedKeywords;
|
198
|
+
typedef Id<DummyO_TrackedKeywords> I_TrackedKeywords;
|
199
|
+
|
200
|
+
class DummyO_Users;
|
201
|
+
typedef Id<DummyO_Users> I_Users;
|
202
|
+
|
203
|
+
class DummyO_Wikilinks;
|
204
|
+
typedef Id<DummyO_Wikilinks> I_Wikilinks;
|
205
|
+
|
206
|
+
|
207
|
+
} //namespace PPORM
|
208
|
+
#endif //PPORM_IDENTIFIERS_HPP
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#ifndef UTILS_HPP
|
2
|
+
#define UTILS_HPP
|
3
|
+
|
4
|
+
#include <vector>
|
5
|
+
#include <map>
|
6
|
+
#include <sstream>
|
7
|
+
|
8
|
+
template<class T>
|
9
|
+
std::string
|
10
|
+
toString(const T& t)
|
11
|
+
{
|
12
|
+
std::ostringstream oss;
|
13
|
+
oss << t;
|
14
|
+
|
15
|
+
return oss.str();
|
16
|
+
}
|
17
|
+
|
18
|
+
template<class T>
|
19
|
+
T
|
20
|
+
fromString(const std::string& s)
|
21
|
+
{
|
22
|
+
std::istringstream iss;
|
23
|
+
iss.str(s);
|
24
|
+
|
25
|
+
T ret;
|
26
|
+
iss >> ret;
|
27
|
+
|
28
|
+
return ret;
|
29
|
+
}
|
30
|
+
|
31
|
+
template<>
|
32
|
+
std::string
|
33
|
+
fromString<std::string>(const std::string& s)
|
34
|
+
{
|
35
|
+
return s;
|
36
|
+
}
|
37
|
+
|
38
|
+
|
39
|
+
#endif //UTILS_HPP
|
@@ -18,7 +18,7 @@
|
|
18
18
|
<%# end %>
|
19
19
|
|
20
20
|
<% model.enums.each do |name, property| %>
|
21
|
-
enum Enum<%= class_name %><%= name %> { <%= property.
|
21
|
+
enum Enum<%= class_name %><%= name %> { <%= property.flag_map.map{|v, k| class_name.upcase + "_" + property.name.to_s.upcase + "_" + k.to_s.sub(".","_").upcase + " = " + v.to_s}.join(", ") %> };
|
22
22
|
<% end %>
|
23
23
|
|
24
24
|
namespace DMMM {
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-metamapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
8
|
+
- 1
|
7
9
|
- 0
|
8
|
-
|
9
|
-
version: 0.0.11
|
10
|
+
version: 0.1.0
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Jonah Honeyman
|
@@ -15,7 +16,7 @@ autorequire:
|
|
15
16
|
bindir: bin
|
16
17
|
cert_chain: []
|
17
18
|
|
18
|
-
date: 2010-
|
19
|
+
date: 2010-12-19 00:00:00 +02:00
|
19
20
|
default_executable:
|
20
21
|
dependencies: []
|
21
22
|
|
@@ -28,38 +29,35 @@ extensions: []
|
|
28
29
|
extra_rdoc_files:
|
29
30
|
- README.md
|
30
31
|
files:
|
31
|
-
- .autospec
|
32
|
-
- .gitignore
|
33
|
-
- Gemfile
|
34
|
-
- README.md
|
35
|
-
- Rakefile
|
36
|
-
- VERSION
|
37
|
-
- example/.gitignore
|
38
|
-
- example/Makefile
|
39
|
-
- example/example.cpp
|
40
|
-
- example/example.rb
|
41
|
-
- lib/dm-metamapper.rb
|
42
|
-
- lib/dm-metamapper/config.rb
|
43
32
|
- lib/dm-metamapper/generator.rb
|
44
|
-
- lib/dm-metamapper/generators/cpp.rb
|
45
|
-
- lib/dm-metamapper/metamapper.rb
|
46
33
|
- lib/dm-metamapper/model.rb
|
34
|
+
- lib/dm-metamapper/config.rb
|
35
|
+
- lib/dm-metamapper/generators/cpp.rb
|
47
36
|
- lib/dm-metamapper/property.rb
|
37
|
+
- lib/dm-metamapper/version.rb
|
38
|
+
- lib/dm-metamapper/metamapper.rb
|
48
39
|
- lib/dm-metamapper/template.rb
|
49
|
-
- lib/
|
50
|
-
- lib/templates/cpp/
|
40
|
+
- lib/dm-metamapper.rb
|
41
|
+
- lib/templates/cpp/dmmm_fields.hpp~
|
51
42
|
- lib/templates/cpp/dmmm_dbface.cpp.erb
|
52
|
-
- lib/templates/cpp/
|
43
|
+
- lib/templates/cpp/dmmm_utils.hpp~
|
44
|
+
- lib/templates/cpp/dmmm_id.h~
|
45
|
+
- lib/templates/cpp/dmmm_identifiers.hpp.erb
|
46
|
+
- lib/templates/cpp/dmmm_utils.cpp.erb~
|
47
|
+
- lib/templates/cpp/dmmm_dbface.h~
|
48
|
+
- lib/templates/cpp/dmmm_fields.hpp.erb~
|
49
|
+
- lib/templates/cpp/dmmm_comparators.hpp~
|
50
|
+
- lib/templates/cpp/dmmm_comparators.hpp.erb
|
53
51
|
- lib/templates/cpp/dmmm_fields.hpp.erb
|
52
|
+
- lib/templates/cpp/dmmm_dbface.h.erb
|
53
|
+
- lib/templates/cpp/instance.hpp.erb
|
54
54
|
- lib/templates/cpp/dmmm_id.hpp.erb
|
55
|
-
- lib/templates/cpp/dmmm_identifiers.hpp.erb
|
56
55
|
- lib/templates/cpp/dmmm_utils.cpp.erb
|
56
|
+
- lib/templates/cpp/dmmm_dbface.cpp~
|
57
57
|
- lib/templates/cpp/dmmm_utils.hpp.erb
|
58
|
-
- lib/templates/cpp/
|
59
|
-
-
|
60
|
-
-
|
61
|
-
- spec/spec.opts
|
62
|
-
- spec/spec_helper.rb
|
58
|
+
- lib/templates/cpp/class.hpp.erb
|
59
|
+
- lib/templates/cpp/dmmm_identifiers.hpp~
|
60
|
+
- README.md
|
63
61
|
has_rdoc: true
|
64
62
|
homepage: http://github.com/jonuts/dm-metamapper
|
65
63
|
licenses: []
|
@@ -70,27 +68,31 @@ rdoc_options:
|
|
70
68
|
require_paths:
|
71
69
|
- lib
|
72
70
|
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
73
72
|
requirements:
|
74
73
|
- - ">="
|
75
74
|
- !ruby/object:Gem::Version
|
75
|
+
hash: 3
|
76
76
|
segments:
|
77
77
|
- 0
|
78
78
|
version: "0"
|
79
79
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
80
81
|
requirements:
|
81
82
|
- - ">="
|
82
83
|
- !ruby/object:Gem::Version
|
84
|
+
hash: 23
|
83
85
|
segments:
|
84
|
-
-
|
85
|
-
|
86
|
+
- 1
|
87
|
+
- 3
|
88
|
+
- 6
|
89
|
+
version: 1.3.6
|
86
90
|
requirements: []
|
87
91
|
|
88
|
-
rubyforge_project:
|
89
|
-
rubygems_version: 1.3.
|
92
|
+
rubyforge_project: dm-metamapper
|
93
|
+
rubygems_version: 1.3.7
|
90
94
|
signing_key:
|
91
95
|
specification_version: 3
|
92
96
|
summary: Code generating C++ ORM
|
93
|
-
test_files:
|
94
|
-
|
95
|
-
- spec/dm-metamapper/generator_spec.rb
|
96
|
-
- spec/dm-metamapper/template_spec.rb
|
97
|
+
test_files: []
|
98
|
+
|
data/.autospec
DELETED
data/.gitignore
DELETED
data/Gemfile
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
source :rubygems
|
2
|
-
|
3
|
-
dm_gems_version = "~> 0.10"
|
4
|
-
do_gems_version = "~> 0.10"
|
5
|
-
|
6
|
-
gem "dm-core", dm_gems_version
|
7
|
-
gem "dm-types", dm_gems_version
|
8
|
-
|
9
|
-
|
10
|
-
group :test do
|
11
|
-
gem "rspec"
|
12
|
-
gem "data_objects"
|
13
|
-
gem "do_sqlite3", do_gems_version
|
14
|
-
gem "do_mysql", do_gems_version
|
15
|
-
gem "ZenTest"
|
16
|
-
end
|
17
|
-
|
18
|
-
group :deploy do
|
19
|
-
gem "jeweler"
|
20
|
-
end
|
21
|
-
|
22
|
-
# vim: set ft=ruby:
|
data/Rakefile
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
begin
|
2
|
-
require 'bundler'
|
3
|
-
Bundler.setup :deploy
|
4
|
-
require 'jeweler'
|
5
|
-
Jeweler::Tasks.new do |gemspec|
|
6
|
-
gemspec.name = "dm-metamapper"
|
7
|
-
gemspec.summary = "Code generating C++ ORM"
|
8
|
-
gemspec.description = "C++ API for databases created with DM. Hard typing, compile time checked queries."
|
9
|
-
gemspec.email = "jonah@honeyman.org"
|
10
|
-
gemspec.homepage = "http://github.com/jonuts/dm-metamapper"
|
11
|
-
gemspec.authors = ["Jonah Honeyman", "Omer Tamuz"]
|
12
|
-
end
|
13
|
-
rescue LoadError
|
14
|
-
puts "Jeweler not available. Install it with: gem install jeweler"
|
15
|
-
end
|
16
|
-
|
17
|
-
desc "local gem build and install"
|
18
|
-
task :local do
|
19
|
-
sh "rvm ree@drive"
|
20
|
-
sh "gem uninstall -a dm-metamapper"
|
21
|
-
sh "gem build dm-metamapper.gemspec"
|
22
|
-
version = File.read("VERSION").chomp
|
23
|
-
sh "gem install -l ./dm-metamapper-#{version}.gem"
|
24
|
-
end
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.0.11
|
data/example/.gitignore
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
example
|
data/example/Makefile
DELETED
@@ -1,4 +0,0 @@
|
|
1
|
-
all:
|
2
|
-
echo "generating code"
|
3
|
-
cd ..; bundle exec ruby -r example/example.rb -e "DataMapper::MetaMapper.generate(:cpp, :output_dir => './output')"
|
4
|
-
g++ ../output/dmmm_utils.cpp ../output/dmmm_dbface.cpp example.cpp -I ../output -I /usr/include/mysql -I /usr/local/include/mysql++ -I /usr/local/mysql/include/mysql -lmysqlpp -lmysqlclient /usr/lib/libboost_thread-mt.so -L/usr/lib -L/usr/local/lib -Wall -o example
|
data/example/example.cpp
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
#include <vector>
|
2
|
-
#include "dmmm_dbface.h"
|
3
|
-
#include "T_User.hpp"
|
4
|
-
#include "T_Dog.hpp"
|
5
|
-
#include "T_LittleFlea.hpp"
|
6
|
-
|
7
|
-
using namespace std;
|
8
|
-
using namespace DMMM;
|
9
|
-
|
10
|
-
int main(int argc, char* argv[])
|
11
|
-
{
|
12
|
-
string host("localhost");
|
13
|
-
string user("root");
|
14
|
-
string database("dmmm");
|
15
|
-
string password("");
|
16
|
-
DBFace dbFace(database, host, user, password, &cout);
|
17
|
-
|
18
|
-
T_Dog d;
|
19
|
-
T_User u;
|
20
|
-
d.erase();
|
21
|
-
u.erase();
|
22
|
-
|
23
|
-
O_User u1;
|
24
|
-
u1._name() = "omer";
|
25
|
-
u1._balance() = 5.3;
|
26
|
-
u1._weight() = 10;
|
27
|
-
u1.insert();
|
28
|
-
|
29
|
-
O_Dog d1;
|
30
|
-
d1._user_id() = u1._id();
|
31
|
-
d1._name() = "spot";
|
32
|
-
d1._stinks() = true;
|
33
|
-
d1._color() = DOG_COLOR_WHITE;
|
34
|
-
d1.insert();
|
35
|
-
|
36
|
-
d1 = d.select(d1._id()).first;
|
37
|
-
|
38
|
-
O_Dog d2(u1);
|
39
|
-
d2._name() = "rover";
|
40
|
-
d2._stinks() = false;
|
41
|
-
d2.insert();
|
42
|
-
|
43
|
-
O_User u2;
|
44
|
-
u2._name() = "jonah";
|
45
|
-
u2.insert();
|
46
|
-
|
47
|
-
O_Dog d3(u2._id());
|
48
|
-
d3._name() = "rover";
|
49
|
-
d3._stinks() = false;
|
50
|
-
d3.insert();
|
51
|
-
|
52
|
-
O_LittleFlea f1(d3);
|
53
|
-
f1.insert();
|
54
|
-
|
55
|
-
vector<O_Dog> dogs;
|
56
|
-
d.select((d._stinks() == false) && (d._name() %= "\%over"), dogs);
|
57
|
-
for(size_t i = 0; i < dogs.size(); ++i){
|
58
|
-
dogs[i]._name() = string("good_") + dogs[i]._name();
|
59
|
-
dogs[i].update();
|
60
|
-
cout << dogs[i]._name()
|
61
|
-
<< " belongs to " << dogs[i].user().first._name()
|
62
|
-
<< endl;
|
63
|
-
}
|
64
|
-
|
65
|
-
|
66
|
-
T_Dog dconst(T_User(u._name() == "omer"));
|
67
|
-
dogs.clear();
|
68
|
-
dconst.select(d._stinks() == true, dogs);
|
69
|
-
cout << dogs.size()
|
70
|
-
<< " dogs meet criterion" << endl;
|
71
|
-
cout << dconst.count(d._stinks() == true)
|
72
|
-
<< " dogs meet criterion" << endl;
|
73
|
-
dconst.erase();
|
74
|
-
|
75
|
-
d.erase(d._user_id() == u2._id());
|
76
|
-
|
77
|
-
return 0;
|
78
|
-
}
|
data/example/example.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
require "erb"
|
2
|
-
require "rubygems"
|
3
|
-
require "bundler"
|
4
|
-
Bundler.setup(:default, :test)
|
5
|
-
require "dm-core"
|
6
|
-
require "dm-types"
|
7
|
-
require File.expand_path("../../lib/dm-metamapper.rb", __FILE__)
|
8
|
-
require "dm-metamapper/generators/cpp"
|
9
|
-
|
10
|
-
#DataMapper.setup(:default, "sqlite3::memory:")
|
11
|
-
DataMapper.setup(:default, "mysql://root@localhost/dmmm")
|
12
|
-
|
13
|
-
COLORS = [
|
14
|
-
:blue,
|
15
|
-
:white,
|
16
|
-
"light.red"
|
17
|
-
]
|
18
|
-
|
19
|
-
class User
|
20
|
-
include DataMapper::Resource
|
21
|
-
|
22
|
-
has n, :dogs
|
23
|
-
|
24
|
-
property :id, Serial
|
25
|
-
property :name, String
|
26
|
-
property :balance, Float
|
27
|
-
property :weight, Integer
|
28
|
-
end
|
29
|
-
|
30
|
-
class Dog
|
31
|
-
include DataMapper::Resource
|
32
|
-
|
33
|
-
belongs_to :user
|
34
|
-
has n, :little_fleas
|
35
|
-
|
36
|
-
property :id, Serial
|
37
|
-
property :user_id, Integer
|
38
|
-
property :name, String
|
39
|
-
property :color, Enum[*COLORS]
|
40
|
-
property :stinks, Boolean
|
41
|
-
end
|
42
|
-
|
43
|
-
class LittleFlea
|
44
|
-
include DataMapper::Resource
|
45
|
-
|
46
|
-
belongs_to :dog
|
47
|
-
|
48
|
-
property :id, Serial
|
49
|
-
property :dog_id, Integer
|
50
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
require File.expand_path("../../spec_helper", __FILE__)
|
2
|
-
|
3
|
-
class MyGenerator < DMMM::Generator;end
|
4
|
-
|
5
|
-
class LolModel
|
6
|
-
include DataMapper::Resource
|
7
|
-
|
8
|
-
property :id, Serial
|
9
|
-
property :name, String
|
10
|
-
end
|
11
|
-
|
12
|
-
describe "Generator" do
|
13
|
-
describe "General" do
|
14
|
-
it "is configurable" do
|
15
|
-
MyGenerator.config.should == DMMM.instance_variable_get(:@_default_opts)
|
16
|
-
end
|
17
|
-
|
18
|
-
it "stores a block to extend models" do
|
19
|
-
blk = proc { @__foo__ = "lol" }
|
20
|
-
MyGenerator.send(:setup_model, &blk)
|
21
|
-
MyGenerator.setup_model_blk.should == blk
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
describe "Templates" do
|
26
|
-
it "has a template store" do
|
27
|
-
DMMM::TemplateCollection.should === MyGenerator.generated_files
|
28
|
-
end
|
29
|
-
|
30
|
-
it "stores template info" do
|
31
|
-
MyGenerator.send(:generates_file, :model, "foo")
|
32
|
-
MyGenerator.generated_files.size.should == 1
|
33
|
-
MyGenerator.generated_files.first.name.should == "foo"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe ".new" do
|
38
|
-
before :each do
|
39
|
-
MyGenerator.instance_variable_set :@generated_files, DMMM::TemplateCollection.new
|
40
|
-
model_files = ["foo", "bar", "baz", "bleh"]
|
41
|
-
|
42
|
-
model_files.each do |f|
|
43
|
-
MyGenerator.send :generates_file, :model, f
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
it "requires model info" do
|
48
|
-
lambda {MyGenerator.new}.should raise_error(ArgumentError)
|
49
|
-
end
|
50
|
-
|
51
|
-
it "has model templates when called with model" do
|
52
|
-
@generator = MyGenerator.new(LolModel)
|
53
|
-
@generator.instance_variable_get(:@templates).should == MyGenerator.generated_files.models
|
54
|
-
end
|
55
|
-
|
56
|
-
it "has global templates when called without model" do
|
57
|
-
@generator = MyGenerator.new nil
|
58
|
-
@generator.instance_variable_get(:@templates).should == MyGenerator.generated_files.global
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
@@ -1,29 +0,0 @@
|
|
1
|
-
require File.expand_path("../../spec_helper", __FILE__)
|
2
|
-
|
3
|
-
class LolGenerator < DMMM::Generator; end
|
4
|
-
|
5
|
-
describe "Template" do
|
6
|
-
describe "invalid" do
|
7
|
-
it "requires a name" do
|
8
|
-
lambda {DMMM::Template.new}.should raise_error(ArgumentError)
|
9
|
-
end
|
10
|
-
|
11
|
-
it "requires a generator" do
|
12
|
-
lambda {DMMM::Template.new(:foo)}.should raise_error(DMMM::NoGeneratorError)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "requires a valid type" do
|
16
|
-
lambda {DMMM::Template.new(:few, generator: LolGenerator)}.
|
17
|
-
should raise_error(DMMM::InvalidTypeError)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe "valid" do
|
22
|
-
before :all do
|
23
|
-
@template = DMMM::Template.new :foo,
|
24
|
-
generator: LolGenerator,
|
25
|
-
type: :global
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
data/spec/spec.opts
DELETED