factoryform 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/History.txt +20 -0
  2. data/README.rdoc +2 -0
  3. data/Rakefile +41 -0
  4. data/VERSION +1 -0
  5. data/factoryform.gemspec +144 -0
  6. data/init.rb +2 -0
  7. data/lib/factoryform.rb +25 -0
  8. data/lib/factoryform/boolean.rb +17 -0
  9. data/lib/factoryform/currency.rb +7 -0
  10. data/lib/factoryform/date_answer.rb +10 -0
  11. data/lib/factoryform/descriptive_content.rb +17 -0
  12. data/lib/factoryform/email.rb +11 -0
  13. data/lib/factoryform/field.rb +29 -0
  14. data/lib/factoryform/form.rb +127 -0
  15. data/lib/factoryform/image_data.rb +13 -0
  16. data/lib/factoryform/long_answer.rb +12 -0
  17. data/lib/factoryform/multiple_choice.rb +39 -0
  18. data/lib/factoryform/number.rb +11 -0
  19. data/lib/factoryform/rating.rb +23 -0
  20. data/lib/factoryform/short_answer.rb +11 -0
  21. data/lib/factoryform/text_data.rb +11 -0
  22. data/lib/factoryform/time_answer.rb +11 -0
  23. data/lib/factoryform/url.rb +10 -0
  24. data/lib/factoryform/utils.rb +13 -0
  25. data/rdoc/classes/Array.html +171 -0
  26. data/rdoc/classes/FactoryForm.html +192 -0
  27. data/rdoc/classes/FactoryForm/Boolean.html +166 -0
  28. data/rdoc/classes/FactoryForm/Currency.html +113 -0
  29. data/rdoc/classes/FactoryForm/DateAnswer.html +149 -0
  30. data/rdoc/classes/FactoryForm/DescriptiveContent.html +173 -0
  31. data/rdoc/classes/FactoryForm/DuplicateIDException.html +117 -0
  32. data/rdoc/classes/FactoryForm/Email.html +150 -0
  33. data/rdoc/classes/FactoryForm/Field.html +205 -0
  34. data/rdoc/classes/FactoryForm/Form.html +477 -0
  35. data/rdoc/classes/FactoryForm/ImageData.html +178 -0
  36. data/rdoc/classes/FactoryForm/LongAnswer.html +162 -0
  37. data/rdoc/classes/FactoryForm/MultipleChoice.html +241 -0
  38. data/rdoc/classes/FactoryForm/Number.html +149 -0
  39. data/rdoc/classes/FactoryForm/ParameterExpectedException.html +118 -0
  40. data/rdoc/classes/FactoryForm/Rating.html +188 -0
  41. data/rdoc/classes/FactoryForm/ShortAnswer.html +150 -0
  42. data/rdoc/classes/FactoryForm/TextData.html +173 -0
  43. data/rdoc/classes/FactoryForm/TimeAnswer.html +149 -0
  44. data/rdoc/classes/FactoryForm/Url.html +149 -0
  45. data/rdoc/created.rid +1 -0
  46. data/rdoc/files/README_rdoc.html +108 -0
  47. data/rdoc/files/lib/factoryform/boolean_rb.html +101 -0
  48. data/rdoc/files/lib/factoryform/currency_rb.html +101 -0
  49. data/rdoc/files/lib/factoryform/date_answer_rb.html +101 -0
  50. data/rdoc/files/lib/factoryform/descriptive_content_rb.html +101 -0
  51. data/rdoc/files/lib/factoryform/email_rb.html +101 -0
  52. data/rdoc/files/lib/factoryform/field_rb.html +101 -0
  53. data/rdoc/files/lib/factoryform/form_rb.html +111 -0
  54. data/rdoc/files/lib/factoryform/image_data_rb.html +101 -0
  55. data/rdoc/files/lib/factoryform/long_answer_rb.html +101 -0
  56. data/rdoc/files/lib/factoryform/multiple_choice_rb.html +101 -0
  57. data/rdoc/files/lib/factoryform/number_rb.html +101 -0
  58. data/rdoc/files/lib/factoryform/rating_rb.html +101 -0
  59. data/rdoc/files/lib/factoryform/short_answer_rb.html +101 -0
  60. data/rdoc/files/lib/factoryform/text_data_rb.html +101 -0
  61. data/rdoc/files/lib/factoryform/time_answer_rb.html +101 -0
  62. data/rdoc/files/lib/factoryform/url_rb.html +101 -0
  63. data/rdoc/files/lib/factoryform/utils_rb.html +101 -0
  64. data/rdoc/files/lib/factoryform_rb.html +101 -0
  65. data/rdoc/fr_class_index.html +46 -0
  66. data/rdoc/fr_file_index.html +45 -0
  67. data/rdoc/fr_method_index.html +55 -0
  68. data/rdoc/index.html +26 -0
  69. data/rdoc/rdoc-style.css +208 -0
  70. data/test/boolean_test.rb +10 -0
  71. data/test/currency_test.rb +9 -0
  72. data/test/date_answer_test.rb +10 -0
  73. data/test/descriptive_content_test.rb +14 -0
  74. data/test/field_test.rb +19 -0
  75. data/test/form_test.rb +166 -0
  76. data/test/image_data_test.rb +18 -0
  77. data/test/long_answer_test.rb +54 -0
  78. data/test/multiple_choice_test.rb +61 -0
  79. data/test/number_test.rb +11 -0
  80. data/test/rating_test.rb +21 -0
  81. data/test/short_answer_test.rb +83 -0
  82. data/test/test_helper.rb +2 -0
  83. data/test/text_data_test.rb +17 -0
  84. data/test/time_answer_test.rb +10 -0
  85. data/test/url_test.rb +11 -0
  86. metadata +197 -0
