factoryform 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 (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
+