quirkey-qadmin 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. data/History.txt +4 -0
  2. data/Manifest.txt +44 -0
  3. data/PostInstall.txt +1 -0
  4. data/README.rdoc +64 -0
  5. data/Rakefile +28 -0
  6. data/init.rb +1 -0
  7. data/lib/qadmin/controller.rb +121 -0
  8. data/lib/qadmin/helper.rb +59 -0
  9. data/lib/qadmin/views/edit.html.erb +12 -0
  10. data/lib/qadmin/views/index.html.erb +31 -0
  11. data/lib/qadmin/views/new.html.erb +12 -0
  12. data/lib/qadmin/views/show.html.erb +14 -0
  13. data/lib/qadmin.rb +13 -0
  14. data/rails/init.rb +4 -0
  15. data/rails_generators/qadmin/USAGE +5 -0
  16. data/rails_generators/qadmin/qadmin_generator.rb +94 -0
  17. data/rails_generators/qadmin/templates/_form.html.erb +7 -0
  18. data/rails_generators/qadmin/templates/controller.rb +6 -0
  19. data/rails_generators/qadmin/templates/functional_test.rb +77 -0
  20. data/rails_generators/qadmin/templates/images/icon_destroy.png +0 -0
  21. data/rails_generators/qadmin/templates/images/icon_down.gif +0 -0
  22. data/rails_generators/qadmin/templates/images/icon_edit.png +0 -0
  23. data/rails_generators/qadmin/templates/images/icon_export.png +0 -0
  24. data/rails_generators/qadmin/templates/images/icon_find.png +0 -0
  25. data/rails_generators/qadmin/templates/images/icon_import.png +0 -0
  26. data/rails_generators/qadmin/templates/images/icon_list.png +0 -0
  27. data/rails_generators/qadmin/templates/images/icon_new.png +0 -0
  28. data/rails_generators/qadmin/templates/images/icon_next.gif +0 -0
  29. data/rails_generators/qadmin/templates/images/icon_prev.gif +0 -0
  30. data/rails_generators/qadmin/templates/images/icon_show.png +0 -0
  31. data/rails_generators/qadmin/templates/images/icon_sort.png +0 -0
  32. data/rails_generators/qadmin/templates/images/icon_up.gif +0 -0
  33. data/rails_generators/qadmin/templates/images/indicator_medium.gif +0 -0
  34. data/rails_generators/qadmin/templates/layout.html.erb +45 -0
  35. data/rails_generators/qadmin/templates/shoulda_functional_test.rb +33 -0
  36. data/rails_generators/qadmin/templates/style.css +683 -0
  37. data/script/console +10 -0
  38. data/script/destroy +14 -0
  39. data/script/generate +14 -0
  40. data/script/txt2html +71 -0
  41. data/test/test_generator_helper.rb +29 -0
  42. data/test/test_helper.rb +70 -0
  43. data/test/test_qadmin_controller.rb +138 -0
  44. data/test/test_qadmin_generator.rb +61 -0
  45. metadata +130 -0
