dmapper 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +16 -0
- data/README.rdoc +64 -45
- data/bin/dmap +95 -73
- data/lib/dmap.rb +13 -4
- data/lib/dmap/associations/belongs_to.rb +29 -0
- data/lib/dmap/associations/core.rb +30 -0
- data/lib/dmap/associations/hasn.rb +79 -0
- data/lib/dmap/core.rb +83 -8
- data/lib/dmap/new.rb +50 -9
- data/lib/dmap/properties/core.rb +3 -6
- data/lib/dmap/validations/absence.rb +9 -0
- data/lib/dmap/validations/access.rb +58 -0
- data/lib/dmap/validations/confirmation.rb +8 -0
- data/lib/dmap/validations/core.rb +6 -42
- data/lib/dmap/validations/format.rb +5 -0
- data/lib/dmap/validations/length.rb +32 -1
- data/lib/dmap/validations/misc.rb +76 -0
- data/lib/dmap/validations/presence.rb +4 -0
- data/lib/dmap/validations/primitive.rb +4 -0
- data/lib/dmap/validations/uniqueness.rb +19 -0
- data/lib/support/ordered_hash.rb +434 -0
- metadata +27 -55
- data/lib/dmap/properties.rb +0 -36
data/CHANGELOG
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
0.2 July 4th, 2011
|
2
|
+
|
3
|
+
* Properties now maintain correct order
|
4
|
+
* Added tiny 'helpers' (e.g. Time.now becomes proc => { Time.now })
|
5
|
+
* Switched the order of operations (from type:field:options to field:type:options)
|
6
|
+
* Lazy accepts true/false/fields
|
7
|
+
* Added a verbose option -v
|
8
|
+
* Added a testing option -t
|
9
|
+
* Added a backup option -b
|
10
|
+
* Added a silent/suppress option -s
|
11
|
+
* Much better validation handlers (still needs quite a bit of work)
|
12
|
+
* Added association support!
|
13
|
+
|
14
|
+
0.1 - July 3rd, 2011
|
15
|
+
|
16
|
+
* Initial Release
|
data/README.rdoc
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
= DMap
|
2
2
|
|
3
|
-
DMap is a generator for creating models with {DataMapper}[http://datamapper.org]. It's currently under a lot of development but I, as well as others, use it
|
3
|
+
DMap is a generator for creating models with {DataMapper}[http://datamapper.org]. It's currently under a lot of development but I, as well as others, use it for production use. DataMapper gems are not even required for this gem/tool.
|
4
|
+
|
5
|
+
"DMap a shorter way for saying, and using, DataMapper"
|
4
6
|
|
5
7
|
== Installation
|
6
8
|
gem install dmapper
|
@@ -9,53 +11,60 @@ DMap is a generator for creating models with {DataMapper}[http://datamapper.org]
|
|
9
11
|
|
10
12
|
As of right now the only command available is <tt>new</tt>. Here's a basic example of DMap to explain the structure...
|
11
13
|
|
12
|
-
dmap new user id
|
14
|
+
dmap new user id name:string email:str:required,unique str:password:required
|
13
15
|
|
14
16
|
The first, after <tt>dmap new</tt>, is the [table]. You can create multiple tables at a time by adding a comma (,). Every argument (<tt>space</tt>) is a separate [field]. Fields are divided into three sections by a colon (<tt>:</tt>). The first part is the field's [type]. The second part is the field's name, and the last part marks additional options for that field (explained later).
|
15
17
|
|
18
|
+
== Options
|
19
|
+
|
20
|
+
<b><tt>-b, --backup</tt></b>:: Backs up the current model files (renames them to *.rb.bk)
|
21
|
+
<b><tt>-h, --help</tt></b>:: Displays help message
|
22
|
+
<b><tt>-s, --silent</tt></b>:: If you entered incorrect values for a validation just suppress it and continue on.
|
23
|
+
<b><tt>-t, --test</tt></b>:: Displays what DMap would have made into a file onto the screen.
|
24
|
+
<b><tt>-v, --verbose</tt></b>:: Will print out the model(s) after changes have been made
|
25
|
+
|
16
26
|
== Examples
|
17
27
|
|
18
28
|
Using DMap is incredibly easy once you learn the basic structure of it all. Here's a quick example...
|
19
29
|
|
20
|
-
dmap new user id str:
|
30
|
+
dmap new user id username:str email:str signature:text
|
21
31
|
|
22
32
|
Which creates (user.rb file in the folder that you're currently in)...
|
23
33
|
|
24
34
|
class User
|
25
35
|
include DataMapper::Resource
|
26
36
|
|
27
|
-
property :
|
28
|
-
property :username
|
29
|
-
property :
|
30
|
-
property :
|
37
|
+
property :id, Serial
|
38
|
+
property :username, String
|
39
|
+
property :email, String
|
40
|
+
property :signature, Text
|
31
41
|
|
32
42
|
|
33
43
|
end
|
34
44
|
|
35
45
|
Let's get a little more "complex"
|
36
46
|
|
37
|
-
dmap new user id str:
|
47
|
+
dmap new user id username:str email:str:required name:str:required,unique password:str date_crtd:datetime:default=DateTime.now signature:text
|
38
48
|
|
39
49
|
Which produces...
|
40
50
|
|
41
51
|
class User
|
42
52
|
include DataMapper::Resource
|
43
53
|
|
44
|
-
property :name, String, :required => true, :unique => true
|
45
|
-
property :required, String
|
46
|
-
property :signature, Text
|
47
|
-
property :username, String
|
48
54
|
property :id, Serial
|
55
|
+
property :username, String
|
56
|
+
property :email, String, :required => true
|
57
|
+
property :name, String, :required => true, :unique => true
|
49
58
|
property :password, String
|
50
|
-
property :
|
51
|
-
property :
|
59
|
+
property :date_crtd, DateTime, :default => proc => { DateTime.now }
|
60
|
+
property :signature, Text
|
52
61
|
|
53
62
|
|
54
63
|
end
|
55
64
|
|
56
65
|
I know, still not that impressive, let's try something a tad more difficult...
|
57
66
|
|
58
|
-
dmap new user,user_copy id
|
67
|
+
dmap new user,user_copy id first_name,last_name:str name1:datetime:default=true,length=1..5,presence_of=title-publish20..50,length_of=1,absent,confirm=field,format=email_address,primitive,unique,accessor=private Name1:str
|
59
68
|
|
60
69
|
Which creates (along with a copy model "UserCopy" of the same exact thing)
|
61
70
|
|
@@ -63,10 +72,10 @@ Which creates (along with a copy model "UserCopy" of the same exact thing)
|
|
63
72
|
include DataMapper::Resource
|
64
73
|
|
65
74
|
property :id, Serial
|
66
|
-
property :
|
75
|
+
property :first_name, String
|
67
76
|
property :last_name, String
|
77
|
+
property :name1, DateTime, :default => true, :length => 1..5, :unique => true, :accessor => :private
|
68
78
|
property :Name1, String
|
69
|
-
property :first_name, String
|
70
79
|
|
71
80
|
validates_format_of :name1, :as => :email_address
|
72
81
|
validates_confirmation :name1, :confirm => :field
|
@@ -81,21 +90,19 @@ Which creates (along with a copy model "UserCopy" of the same exact thing)
|
|
81
90
|
|
82
91
|
Here is a list of all the types available from DataMapper, which ones we support, and custom aliases.
|
83
92
|
|
84
|
-
<
|
85
|
-
|
86
|
-
<tt>
|
87
|
-
<tt>
|
88
|
-
<tt>
|
89
|
-
<tt>
|
90
|
-
<tt>
|
91
|
-
<tt>
|
92
|
-
<tt>
|
93
|
-
<tt>
|
94
|
-
<tt>
|
95
|
-
<tt>
|
96
|
-
<tt>
|
97
|
-
<tt>Binary</tt>::<tt>Binary</tt>::<tt>Blob, B</tt>
|
98
|
-
</table>
|
93
|
+
<b>DataMapper Property Type</b>:: <b>DMap Command/Aliases</b>
|
94
|
+
<tt>Boolean</tt>:: <tt>boolean</tt>, <tt>bool</tt>
|
95
|
+
<tt>String</tt>:: <tt>string</tt>, <tt>str, s</tt>
|
96
|
+
<tt>Text</tt>:: <tt>text</tt>, <tt>txt</tt>
|
97
|
+
<tt>Float</tt>:: <tt>float</tt>, <tt>f</tt>
|
98
|
+
<tt>Integer</tt>:: <tt>integer</tt>, <tt>int, i</tt>
|
99
|
+
<tt>Decimal</tt>:: <tt>decimal</tt>, <tt>dec</tt>
|
100
|
+
<tt>DateTime</tt>:: <tt>datetime</tt>, <tt>dt</tt>
|
101
|
+
<tt>Date</tt>:: <tt>date</tt>, <tt>d</tt>
|
102
|
+
<tt>Time</tt>:: <tt>time</tt>, <tt>t</tt>
|
103
|
+
<tt>Object</tt>:: <tt>object</tt>, <tt>obj</tt>
|
104
|
+
<tt>Discriminator</tt>:: <tt>discriminator</tt>, <tt>disc</tt>
|
105
|
+
<tt>Binary</tt>:: <tt>binary</tt>, <tt>blob, b</tt>
|
99
106
|
|
100
107
|
More coming soon!
|
101
108
|
|
@@ -103,7 +110,7 @@ More coming soon!
|
|
103
110
|
|
104
111
|
This part belongs in the third section of the command for example:
|
105
112
|
|
106
|
-
dmap new user id
|
113
|
+
dmap new user id name:str:<b>required,accessor=private</b>
|
107
114
|
|
108
115
|
Each validator is separated by a comma (<tt>,</tt>) and can have a value placed within it by an equal sign (<tt>=</tt>). The property name will look like...
|
109
116
|
|
@@ -112,11 +119,11 @@ Each validator is separated by a comma (<tt>,</tt>) and can have a value placed
|
|
112
119
|
|
113
120
|
=== Property Validator List
|
114
121
|
|
115
|
-
|
122
|
+
<b>DataMapper's List</b>:: <b>DMap Command</b>
|
116
123
|
<tt>required</tt>:: <tt>required</tt>
|
117
124
|
<tt>default</tt>:: <tt>default</tt>
|
118
125
|
<tt>key</tt>:: <tt>key</tt>
|
119
|
-
<tt>lazy</tt>:: <tt>lazy</tt>
|
126
|
+
<tt>lazy</tt>:: <tt>lazy</tt>
|
120
127
|
<tt>accessor</tt>:: <tt>accessor</tt>
|
121
128
|
<tt>writer</tt>:: <tt>writer</tt>
|
122
129
|
<tt>reader</tt>:: <tt>reader</tt>
|
@@ -127,27 +134,39 @@ That's all the ones I know for now, let me know if there are more!
|
|
127
134
|
|
128
135
|
A list of all of the validates_*_of commands and which DMap currently supports
|
129
136
|
|
130
|
-
|
131
|
-
|
132
|
-
<
|
133
|
-
<tt>
|
137
|
+
Note: DMap currently does not support :allow_nil parameters. This will change in the future.
|
138
|
+
|
139
|
+
<b>DataMapper's List</b>:: <b>DMap Command</b>
|
140
|
+
<tt>validates_absence_of</tt>:: <tt>absence, absent</tt>
|
141
|
+
<tt>validates_acceptance_of</tt>:: <tt>acceptance, accept</tt>
|
142
|
+
<tt>validates_with_block</tt>:: Unsupported at this time
|
134
143
|
<tt>validates_confirmation_of</tt>:: <tt>confirmation, confirm</tt>
|
135
144
|
<tt>validates_format_of</tt>:: <tt>format</tt>
|
136
145
|
<tt>validates_length_of</tt>:: <tt>length_of</tt>
|
137
146
|
<tt>validates_with_method</tt>:: <tt>withmethod, method</tt>
|
138
|
-
<tt>validates_numericality_of</tt>::
|
147
|
+
<tt>validates_numericality_of</tt>:: Unsupported
|
139
148
|
<tt>validates_primitive_type_of</tt>:: <tt>primitive</tt>
|
140
149
|
<tt>validates_presence_of</tt>:: <tt>presence, present</tt>
|
141
150
|
<tt>validates_uniqueness_of</tt>:: <tt>uniqueness</tt>
|
142
151
|
<tt>validates_within</tt>:: <tt>within</tt>
|
143
152
|
|
153
|
+
== Associations
|
154
|
+
|
155
|
+
<b>DataMapper Command</b>:: <b>DMap Command</b>
|
156
|
+
<tt>has 1</tt>:: <tt>has1, hasone</tt>
|
157
|
+
<tt>has n</tt>:: <tt>hasn</tt>
|
158
|
+
<tt>belongs_to</tt>:: <tt>belongs_to, belongs</tt>
|
159
|
+
<tt>has_and_belongs_to_many</tt>:: <tt>hasmany</tt>
|
160
|
+
|
161
|
+
Note: use hasn when wanting to use :through => :model and hasmany for wanting to :through => Resource
|
162
|
+
|
163
|
+
Also, conditions are <b>not</b> supported through this generator (suggestions on this could be implemented would be helpful).
|
164
|
+
|
144
165
|
== To Do
|
145
166
|
|
146
|
-
* Add a verbose option
|
147
167
|
* Add a way to add/edit/remove columns from pre-existing tables
|
148
|
-
* Backup option before overwriting
|
149
168
|
* All of the misc. property types
|
150
|
-
* Better validation checkers
|
151
|
-
* Associations! (this will be done first)
|
152
169
|
* Template system similar to {Sinatra::Fedora's}[https://github.com/durango/sinatra_fedora] hatrack option
|
153
|
-
* Better documentation!
|
170
|
+
* Better documentation!
|
171
|
+
* Migrations! (This will most likely be started after DM core team has finished the Veritas system).
|
172
|
+
* Conditions with associations?
|
data/bin/dmap
CHANGED
@@ -14,6 +14,28 @@ opt_parser = OptionParser.new do |opt|
|
|
14
14
|
opt.separator " new <model name> [options]: Creates a new model"
|
15
15
|
opt.separator " e.g. dmap new User serial:id str:name:length=1..5,unique str:email text:signature"
|
16
16
|
opt.separator ""
|
17
|
+
|
18
|
+
opt.on('-h', '--help', 'Displays this screen') do
|
19
|
+
puts opt
|
20
|
+
exit 1
|
21
|
+
end
|
22
|
+
|
23
|
+
opt.on('-v', '--verbose', 'Will print out the model(s) after changes have been made') do
|
24
|
+
DMap::Commands.options['verbose'] = true
|
25
|
+
end
|
26
|
+
|
27
|
+
opt.on('-b', '--backup', 'Backs up the old model from "model.rb" into "model.rb.bk"') do
|
28
|
+
DMap::Commands.options['backup'] = true
|
29
|
+
end
|
30
|
+
|
31
|
+
opt.on('-t', '--test', 'Displays what DMap would have made into a file onto the screen.') do
|
32
|
+
DMap::Commands.options['test'] = true
|
33
|
+
DMap::Commands.options['verbose'] = true
|
34
|
+
end
|
35
|
+
|
36
|
+
opt.on('-s', '--silent', 'If you entered incorrect values for a validation just suppress it and continue on.') do
|
37
|
+
DMap::Commands.options['silent'] = true
|
38
|
+
end
|
17
39
|
end
|
18
40
|
|
19
41
|
opt_parser.parse!
|
@@ -23,14 +45,14 @@ if ARGV[0].nil?
|
|
23
45
|
exit 1
|
24
46
|
end
|
25
47
|
|
26
|
-
unless DMap::Commands.exists?
|
48
|
+
unless DMap::Commands.exists? ARGV[0]
|
27
49
|
puts ARGV[0] + " is not a valid command."
|
28
50
|
puts opt_parser
|
29
51
|
exit 1
|
30
52
|
end
|
31
53
|
|
32
54
|
# safe guard table names
|
33
|
-
table_names = ARGV[1].match /^\[*([a-zA-Z0-9,_]+)\]*$/
|
55
|
+
table_names = ARGV[1].to_s.match /^\[*([a-zA-Z0-9,_]+)\]*$/
|
34
56
|
if table_names.nil?
|
35
57
|
puts "Invalid table name, only characters A-Z, 0-9, and _ are allowed."
|
36
58
|
puts opt_parser
|
@@ -45,7 +67,8 @@ table_names[1].split(',').each do |table|
|
|
45
67
|
table.downcase!
|
46
68
|
|
47
69
|
DMap::Tables.add model_name, model_name.underscore
|
48
|
-
if File.file? "./#{table}.rb"
|
70
|
+
File.rename("./#{table}.rb", "./#{table}.rb.bk") if File.file? "./#{table}.rb" and DMap::Commands.options['backup'] == true
|
71
|
+
if File.file? "./#{table}.rb" and DMap::Commands.options['test'] != true
|
49
72
|
puts "A model with the name of #{table} already exists."
|
50
73
|
exit 1
|
51
74
|
end
|
@@ -53,40 +76,42 @@ end
|
|
53
76
|
|
54
77
|
ARGV[2..-1].each do |command|
|
55
78
|
# TODO: Add a shortcut module/class
|
56
|
-
command = "serial
|
79
|
+
command = "id:serial" if command == "id"
|
57
80
|
|
58
81
|
keys = command.split(':')
|
59
|
-
|
60
|
-
|
82
|
+
keys[1] = '' if keys[1].class.name == "NilClass"
|
83
|
+
|
84
|
+
unless DMap::Fields.list.include? keys[1] or DMap::Properties.valid? keys[1].camelcase
|
85
|
+
puts keys[1] + " is not a valid property or field"
|
61
86
|
puts opt_parser
|
62
87
|
exit 1
|
63
88
|
end
|
64
89
|
|
65
90
|
# Check if the "command" is a key first (keys always overrule)
|
66
|
-
if DMap::Fields.list.include?(keys[
|
67
|
-
keys.unshift(DMap::Fields.list[keys[
|
91
|
+
if DMap::Fields.list.include?(keys[1])
|
92
|
+
keys.unshift(DMap::Fields.list[keys[1]])
|
68
93
|
else
|
69
94
|
# Can't create two fields with the same name
|
70
|
-
if DMap::Fields.list.include?(keys[
|
71
|
-
puts keys[
|
95
|
+
if DMap::Fields.list.include?(keys[0])
|
96
|
+
puts keys[0] + " is already a declared field. You cannot declare a field twice."
|
72
97
|
puts opt_parser
|
73
98
|
exit 1
|
74
99
|
end
|
75
100
|
|
76
101
|
# We really only need to do this when we're declaring a field with a type
|
77
102
|
# Gets proper property name (e.g. "Dt" becomes "DateTime")
|
78
|
-
property_class = DMap::Properties.const_get(keys[
|
103
|
+
property_class = DMap::Properties.const_get(keys[1].camelcase)
|
79
104
|
begin
|
80
|
-
keys[
|
105
|
+
keys[1] = property_class.superclass.parent_name
|
81
106
|
rescue
|
82
|
-
keys[
|
107
|
+
keys[1] = keys[1].camelcase
|
83
108
|
end
|
84
109
|
|
85
110
|
# Allow to declare multiple fields at once
|
86
|
-
keys[
|
87
|
-
DMap::Fields.add key, keys[
|
88
|
-
DMap::Tables.list.
|
89
|
-
DMap::Properties.add table, key, keys[
|
111
|
+
keys[0].split(',').each do |key|
|
112
|
+
DMap::Fields.add key, keys[1]
|
113
|
+
DMap::Tables.list.each_value do |table|
|
114
|
+
DMap::Properties.add table, key, keys[1], 'type'
|
90
115
|
end
|
91
116
|
end
|
92
117
|
end
|
@@ -96,52 +121,64 @@ ARGV[2..-1].each do |command|
|
|
96
121
|
keys[2].split(',').each do |cmds|
|
97
122
|
validation = cmds.split('=')
|
98
123
|
|
99
|
-
#
|
124
|
+
# Does the validation exist?
|
125
|
+
# Check if the validation belongs to the property or within it's own command
|
100
126
|
begin
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
rescue
|
107
|
-
original_name = validation[0].camelcase
|
108
|
-
end
|
109
|
-
original_name = original_name.underscore.downcase
|
110
|
-
|
111
|
-
# Compile all of the otptions for the validation
|
112
|
-
struct = DMap::Validations.const_get(original_name.camelcase).validate validation[1]
|
113
|
-
|
114
|
-
# Finally, add the validations!
|
115
|
-
struct.each do |key, value|
|
116
|
-
DMap::Validations.add keys[1], original_name, key, value unless value.nil? || key == :cmd
|
117
|
-
end
|
118
|
-
next
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
# Does the validation exist
|
123
|
-
property = DMap::Properties.const_get keys[0].capitalize
|
124
|
-
unless property.respond_to? validation[0] or DMap::Validations.respond_to? validation[0]
|
125
|
-
puts "Invalid validation command " + validation[0] + " in type " + property.to_s
|
127
|
+
validate = DMap::Validations.const_get validation[0].camelcase
|
128
|
+
rescue
|
129
|
+
validate = DMap::Associations.const_get validation[0].camelcase
|
130
|
+
rescue
|
131
|
+
puts "Invalid validation command " + validation[0].camelcase + " in type " + validate.class.name.to_s
|
126
132
|
puts opt_parser
|
127
133
|
exit 1
|
128
134
|
end
|
129
135
|
|
130
|
-
#
|
131
|
-
|
132
|
-
|
136
|
+
# Do we need a default value?
|
137
|
+
begin
|
138
|
+
validation[1] ||= validate.default
|
139
|
+
rescue
|
140
|
+
end
|
133
141
|
|
134
|
-
#
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
142
|
+
# Store in variable for -s / silent option
|
143
|
+
valid_command = validate.method("is_valid?").call validation[1]
|
144
|
+
unless valid_command != true
|
145
|
+
if !validate.respond_to? "property"
|
146
|
+
# Compile all of the options for the validation
|
147
|
+
struct = validate.method("validate").call validation[1]
|
148
|
+
|
149
|
+
# Get the original name
|
150
|
+
begin
|
151
|
+
original_name = validate.superclass.parent_name.underscore
|
152
|
+
rescue
|
153
|
+
original_name = validation[0].underscore
|
154
|
+
end
|
155
|
+
|
156
|
+
# Finally, add the validations!
|
157
|
+
if struct.is_a?(Hash) or struct.is_a? Hash
|
158
|
+
struct.each do |key, value|
|
159
|
+
if validate.respond_to? "associations"
|
160
|
+
DMap::Associations.add keys[0], original_name, key, value unless value.nil? || key == :cmd
|
161
|
+
else
|
162
|
+
DMap::Validations.add keys[0], original_name, key, value unless value.nil? || key == :cmd
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
else
|
167
|
+
# Add the "core" validations (on properties)
|
168
|
+
struct = validate.method("validate").call validation[1]
|
169
|
+
DMap::Tables.list.each do |k, table|
|
170
|
+
validation[1] = true if validation[1].nil?
|
171
|
+
DMap::Properties.add table, keys[0], struct, validation[0]
|
172
|
+
end
|
173
|
+
end
|
139
174
|
end
|
140
175
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
176
|
+
if valid_command == false
|
177
|
+
puts validation[0] + " validation has an incorrect value for " + keys[0] + "."
|
178
|
+
if DMap::Commands.options['silent'] != true
|
179
|
+
puts opt_parser
|
180
|
+
exit 1
|
181
|
+
end
|
145
182
|
end
|
146
183
|
end
|
147
184
|
end
|
@@ -152,21 +189,6 @@ end
|
|
152
189
|
#p DMap::Tables.list
|
153
190
|
#p DMap::Properties.list
|
154
191
|
#p DMap::Validations.list
|
155
|
-
#p DMap::Associations.list
|
156
|
-
|
157
|
-
|
158
|
-
when "new"
|
159
|
-
DMap::Tables.list.each do |table|
|
160
|
-
properties = DMap::Properties.list[table]
|
161
|
-
validations = DMap::Validations.list
|
162
|
-
p "Compiling model " + table[0]
|
163
|
-
obj = $new_block.result(binding)
|
164
|
-
|
165
|
-
handler = File.new(table[1] + ".rb", "w")
|
166
|
-
handler.write(obj)
|
167
|
-
handler.close
|
168
|
-
p table[0] + " saved successfully"
|
169
|
-
end
|
170
|
-
else
|
171
|
-
puts opt_parser
|
172
|
-
end
|
192
|
+
#p DMap::Associations.list
|
193
|
+
|
194
|
+
DMap::Commands.method("cmd_" + ARGV[0]).call
|