@@ -0,0 +1,20 @@
1
+ === 0.0.1 2010-08-23
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
5
+
6
+ === 0.0.2 2010-09-08
7
+
8
+ * Other fields added:
9
+ * included boolean field, rating field
10
+ * field types like select_box, check_box, radio_button are included in MultipleChoice Class
11
+
12
+
13
+ * TODO: Coming up for next release:
14
+ * Include advanced field types (priority wise)
15
+ * FileUploadField
16
+ * GoogleMapField
17
+ * RecordVideoField
18
+ * RecordAudioField
19
+ * TakePhotoField
20
+ NOTE:: Look for other options as well (Ref: formtastic.com, wufoo.com)
@@ -0,0 +1,2 @@
1
+ = form
2
+ This is an API for interacting with simple HTML form
@@ -0,0 +1,41 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |s|
7
+ s.name = "factoryform"
8
+ s.summary = "This is an API for interacting with simple HTML form."
9
+ s.description = "This is an API for interacting with simple HTML form."
10
+ s.email = "info@sproutify.com"
11
+ s.homepage = "http://github.com/sprout/factoryform"
12
+ s.authors = ["sprout"]
13
+ s.add_development_dependency("json_pure","~> 1.4.3")
14
+ s.add_runtime_dependency(%q<json_pure>, "~> 1.4.3")
15
+ end
16
+
17
+ Jeweler::GemcutterTasks.new
18
+
19
+ require "rake/testtask"
20
+ Rake::TestTask.new(:test) do |test|
21
+ test.libs << "test"
22
+ test.ruby_opts << "-rubygems"
23
+ test.pattern = "test/**/*_test.rb"
24
+ test.verbose = true
25
+ end
26
+
27
+ task :default => :test
28
+
29
+ rescue LoadError
30
+ puts "Jeweler not available. Install it with: gem install jeweler"
31
+ end
32
+
33
+ require 'rake/rdoctask'
34
+ Rake::RDocTask.new do |rdoc|
35
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
36
+
37
+ rdoc.rdoc_dir = 'rdoc'
38
+ rdoc.title = "factoryform #{version}"
39
+ rdoc.rdoc_files.include('README*')
40
+ rdoc.rdoc_files.include('lib/**/*.rb')
41
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,144 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{factoryform}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["sprout"]
12
+ s.date = %q{2010-10-01}
13
+ s.description = %q{This is an API for interacting with simple HTML form.}
14
+ s.email = %q{info@sproutify.com}
15
+ s.extra_rdoc_files = [
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ "History.txt",
20
+ "README.rdoc",
21
+ "Rakefile",
22
+ "VERSION",
23
+ "factoryform.gemspec",
24
+ "init.rb",
25
+ "lib/factoryform.rb",
26
+ "lib/factoryform/boolean.rb",
27
+ "lib/factoryform/currency.rb",
28
+ "lib/factoryform/date_answer.rb",
29
+ "lib/factoryform/descriptive_content.rb",
30
+ "lib/factoryform/email.rb",
31
+ "lib/factoryform/field.rb",
32
+ "lib/factoryform/form.rb",
33
+ "lib/factoryform/image_data.rb",
34
+ "lib/factoryform/long_answer.rb",
35
+ "lib/factoryform/multiple_choice.rb",
36
+ "lib/factoryform/number.rb",
37
+ "lib/factoryform/rating.rb",
38
+ "lib/factoryform/short_answer.rb",
39
+ "lib/factoryform/text_data.rb",
40
+ "lib/factoryform/time_answer.rb",
41
+ "lib/factoryform/url.rb",
42
+ "lib/factoryform/utils.rb",
43
+ "rdoc/classes/Array.html",
44
+ "rdoc/classes/FactoryForm.html",
45
+ "rdoc/classes/FactoryForm/Boolean.html",
46
+ "rdoc/classes/FactoryForm/Currency.html",
47
+ "rdoc/classes/FactoryForm/DateAnswer.html",
48
+ "rdoc/classes/FactoryForm/DescriptiveContent.html",
49
+ "rdoc/classes/FactoryForm/DuplicateIDException.html",
50
+ "rdoc/classes/FactoryForm/Email.html",
51
+ "rdoc/classes/FactoryForm/Field.html",
52
+ "rdoc/classes/FactoryForm/Form.html",
53
+ "rdoc/classes/FactoryForm/ImageData.html",
54
+ "rdoc/classes/FactoryForm/LongAnswer.html",
55
+ "rdoc/classes/FactoryForm/MultipleChoice.html",
56
+ "rdoc/classes/FactoryForm/Number.html",
57
+ "rdoc/classes/FactoryForm/ParameterExpectedException.html",
58
+ "rdoc/classes/FactoryForm/Rating.html",
59
+ "rdoc/classes/FactoryForm/ShortAnswer.html",
60
+ "rdoc/classes/FactoryForm/TextData.html",
61
+ "rdoc/classes/FactoryForm/TimeAnswer.html",
62
+ "rdoc/classes/FactoryForm/Url.html",
63
+ "rdoc/created.rid",
64
+ "rdoc/files/README_rdoc.html",
65
+ "rdoc/files/lib/factoryform/boolean_rb.html",
66
+ "rdoc/files/lib/factoryform/currency_rb.html",
67
+ "rdoc/files/lib/factoryform/date_answer_rb.html",
68
+ "rdoc/files/lib/factoryform/descriptive_content_rb.html",
69
+ "rdoc/files/lib/factoryform/email_rb.html",
70
+ "rdoc/files/lib/factoryform/field_rb.html",
71
+ "rdoc/files/lib/factoryform/form_rb.html",
72
+ "rdoc/files/lib/factoryform/image_data_rb.html",
73
+ "rdoc/files/lib/factoryform/long_answer_rb.html",
74
+ "rdoc/files/lib/factoryform/multiple_choice_rb.html",
75
+ "rdoc/files/lib/factoryform/number_rb.html",
76
+ "rdoc/files/lib/factoryform/rating_rb.html",
77
+ "rdoc/files/lib/factoryform/short_answer_rb.html",
78
+ "rdoc/files/lib/factoryform/text_data_rb.html",
79
+ "rdoc/files/lib/factoryform/time_answer_rb.html",
80
+ "rdoc/files/lib/factoryform/url_rb.html",
81
+ "rdoc/files/lib/factoryform/utils_rb.html",
82
+ "rdoc/files/lib/factoryform_rb.html",
83
+ "rdoc/fr_class_index.html",
84
+ "rdoc/fr_file_index.html",
85
+ "rdoc/fr_method_index.html",
86
+ "rdoc/index.html",
87
+ "rdoc/rdoc-style.css",
88
+ "test/boolean_test.rb",
89
+ "test/currency_test.rb",
90
+ "test/date_answer_test.rb",
91
+ "test/descriptive_content_test.rb",
92
+ "test/field_test.rb",
93
+ "test/form_test.rb",
94
+ "test/image_data_test.rb",
95
+ "test/long_answer_test.rb",
96
+ "test/multiple_choice_test.rb",
97
+ "test/number_test.rb",
98
+ "test/rating_test.rb",
99
+ "test/short_answer_test.rb",
100
+ "test/test_helper.rb",
101
+ "test/text_data_test.rb",
102
+ "test/time_answer_test.rb",
103
+ "test/url_test.rb"
104
+ ]
105
+ s.homepage = %q{http://github.com/sprout/factoryform}
106
+ s.rdoc_options = ["--charset=UTF-8"]
107
+ s.require_paths = ["lib"]
108
+ s.rubygems_version = %q{1.3.7}
109
+ s.summary = %q{This is an API for interacting with simple HTML form.}
110
+ s.test_files = [
111
+ "test/boolean_test.rb",
112
+ "test/currency_test.rb",
113
+ "test/date_answer_test.rb",
114
+ "test/descriptive_content_test.rb",
115
+ "test/field_test.rb",
116
+ "test/form_test.rb",
117
+ "test/image_data_test.rb",
118
+ "test/long_answer_test.rb",
119
+ "test/multiple_choice_test.rb",
120
+ "test/number_test.rb",
121
+ "test/rating_test.rb",
122
+ "test/short_answer_test.rb",
123
+ "test/test_helper.rb",
124
+ "test/text_data_test.rb",
125
+ "test/time_answer_test.rb",
126
+ "test/url_test.rb"
127
+ ]
128
+
129
+ if s.respond_to? :specification_version then
130
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
131
+ s.specification_version = 3
132
+
133
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
134
+ s.add_development_dependency(%q<json_pure>, ["~> 1.4.3"])
135
+ s.add_runtime_dependency(%q<json_pure>, ["~> 1.4.3"])
136
+ else
137
+ s.add_dependency(%q<json_pure>, ["~> 1.4.3"])
138
+ s.add_dependency(%q<json_pure>, ["~> 1.4.3"])
139
+ end
140
+ else
141
+ s.add_dependency(%q<json_pure>, ["~> 1.4.3"])
142
+ s.add_dependency(%q<json_pure>, ["~> 1.4.3"])
143
+ end
144
+ end
data/init.rb ADDED
@@ -0,0 +1,2 @@
1
+ # Include hook code here
2
+ # require 'form_library'
@@ -0,0 +1,25 @@
1
+ require File.join(File.dirname(__FILE__),'factoryform/form')
2
+ require File.join(File.dirname(__FILE__),'factoryform/field')
3
+ require File.join(File.dirname(__FILE__),'factoryform/short_answer')
4
+ require File.join(File.dirname(__FILE__),'factoryform/long_answer')
5
+ require File.join(File.dirname(__FILE__),'factoryform/multiple_choice')
6
+ require File.join(File.dirname(__FILE__),'factoryform/utils')
7
+ require File.join(File.dirname(__FILE__),'factoryform/text_data')
8
+ require File.join(File.dirname(__FILE__),'factoryform/image_data')
9
+ require File.join(File.dirname(__FILE__),'factoryform/date_answer')
10
+ require File.join(File.dirname(__FILE__),'factoryform/email')
11
+ require File.join(File.dirname(__FILE__),'factoryform/number')
12
+ require File.join(File.dirname(__FILE__),'factoryform/url')
13
+ require File.join(File.dirname(__FILE__),'factoryform/time_answer')
14
+ require File.join(File.dirname(__FILE__),'factoryform/boolean')
15
+ require File.join(File.dirname(__FILE__),'factoryform/currency')
16
+ require File.join(File.dirname(__FILE__),'factoryform/rating')
17
+ require File.join(File.dirname(__FILE__),'factoryform/descriptive_content')
18
+
19
+
20
+ module FactoryForm
21
+ # Raised when FactoryForm::TextData.new doesn't include a required parameter
22
+ class ParameterExpectedException < RuntimeError
23
+
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ module FactoryForm
2
+ class Boolean < Field
3
+ attr_accessor :values # True/false values
4
+
5
+ def initialize(options={})
6
+ self.values = options[:values] = [true, false]
7
+ options[:field_type] = "boolean"
8
+
9
+ super(options)
10
+
11
+ # Unique is always false
12
+ self.unique = false
13
+
14
+ end
15
+ end
16
+ end
17
+
@@ -0,0 +1,7 @@
1
+ module FactoryForm
2
+ class Currency < Field
3
+ # TODO: Need to think about it
4
+
5
+
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ module FactoryForm
2
+ class DateAnswer < ShortAnswer
3
+ def initialize(options={})
4
+ options[:field_type] = "date_answer"
5
+ super(options)
6
+ @validation_format = "date"
7
+ end
8
+ end
9
+ end
10
+
@@ -0,0 +1,17 @@
1
+ module FactoryForm
2
+ class DescriptiveContent
3
+ attr_reader :id
4
+ attr_accessor :label, :value
5
+
6
+ def initialize(options = {})
7
+ unless options.empty? || options[:id].empty? || options[:label].empty?
8
+ @id, @label, @value = options[:id], options[:label], options[:value] || options[:label]
9
+ else
10
+ raise(ParameterExpectedException, "Missing ID and label")
11
+ end
12
+ end
13
+
14
+ end
15
+ end
16
+
17
+
@@ -0,0 +1,11 @@
1
+ module FactoryForm
2
+ class Email < ShortAnswer
3
+ def initialize(options={})
4
+ options[:field_type] = "short_answer"
5
+ super(options)
6
+ @validation_format = "email"
7
+ # extra attributes for ShortAnswer
8
+ end
9
+ end
10
+
11
+ end
@@ -0,0 +1,29 @@
1
+ module FactoryForm
2
+ # Field is simply a hash of different attributes
3
+ class Field
4
+ attr_reader :id
5
+ attr_accessor :label, :hint, :required, :unique, :validation_format, :field_type
6
+
7
+ def initialize(options)
8
+ unless options.nil? || options[:id].nil? || options[:label].nil?
9
+ extra_options = options[:options] || { }
10
+ extra_options.merge!({
11
+ # defaults
12
+ :hint => extra_options[:hint] || " ",
13
+ :required => extra_options[:required] || true,
14
+ :unique => extra_options[:unique] || false,
15
+ :validation_format => extra_options[:validation_format] || "general",
16
+ })
17
+ options.merge!({:options => extra_options})
18
+
19
+ @id, @label, @hint, @required, @unique, @validation_format, @field_type = options[:id], options[:label],options[:options][:hint], options[:options][:required], options[:options][:unique], options[:options][:validation_format], options[:field_type]
20
+ else
21
+ raise(ParameterExpectedException, "Missing ID and label")
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+
28
+
29
+
@@ -0,0 +1,127 @@
1
+ require 'yaml'
2
+ require 'rubygems'
3
+ require 'json/pure' unless defined?(JSON::State)
4
+ require File.join(File.dirname(__FILE__),'utils')
5
+ require 'rexml/document'
6
+
7
+ module FactoryForm
8
+ # Form is simply an ordered array of fields. Each Field is simply a hash of field options.
9
+ class Form
10
+ attr_accessor :title, :fields
11
+
12
+ def initialize(options = {})
13
+ @title = options[:title] || ""
14
+ @fields = Array.new
15
+ end
16
+
17
+ # Add field object
18
+ def add(field, position=@fields.length)
19
+ # Check for duplicate ID
20
+ unless get_ids.include?(field.id)
21
+ @fields.insert(position, field)
22
+ else
23
+ raise(DuplicateIDException, "Duplicate ID")
24
+ end
25
+
26
+ end
27
+
28
+ # Get field object by ID
29
+ # form.get(:id => "email_1")
30
+ # TODO:: Get element by other attributes as well
31
+ def get(option)
32
+ # @fields[@fields.index(option)]
33
+ @fields[get_ids.index(option[:id])]
34
+ end
35
+
36
+ # Remove field object
37
+ def remove(field)
38
+ @fields.delete(field)
39
+ end
40
+
41
+ def move_up(field, steps = 1)
42
+ @fields.move_object(field, @fields.index(field) - steps)
43
+ end
44
+
45
+ def move_down(field, steps = 1)
46
+ @fields.move_object(field, @fields.index(field) + steps)
47
+ end
48
+
49
+ def move_to_position(field, position)
50
+ @fields.move_object(field, position)
51
+ end
52
+
53
+ def add_to_position(field, position)
54
+ @fields.insert(position, field)
55
+ end
56
+
57
+ def to_yml
58
+ self.to_yaml
59
+ end
60
+
61
+ def to_json
62
+ fields = Array.new
63
+ @fields.each do |f|
64
+ attributes = f.instance_variables.map{|a| a.gsub("@","")}
65
+ attributes_hash = {}
66
+ attributes.each do |a|
67
+ attributes_hash[a] = f.send(a)
68
+ end
69
+ fields << {f.class.name => attributes_hash }
70
+ end
71
+ fields
72
+ fields.to_json
73
+ end
74
+
75
+ def to_xml
76
+ doc = REXML::Document.new
77
+ root = doc.add_element("Form")
78
+
79
+ title_element = root.add_element("Title")
80
+ title_element.add_text("#{self.title}")
81
+
82
+ out_string = ''
83
+ @fields.each {|field|
84
+ field_element = root.add_element("Field")
85
+ field_type_element = field_element.add_element("#{field.class.name}")
86
+
87
+ field_type_element.add_attribute("id", field.id)
88
+ field_type_element.add_attribute("label", field.label)
89
+
90
+ attributes = field.instance_variables.map{|a| a.gsub("@","")}
91
+ attributes.each do |attrb|
92
+ attrb_element = field_type_element.add_element("#{attrb}")
93
+
94
+ # For option values of Multiple choice, separate them as option tags
95
+ if attrb == "values"
96
+ field.send(attrb).each do |option|
97
+ option_element = attrb_element.add_element("option")
98
+ option_element.add_text(option)
99
+ end
100
+ else
101
+ attrb_element.add_text(field.send(attrb).to_s)
102
+ end
103
+ end
104
+
105
+ doc.write( out_string = "\n"+'<?xml version="1.0" encoding="UTF-8"?>'+"\n", 2 )
106
+
107
+ }
108
+ return out_string
109
+ end
110
+
111
+ private
112
+
113
+ # List of all IDs
114
+ def get_ids
115
+ @fields.map(& :id)
116
+ end
117
+
118
+ end
119
+
120
+ # Raised if the field with the same ID already exists
121
+ class DuplicateIDException < RuntimeError
122
+
123
+ end
124
+
125
+ end
126
+
127
+