@@ -0,0 +1,683 @@
1
+ *, html {
2
+ padding: 0px;
3
+ margin: 0px;
4
+ }
5
+ body {
6
+ font-family: Arial, Helvetica, sans-serif;
7
+ font-size: 12px;
8
+ background:#FEFEFE;
9
+ color:#000;
10
+ }
11
+ img {
12
+ border: 0;
13
+ }
14
+ a:link, a:visited {
15
+ color:#4C6A8B;
16
+ text-decoration:none;
17
+ }
18
+ a:visited {
19
+ color:#767676;
20
+ }
21
+ a:hover {
22
+ color:#F16F7F;
23
+ }
24
+ form input[type=file] {
25
+ /* width:100px;*/
26
+ }
27
+ h1,h2,h3,h4,h5 {
28
+ padding-left:0px;
29
+ padding-right:0px;
30
+ color:#333;
31
+ }
32
+ p {
33
+ padding: 10px;
34
+ }
35
+ h3 {
36
+ margin: 10px 0px;
37
+ }
38
+ h5 {
39
+ margin: 10px 0px;
40
+ font-size:12px;
41
+ color:#666;
42
+ /* border-bottom:1px solid #E5E5E5;*/
43
+ text-decoration:underline;
44
+ }
45
+ ul {
46
+ list-style:none;
47
+ padding:5px;
48
+ margin:0px 10px;
49
+ }
50
+ ul li {
51
+ padding: 5px 0px;
52
+ }
53
+ label {
54
+ font-size:12px;
55
+ }
56
+ p label, label.form_label {
57
+ float:left;
58
+ width:120px;
59
+ color:#666;
60
+ padding:5px 0px;
61
+ }
62
+ p label.radio_label {
63
+ width:auto;
64
+ float:none;
65
+ margin-left: 10px;
66
+ vertical-align:bottom;
67
+ }
68
+ form p {
69
+ padding: 8px 10px;
70
+ }
71
+ input, textarea {
72
+ font-family:Helvetica, Arial, sans-serif;
73
+ font-size: 14px;
74
+ padding: 4px;
75
+ border: 1px solid #333;
76
+ vertical-align:middle;
77
+ }
78
+ textarea {
79
+ font-family:Monaco, Courier, fixed;
80
+ font-size:12px;
81
+ }
82
+ input.title {
83
+ font-size: 22px;
84
+ font-weight:bold;
85
+ }
86
+ input[type=button], input[type=submit] {
87
+ color:#FFF;
88
+ background:#333;
89
+ border:1px solid #E5E5E5;
90
+ padding:4px 12px;
91
+ }
92
+ input[type=button] {
93
+ background:#666;
94
+ }
95
+ form p strong {
96
+ margin:5px 0px;
97
+ }
98
+ form p strong {
99
+ display:block;
100
+ }
101
+ option {
102
+ padding: 0px 4px;
103
+ }
104
+
105
+ #header {
106
+ padding: 0px 20px;
107
+ height:60px;
108
+ background: #000;
109
+ color:#FFF;
110
+ }
111
+ #header h1 {
112
+ color:#FFF;
113
+ padding:20px 0px;
114
+ margin:0px;
115
+ }
116
+ #loginbox {
117
+ position:absolute;
118
+ top: 10px;
119
+ right: 20px;
120
+ color:#CCC;
121
+ }
122
+ #content {
123
+ padding: 20px;
124
+ }
125
+
126
+ #menu {
127
+ width: auto;
128
+ font-size: 14px;
129
+ border-bottom: 1px solid #000;
130
+ background:#F34D84;
131
+ }
132
+ #menu ul {
133
+ padding: 0px;
134
+ margin:0px;
135
+ }
136
+ #menu ul li {
137
+ float:left;
138
+ margin:0px;
139
+ padding:0px;
140
+ }
141
+ #menu ul li a:link, #menu ul li a:visited {
142
+ font-weight: bold;
143
+ color: #FFF;
144
+ text-decoration: none;
145
+ padding: 4px 10px;
146
+ display:block;
147
+ }
148
+ #menu ul li a:hover {
149
+ color: #CCC;
150
+ background:#000;
151
+ }
152
+ #menu ul li a.selected {
153
+ color:#999;
154
+ background:#333;
155
+ }
156
+
157
+ #footer {
158
+ margin: 20px 0px;
159
+ font-size: 10px;
160
+ color:#999;
161
+ width:auto;
162
+ text-align:center;
163
+ }
164
+ /******************************************************
165
+ * left menu *
166
+ \*****************************************************/
167
+ #main {
168
+ background:#FEFEFE;
169
+ }
170
+ #left_menu {
171
+ position:absolute;
172
+ top:60px;
173
+ left:0px;
174
+ width:150px;
175
+ }
176
+ #content {
177
+ background:#FFF;
178
+ border-left:1px solid #E5E5E5;
179
+ margin: 0px 0px 0px 150px;
180
+ }
181
+ #left_menu .menu {
182
+ border-bottom:1px solid #E5E5E5;
183
+ margin:5px 0px;
184
+ padding:0px;
185
+ }
186
+ #left_menu .menu li {
187
+ font-size:14px;
188
+ font-weight:bold;
189
+ margin:0px;
190
+ padding:0px;
191
+ }
192
+ #left_menu .menu li a:link, #left_menu .menu li a:visited {
193
+ color:#4C6A8B;
194
+ padding: 5px 15px;
195
+ display:block;
196
+ }
197
+ #left_menu .menu li a:hover {
198
+ color:#FFF;
199
+ background:#666;
200
+ }
201
+ #left_menu .menu li a.selected {
202
+ color:#FFF;
203
+ background:#333;
204
+ }
205
+ #left_menu h3 {
206
+ color:#666;
207
+ font-size:12px;
208
+ margin:10px 0px 0px 15px;
209
+ }
210
+
211
+
212
+ /******************************************************
213
+ * admin controls *
214
+ \*****************************************************/
215
+
216
+ span.control {
217
+ position:relative;
218
+ float:right;
219
+ top:-20px;
220
+ text-align:right;
221
+ font-size:11px;
222
+ }
223
+ table {
224
+ width:99%;
225
+ margin: 10px 0px;
226
+ border-collapse: collapse;
227
+ }
228
+ th, td {
229
+ border-bottom: 1px solid #E5E5E5;
230
+ padding: 6px 4px 6px 0px;
231
+ text-align: center;
232
+ }
233
+ .first_col {
234
+ text-align: left;
235
+ }
236
+ .total {
237
+ text-align: right;
238
+ padding: 10px;
239
+ margin-right: 100px;
240
+ }
241
+ fieldset, .fields_group {
242
+ margin: 10px 0px 0px 0px;
243
+ background:#F5F5F5;
244
+ border:1px solid #E5E5E5;
245
+ padding:0px 0px 5px;
246
+ }
247
+ .fields_group {
248
+ background:#F9F9F9;
249
+ padding: 10px;
250
+ }
251
+ legend {
252
+ font-weight: bold;
253
+ font-size:14px;
254
+ color:#333;
255
+ background:#F5F5F5;
256
+ border-top:1px solid #E5E5E5;
257
+ padding: 5px 5px;
258
+ margin: 0px 5px;
259
+ }
260
+ ul.admin_controls {
261
+ margin: 10px 0px;
262
+ padding: 0px;
263
+ border-top: 1px solid #E5E5E5;
264
+ border-bottom: 1px solid #E5E5E5;
265
+ background: #F7F7F7;
266
+ height:24px;
267
+ }
268
+ ul.admin_controls li {
269
+ float:left;
270
+ list-style-type:none;
271
+ padding:0px;
272
+ margin: 0px 4px;
273
+ }
274
+ ul.admin_controls li a:link, ul.admin_controls li a:visited {
275
+ padding: 4px 8px;
276
+ display:block;
277
+ }
278
+ ul.admin_controls li a:hover {
279
+ background:#CCCCCC;
280
+ color: #000000;
281
+ }
282
+ ul.admin_controls li img {
283
+ vertical-align: bottom;
284
+ }
285
+
286
+
287
+ /******************************************************
288
+ * departments *
289
+ \*****************************************************/
290
+ .departments_list {
291
+ font-size: 14px;
292
+ padding: 10px;
293
+ margin: 0px;
294
+ }
295
+ .departments_list li {
296
+ list-style-type: none;
297
+ padding: 5px 0px;
298
+ margin: 0px;
299
+ }
300
+ .departments_list li ul li {
301
+ font-size: 13px;
302
+ }
303
+ .sort_handle {
304
+ display:none;
305
+ font-size:8px;
306
+ font-weight:bold;
307
+ font-style:normal;
308
+ color:#CCC;
309
+ background:#666;
310
+ padding:2px;
311
+ margin: 0px 4px;
312
+ cursor: move;
313
+ }
314
+ .controls {
315
+ font-size: 10px;
316
+ background: #E5E5E5;
317
+ padding: 2px;
318
+ }
319
+ .promos_list tr {
320
+ }
321
+ .departments_list.sorting .sort_handle,
322
+ .promos_list.sorting .sort_handle {
323
+ display:inline;
324
+ }
325
+ .departments_list.sorting li .controls,
326
+ .promos_list.sorting .promo_image {
327
+ display:none;
328
+ }
329
+
330
+ /******************************************************
331
+ * file selector/browser *
332
+ \*****************************************************/
333
+ .file_selector {
334
+ /* position: relative;*/
335
+ width:auto;
336
+
337
+ }
338
+ .file_selector .alt {
339
+ background:#B2D5FF;
340
+ }
341
+ .file_browser {
342
+ margin:0px 10px;
343
+ width:auto;
344
+ max-width:500px;
345
+ height:310px;
346
+ overflow:auto;
347
+ border:1px solid #CCC;
348
+ background-attachment: fixed;
349
+ /* border-left:1px solid #E5E5E5;
350
+ border-bottom:1px solid #E5E5E5;
351
+ */
352
+ }
353
+ .file_browser_setter {
354
+ clear:both;
355
+ }
356
+
357
+ .file_selector.selector_open {
358
+ border-top:1px solid #E5E5E5;
359
+ border-bottom:1px solid #E5E5E5;
360
+ }
361
+ .file_browser_setter .pane {
362
+ padding: 10px 0px;
363
+ background:#FFF;
364
+ }
365
+ .file_selector_browse_toggle {
366
+ position:relative;
367
+ top:0px;
368
+ right:10px;
369
+ }
370
+ ul.directory_list {
371
+ margin:0px;
372
+ padding:0px;
373
+ list-style-type:none;
374
+ /* background: url(/images/file_browser/bg_alternating.gif) 0 0 repeat;*/
375
+ }
376
+ ul.directory_list a:link, ul.directory_list a:visited {
377
+ color:#000;
378
+ padding:2px 0px;
379
+ }
380
+ .file_browser_current ul.directory_list {
381
+ display:inline;
382
+ float:left;
383
+ width:300px;
384
+ }
385
+ li.directory a {
386
+ font-weight:bold;
387
+ display: block;
388
+ }
389
+ li.file a {
390
+ font-weight:normal;
391
+ }
392
+ li.file a.disabled {
393
+ color:#BEBEBE;
394
+ cursor:default;
395
+ }
396
+ ul.directory_list li {
397
+ display:block;
398
+ padding: 4px 0px 0px 12px;
399
+ cursor:pointer;
400
+ clear:both;
401
+ }
402
+ ul.directory_list li img.directory_loading {
403
+ vertical-align:middle;
404
+ margin: 2px;
405
+ }
406
+ ul.directory_list li a.selected {
407
+ background-color:#2E75D9;
408
+ color:#FFF;
409
+ }
410
+ span.file_icon {
411
+ background:url(/images/admin/file_browser/icon_file.png) 0px 0px no-repeat;
412
+ display:block;
413
+ margin:-2px 4px 0 0;
414
+ padding:0px;
415
+ width:16px;
416
+ height:20px;
417
+ float:left;
418
+ vertical-align:middle;
419
+ }
420
+ span.icon_directory {
421
+ background:url(/images/admin/file_browser/icon_directory.png) 0px 0px no-repeat;
422
+ }
423
+ span.icon_file_jpg, span.icon_file_png, span.icon_file_gif {
424
+ background:url(/images/admin/file_browser/icon_photo.png) 0px 0px no-repeat;
425
+ }
426
+ span.icon_file_flv, span.icon_file_mov {
427
+ background:url(/images/admin/file_browser/icon_video.png) 0px 0px no-repeat;
428
+ }
429
+ span.icon_file_pdf {
430
+ background:url(/images/admin/file_browser/icon_pdf.png) 0px 0px no-repeat;
431
+ }
432
+ ul.file_menu {
433
+ width:100px;
434
+ background:#FFF;
435
+ border:1px solid #E5E5E5;
436
+ padding:0px;
437
+ margin:0px;
438
+ z-index:100;
439
+ }
440
+ ul.file_menu li.file_menu_item {
441
+ padding:0px;
442
+ cursor:pointer;
443
+ /* border-bottom:1px solid #E5E5E5;*/
444
+ }
445
+ ul.file_menu li.file_menu_item a {
446
+ padding: 4px 12px;
447
+ display:block;
448
+ }
449
+ ul.file_menu li.file_menu_item a.disabled {
450
+ color:#BEBEBE;
451
+ cursor:default;
452
+ }
453
+ ul.file_menu li.file_menu_item a:hover {
454
+ background:#2E75D9;
455
+ color:#fff;
456
+ }
457
+ ul.file_menu li.file_menu_item a.disabled:hover {
458
+ background:none;
459
+ color:#BEBEBE;
460
+ }
461
+ .mini_upload {
462
+ border:0px;
463
+ width:500px;
464
+ height:310px;
465
+ overflow:auto;
466
+ }
467
+ /******************************************************
468
+ * Tabs *
469
+ \*****************************************************/
470
+ .tabs ul {
471
+ position:relative;
472
+ width:auto;
473
+ height:20px;
474
+ list-style-type:none;
475
+ padding-left:15px;
476
+ margin:0px;
477
+ border-bottom: 1px solid #E5E5E5;
478
+ z-index:5;
479
+ vertical-align:bottom;
480
+ }
481
+ .tabs ul li {
482
+ float:left;
483
+ text-align:center;
484
+ margin: 0px 5px 0px 0px;
485
+ padding:5px 10px;
486
+ font-size: 12px;
487
+ font-weight:bold;
488
+ color:#999;
489
+ background-color:#f5f5f5;
490
+ border: 1px solid #E5E5E5;
491
+ /* background:url(/images/tab_bg.png) 0 0 no-repeat transparent;*/
492
+ cursor:pointer;
493
+ }
494
+ .tabs ul li.selected {
495
+ background:#FFF;
496
+ border-bottom:1px solid #FFF;
497
+ color:#000;
498
+ z-index:10;
499
+ }
500
+ /******************************************************
501
+ * stats *
502
+ \*****************************************************/
503
+ table.stats {
504
+ width: 500px;
505
+ border:1px solid #CCC;
506
+ border-collapse:collapse;
507
+ text-align:left;
508
+ }
509
+ table.stats th {
510
+ text-align:left;
511
+ vertical-align:top;
512
+ padding: 4px 10px;
513
+ }
514
+ table.stats td {
515
+ text-align:left;
516
+ }
517
+ /******************************************************
518
+ * pagination *
519
+ \*****************************************************/
520
+ .pagination {
521
+ width: 100%;
522
+ text-align:right;
523
+ margin: 0px 0px 20px 0px;
524
+ padding: 4px 0px;
525
+ background: #F7F7F7;
526
+ display:block;
527
+ color:#CCC;
528
+ font-weight:bold;
529
+ }
530
+ /*.pagination ul {
531
+ margin: 10px 0px;
532
+ padding: 0px;
533
+ font-size: 14px;
534
+ }
535
+ .pagination ul li {
536
+ list-style-type:none;
537
+ padding:0px;
538
+ margin: 0px 4px;
539
+ display:inline;
540
+ }
541
+ */
542
+ .pagination a, .pagination span {
543
+ padding:0px 5px;
544
+ /* display:block;
545
+ float:left;*/
546
+ }
547
+ .pagination span.current {
548
+ color:#333;
549
+ }
550
+ /******************************************************
551
+ * overlay *
552
+ \*****************************************************/
553
+ #overlay, .overlay {
554
+ position: absolute;
555
+ top: 0;
556
+ left: 0;
557
+ z-index: 20;
558
+ width: 100%;
559
+ height: 95%;
560
+ background-color: #333;
561
+ filter:alpha(opacity=55);
562
+ -moz-opacity: 0.55;
563
+ opacity: 0.55;
564
+ }
565
+ #mini_browser_overlay {
566
+ height:400px;
567
+ }
568
+ #overlay_holder {
569
+ position: absolute;
570
+ top: 0;
571
+ left: 0;
572
+ z-index: 20;
573
+ width: 100%;
574
+ text-align:center;
575
+ background:transparent;
576
+ }
577
+ .overlay_box {
578
+ width:415px;
579
+ height:auto;
580
+ background: #FFF;
581
+ position:relative;
582
+ top:25px;
583
+ margin:0px auto;
584
+ padding: 20px;
585
+ text-align:left;
586
+ border: 1px solid #CCC;
587
+ z-index: 50;
588
+ }
589
+ .overlay_close {
590
+ position: absolute;
591
+ top: 10px;
592
+ right:10px;
593
+ cursor: pointer;
594
+ }
595
+
596
+
597
+ /******************************************************
598
+ * error *
599
+ \*****************************************************/
600
+ p.need_login {
601
+ text-align:center;
602
+ font-size:12px;
603
+ font-weight:bold;
604
+ color:#999;
605
+ padding: 10px 0px;
606
+ }
607
+ .fieldWithErrors {
608
+ /* padding: 4px 2px 8px 2px;
609
+ background-color: #7F1F1F;
610
+ */ display: inline;
611
+ }
612
+
613
+
614
+ .fieldWithErrors input {
615
+ background:#F6E0CE;
616
+ border-bottom: 4px solid #4c0019;
617
+ }
618
+ #errorExplanation {
619
+ width: auto;
620
+ /* border: 2px solid #4c0019;*/
621
+ padding-bottom: 12px;
622
+ margin: 0px 0px 20px 0px;
623
+ background-color: #C83638;
624
+ color: #FFF;
625
+ }
626
+
627
+ #errorExplanation h2 {
628
+ text-align: left;
629
+ padding: 5px 5px 5px 10px;
630
+ font-size: 14px;
631
+ margin: 0px;
632
+ background-color: #4c0019;
633
+ color: #fff;
634
+ }
635
+
636
+ #errorExplanation p {
637
+ margin-bottom: 0;
638
+ padding: 10px;
639
+ }
640
+ #errorExplanation ul li {
641
+ font-size: 14px;
642
+ list-style-type: square;
643
+ margin: 2px 20px;
644
+ }
645
+ .message {
646
+ width:auto;
647
+ background:#FFFCCC;
648
+ margin:10px 0px 20px 0px;
649
+ padding:10px;
650
+ font-size:14px;
651
+ font-weight:bold;
652
+ color:#333;
653
+ }
654
+
655
+ span.message {
656
+ background:none;
657
+ border:none;
658
+ color: #FFC;
659
+ }
660
+ .message a {
661
+ text-decoration:none;
662
+ }
663
+ .message.warning {
664
+ background:#C83638;
665
+ color:#FFF;
666
+ }
667
+
668
+ .error_page {
669
+ font-size:16px;
670
+ width:100%;
671
+ text-align:center;
672
+ padding: 100px 0px;
673
+ }
674
+ .hr {
675
+ height: 1px;
676
+ margin: 10px 0px;
677
+ border-bottom: 1px solid #CCC;
678
+ }
679
+ .clear {
680
+ clear:both;
681
+ line-height: 0px;
682
+ height: 0px;
683
+ }
data/script/console ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/qadmin.rb'}"
9
+ puts "Loading qadmin gem"
10
+ exec "#{irb} #{libs} --simple-prompt"
data/script/destroy ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
data/script/generate ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)