mvpkit 0.8.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 (150) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +30 -0
  3. data/Gemfile.lock +329 -0
  4. data/LICENSE.txt +20 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +134 -0
  7. data/Rakefile +52 -0
  8. data/VERSION +1 -0
  9. data/app/assets/javascripts/mvp/application.js +1 -0
  10. data/app/assets/stylesheets/mvp/application.scss +0 -0
  11. data/app/controllers/concerns/mvp/analytics_concern.rb +78 -0
  12. data/app/controllers/concerns/mvp/seo_concern.rb +25 -0
  13. data/app/controllers/concerns/mvp/session_concern.rb +44 -0
  14. data/app/controllers/mvp/analytics_controller.rb +12 -0
  15. data/app/controllers/mvp/seo_controller.rb +11 -0
  16. data/app/controllers/mvp/styleguide_controller.rb +23 -0
  17. data/app/helpers/minimum_viable_product/body_helper.rb +14 -0
  18. data/app/helpers/minimum_viable_product/bootstrap_helper.rb +38 -0
  19. data/app/helpers/minimum_viable_product/styleguide_helper.rb +4 -0
  20. data/app/models/concerns/mvp/slugification.rb +24 -0
  21. data/app/views/layouts/minimum_viable_product/_instrumentation.html.erb +100 -0
  22. data/app/views/layouts/minimum_viable_product/_meta.html.erb +37 -0
  23. data/app/views/layouts/minimum_viable_product/application.html.erb +19 -0
  24. data/app/views/minimum_viable_product/styleguide/_example.html.erb +6 -0
  25. data/app/views/minimum_viable_product/styleguide/bootstrap/_buttons.html.erb +191 -0
  26. data/app/views/minimum_viable_product/styleguide/bootstrap/_forms.html.erb +192 -0
  27. data/app/views/minimum_viable_product/styleguide/bootstrap/_header.html.erb +48 -0
  28. data/app/views/minimum_viable_product/styleguide/bootstrap/_panels.html.erb +16 -0
  29. data/app/views/minimum_viable_product/styleguide/bootstrap/_tables.html.erb +34 -0
  30. data/app/views/minimum_viable_product/styleguide/bootstrap/_typography.html.erb +51 -0
  31. data/app/views/minimum_viable_product/styleguide/bootstrap.html.erb +43 -0
  32. data/app/views/minimum_viable_product/styleguide/elements/_grouping.html.erb +1 -0
  33. data/app/views/minimum_viable_product/styleguide/elements/partials/_row_groups_of.html.erb +7 -0
  34. data/app/views/minimum_viable_product/styleguide/index.html.erb +17 -0
  35. data/app/views/minimum_viable_product/styleguide/layouts/basic.html.erb +4 -0
  36. data/app/views/minimum_viable_product/styleguide/layouts/carousel.html.erb +120 -0
  37. data/app/views/minimum_viable_product/styleguide/layouts/cover.html.erb +34 -0
  38. data/assets/js/application.js +31 -0
  39. data/assets/js/init/controllers.js +26 -0
  40. data/assets/js/init/forms.js +12 -0
  41. data/bin/mvp +78 -0
  42. data/bin/rails +12 -0
  43. data/config/initializers/assets.rb +2 -0
  44. data/config/initializers/canonical_host.rb +3 -0
  45. data/config/initializers/cloudinary.rb +7 -0
  46. data/config/initializers/geocoder.rb +9 -0
  47. data/config/initializers/iteration.rb +33 -0
  48. data/config/initializers/project.rb +1 -0
  49. data/config/initializers/rollbar.rb +59 -0
  50. data/config/initializers/routing.rb +7 -0
  51. data/config/initializers/spoof_ip.rb +33 -0
  52. data/config/initializers/ssl.rb +14 -0
  53. data/config/routes.rb +6 -0
  54. data/lib/mvp/engine.rb +22 -0
  55. data/lib/mvp/ext/nil.rb +5 -0
  56. data/lib/mvp/ext/string.rb +7 -0
  57. data/lib/mvpkit.rb +6 -0
  58. data/lib/tasks/sitemap.rake +42 -0
  59. data/mvpkit.gemspec +245 -0
  60. data/package.json +43 -0
  61. data/project/.gitignore +45 -0
  62. data/project/Gemfile +33 -0
  63. data/project/Gemfile.lock +437 -0
  64. data/project/Procfile +2 -0
  65. data/project/README.md +117 -0
  66. data/project/Rakefile +14 -0
  67. data/project/app/controllers/application_controller.rb +12 -0
  68. data/project/app/controllers/conversions_controller.rb +24 -0
  69. data/project/app/controllers/examples_controller.rb +2 -0
  70. data/project/app/controllers/home_controller.rb +7 -0
  71. data/project/app/decorators/.keep +0 -0
  72. data/project/app/helpers/application_helper.rb +24 -0
  73. data/project/app/mailers/.keep +0 -0
  74. data/project/app/models/conversion.rb +4 -0
  75. data/project/app/views/examples/index.html.erb +1 -0
  76. data/project/app/views/examples/mustache/template.mustache +1 -0
  77. data/project/app/views/examples/mustache.html.erb +18 -0
  78. data/project/app/views/home/conversion.html.erb +12 -0
  79. data/project/app/views/home/index.html.erb +28 -0
  80. data/project/app/views/layouts/_header.html.erb +16 -0
  81. data/project/app/views/layouts/_includes.html.erb +7 -0
  82. data/project/app/views/layouts/application.html.erb +17 -0
  83. data/project/app/views/layouts/modal.html.erb +14 -0
  84. data/project/assets/images/.keep +0 -0
  85. data/project/assets/images/favicon.ico +0 -0
  86. data/project/assets/javascripts/controllers/home.coffee +15 -0
  87. data/project/assets/javascripts/pack.js +9 -0
  88. data/project/assets/stylesheets/config/variables.scss +876 -0
  89. data/project/assets/stylesheets/layout/basic.scss +6 -0
  90. data/project/assets/stylesheets/layout/carousel.scss +127 -0
  91. data/project/assets/stylesheets/layout/cover.scss +129 -0
  92. data/project/assets/stylesheets/lib/spacing.scss +55 -0
  93. data/project/assets/stylesheets/skin/style.scss +16 -0
  94. data/project/assets/stylesheets/style.scss +8 -0
  95. data/project/bin/bundle +3 -0
  96. data/project/bin/rails +9 -0
  97. data/project/bin/rake +9 -0
  98. data/project/bin/setup +32 -0
  99. data/project/bin/spring +15 -0
  100. data/project/config/application.rb +32 -0
  101. data/project/config/boot.rb +3 -0
  102. data/project/config/database.yml +19 -0
  103. data/project/config/environment.rb +5 -0
  104. data/project/config/environments/development.rb +67 -0
  105. data/project/config/environments/production.rb +93 -0
  106. data/project/config/environments/test.rb +42 -0
  107. data/project/config/initializers/assets.rb +11 -0
  108. data/project/config/initializers/backtrace_silencers.rb +7 -0
  109. data/project/config/initializers/cookies_serializer.rb +3 -0
  110. data/project/config/initializers/filter_parameter_logging.rb +4 -0
  111. data/project/config/initializers/inflections.rb +16 -0
  112. data/project/config/initializers/mime_types.rb +4 -0
  113. data/project/config/initializers/mustache.rb +7 -0
  114. data/project/config/initializers/rails_admin.rb +43 -0
  115. data/project/config/initializers/session_store.rb +3 -0
  116. data/project/config/initializers/simple_form.rb +177 -0
  117. data/project/config/initializers/wrap_parameters.rb +14 -0
  118. data/project/config/locales/en.yml +23 -0
  119. data/project/config/locales/simple_form.en.yml +31 -0
  120. data/project/config/routes.rb +13 -0
  121. data/project/config/secrets.yml +8 -0
  122. data/project/config/sitemap.rb +28 -0
  123. data/project/config.ru +4 -0
  124. data/project/db/migrate/20160728235100_create_conversions.rb +9 -0
  125. data/project/db/schema.rb +25 -0
  126. data/project/db/seeds.rb +7 -0
  127. data/project/lib/assets/.keep +0 -0
  128. data/project/lib/tasks/heroku.rake +70 -0
  129. data/project/log/.keep +0 -0
  130. data/project/log/development.log +48216 -0
  131. data/project/log/production.log +0 -0
  132. data/project/package.json +44 -0
  133. data/project/public/404.html +67 -0
  134. data/project/public/422.html +67 -0
  135. data/project/public/500.html +66 -0
  136. data/project/public/assets/javascripts/448c34a56d699c29117adc64c43affeb.woff2 +0 -0
  137. data/project/public/assets/javascripts/89889688147bd7575d6327160d64e760.svg +288 -0
  138. data/project/public/assets/javascripts/e18bbf611f2a2e43afc071aa2f4e1512.ttf +0 -0
  139. data/project/public/assets/javascripts/f4769f9bdb7466be65088239c12046d1.eot +0 -0
  140. data/project/public/assets/javascripts/fa2772327f55d8198301fdb8bcfc8158.woff +0 -0
  141. data/project/public/assets/javascripts/pack.js +31367 -0
  142. data/project/public/assets/javascripts/pack.js.map +1 -0
  143. data/project/public/assets/pack.js +17220 -0
  144. data/project/public/assets/style.css +7477 -0
  145. data/project/vendor/assets/javascripts/.keep +0 -0
  146. data/project/vendor/assets/stylesheets/.keep +0 -0
  147. data/project/webpack.config.js +67 -0
  148. data/test/helper.rb +34 -0
  149. data/test/test_minimum_viable_product.rb +7 -0
  150. metadata +473 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a78c97aaf8fc350fb702744057b73c16fafffd46
4
+ data.tar.gz: 58c602c862a77dcb0bc840c56c19f1a2b90d0877
5
+ SHA512:
6
+ metadata.gz: 67866bb1702604125a6a6fc0c454b477a3f9bfeb0874c7547b5088d46c3e325a581eb9f945357dd4472b746d7a36dab285b22ed8c2c6eb9f50737b599d438247
7
+ data.tar.gz: 4efc911bb55a71d2f3e0eb0164af90cc331a1058b612da0dd634417b986a6316e3786c1156a321de9eeea32bd591351eaa12497169cec34c643e49534bc07844
data/Gemfile ADDED
@@ -0,0 +1,30 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'carrierwave'
4
+ gem "cloudinary"
5
+ gem "geocoder"
6
+ gem 'faraday'
7
+ gem 'fog'
8
+ gem 'fog-aws'
9
+ gem "hashie"
10
+ gem "rack-canonical-host"
11
+ gem 'rack-ssl-enforcer'
12
+ gem 'rollbar'
13
+ gem 'sass-rails', '~> 5.0'
14
+ gem 'sitemap_generator'
15
+ gem 'slack-notifier'
16
+
17
+ group :development do
18
+ gem "byebug"
19
+ gem "better_errors"
20
+ gem "binding_of_caller"
21
+ gem "bullet"
22
+ gem "semantic"
23
+ gem 'web-console', '~> 2.0'
24
+ # gem 'spring'
25
+ # gem "shoulda", ">= 0"
26
+ # gem "rdoc", "~> 3.12"
27
+ # gem "bundler", "~> 1.0"
28
+ gem "jeweler", "~> 2.3.2"
29
+ # gem "simplecov", ">= 0"
30
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,329 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ CFPropertyList (2.3.5)
5
+ actionpack (5.0.1)
6
+ actionview (= 5.0.1)
7
+ activesupport (= 5.0.1)
8
+ rack (~> 2.0)
9
+ rack-test (~> 0.6.3)
10
+ rails-dom-testing (~> 2.0)
11
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
12
+ actionview (5.0.1)
13
+ activesupport (= 5.0.1)
14
+ builder (~> 3.1)
15
+ erubis (~> 2.7.0)
16
+ rails-dom-testing (~> 2.0)
17
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
18
+ activemodel (5.0.1)
19
+ activesupport (= 5.0.1)
20
+ activesupport (5.0.1)
21
+ concurrent-ruby (~> 1.0, >= 1.0.2)
22
+ i18n (~> 0.7)
23
+ minitest (~> 5.1)
24
+ tzinfo (~> 1.1)
25
+ addressable (2.5.0)
26
+ public_suffix (~> 2.0, >= 2.0.2)
27
+ aws_cf_signer (0.1.3)
28
+ better_errors (2.1.1)
29
+ coderay (>= 1.0.0)
30
+ erubis (>= 2.6.6)
31
+ rack (>= 0.9.0)
32
+ binding_of_caller (0.7.2)
33
+ debug_inspector (>= 0.0.1)
34
+ builder (3.2.3)
35
+ bullet (5.4.0)
36
+ activesupport (>= 3.0.0)
37
+ uniform_notifier (~> 1.10.0)
38
+ byebug (9.0.6)
39
+ carrierwave (1.0.0)
40
+ activemodel (>= 4.0.0)
41
+ activesupport (>= 4.0.0)
42
+ mime-types (>= 1.16)
43
+ cloudinary (1.5.2)
44
+ aws_cf_signer
45
+ json (~> 1.8)
46
+ rest-client (< 2.0)
47
+ coderay (1.1.1)
48
+ concurrent-ruby (1.0.4)
49
+ debug_inspector (0.0.2)
50
+ descendants_tracker (0.0.4)
51
+ thread_safe (~> 0.3, >= 0.3.1)
52
+ domain_name (0.5.20161129)
53
+ unf (>= 0.0.5, < 1.0.0)
54
+ erubis (2.7.0)
55
+ excon (0.55.0)
56
+ faraday (0.9.2)
57
+ multipart-post (>= 1.2, < 3)
58
+ fission (0.5.0)
59
+ CFPropertyList (~> 2.2)
60
+ fog (1.38.0)
61
+ fog-aliyun (>= 0.1.0)
62
+ fog-atmos
63
+ fog-aws (>= 0.6.0)
64
+ fog-brightbox (~> 0.4)
65
+ fog-cloudatcost (~> 0.1.0)
66
+ fog-core (~> 1.32)
67
+ fog-dynect (~> 0.0.2)
68
+ fog-ecloud (~> 0.1)
69
+ fog-google (<= 0.1.0)
70
+ fog-json
71
+ fog-local
72
+ fog-openstack
73
+ fog-powerdns (>= 0.1.1)
74
+ fog-profitbricks
75
+ fog-rackspace
76
+ fog-radosgw (>= 0.0.2)
77
+ fog-riakcs
78
+ fog-sakuracloud (>= 0.0.4)
79
+ fog-serverlove
80
+ fog-softlayer
81
+ fog-storm_on_demand
82
+ fog-terremark
83
+ fog-vmfusion
84
+ fog-voxel
85
+ fog-vsphere (>= 0.4.0)
86
+ fog-xenserver
87
+ fog-xml (~> 0.1.1)
88
+ ipaddress (~> 0.5)
89
+ fog-aliyun (0.1.0)
90
+ fog-core (~> 1.27)
91
+ fog-json (~> 1.0)
92
+ ipaddress (~> 0.8)
93
+ xml-simple (~> 1.1)
94
+ fog-atmos (0.1.0)
95
+ fog-core
96
+ fog-xml
97
+ fog-aws (1.2.0)
98
+ fog-core (~> 1.38)
99
+ fog-json (~> 1.0)
100
+ fog-xml (~> 0.1)
101
+ ipaddress (~> 0.8)
102
+ fog-brightbox (0.11.0)
103
+ fog-core (~> 1.22)
104
+ fog-json
105
+ inflecto (~> 0.0.2)
106
+ fog-cloudatcost (0.1.2)
107
+ fog-core (~> 1.36)
108
+ fog-json (~> 1.0)
109
+ fog-xml (~> 0.1)
110
+ ipaddress (~> 0.8)
111
+ fog-core (1.43.0)
112
+ builder
113
+ excon (~> 0.49)
114
+ formatador (~> 0.2)
115
+ fog-dynect (0.0.3)
116
+ fog-core
117
+ fog-json
118
+ fog-xml
119
+ fog-ecloud (0.3.0)
120
+ fog-core
121
+ fog-xml
122
+ fog-google (0.1.0)
123
+ fog-core
124
+ fog-json
125
+ fog-xml
126
+ fog-json (1.0.2)
127
+ fog-core (~> 1.0)
128
+ multi_json (~> 1.10)
129
+ fog-local (0.3.1)
130
+ fog-core (~> 1.27)
131
+ fog-openstack (0.1.19)
132
+ fog-core (>= 1.40)
133
+ fog-json (>= 1.0)
134
+ ipaddress (>= 0.8)
135
+ fog-powerdns (0.1.1)
136
+ fog-core (~> 1.27)
137
+ fog-json (~> 1.0)
138
+ fog-xml (~> 0.1)
139
+ fog-profitbricks (3.0.0)
140
+ fog-core (~> 1.42)
141
+ fog-json (~> 1.0)
142
+ fog-rackspace (0.1.4)
143
+ fog-core (>= 1.35)
144
+ fog-json (>= 1.0)
145
+ fog-xml (>= 0.1)
146
+ ipaddress (>= 0.8)
147
+ fog-radosgw (0.0.5)
148
+ fog-core (>= 1.21.0)
149
+ fog-json
150
+ fog-xml (>= 0.0.1)
151
+ fog-riakcs (0.1.0)
152
+ fog-core
153
+ fog-json
154
+ fog-xml
155
+ fog-sakuracloud (1.7.5)
156
+ fog-core
157
+ fog-json
158
+ fog-serverlove (0.1.2)
159
+ fog-core
160
+ fog-json
161
+ fog-softlayer (1.1.4)
162
+ fog-core
163
+ fog-json
164
+ fog-storm_on_demand (0.1.1)
165
+ fog-core
166
+ fog-json
167
+ fog-terremark (0.1.0)
168
+ fog-core
169
+ fog-xml
170
+ fog-vmfusion (0.1.0)
171
+ fission
172
+ fog-core
173
+ fog-voxel (0.1.0)
174
+ fog-core
175
+ fog-xml
176
+ fog-vsphere (1.7.1)
177
+ fog-core
178
+ rbvmomi (~> 1.9)
179
+ fog-xenserver (0.2.3)
180
+ fog-core
181
+ fog-xml
182
+ fog-xml (0.1.2)
183
+ fog-core
184
+ nokogiri (~> 1.5, >= 1.5.11)
185
+ formatador (0.2.5)
186
+ geocoder (1.4.3)
187
+ git (1.3.0)
188
+ github_api (0.11.3)
189
+ addressable (~> 2.3)
190
+ descendants_tracker (~> 0.0.1)
191
+ faraday (~> 0.8, < 0.10)
192
+ hashie (>= 1.2)
193
+ multi_json (>= 1.7.5, < 2.0)
194
+ nokogiri (~> 1.6.0)
195
+ oauth2
196
+ hashie (3.5.5)
197
+ highline (1.7.8)
198
+ http-cookie (1.0.3)
199
+ domain_name (~> 0.5)
200
+ i18n (0.8.1)
201
+ inflecto (0.0.2)
202
+ ipaddress (0.8.3)
203
+ jeweler (2.3.3)
204
+ builder
205
+ bundler (>= 1.0)
206
+ git (>= 1.2.5)
207
+ github_api (~> 0.11.0)
208
+ highline (>= 1.6.15)
209
+ nokogiri (>= 1.5.10)
210
+ psych (~> 2.2)
211
+ rake
212
+ rdoc
213
+ semver2
214
+ json (1.8.6)
215
+ jwt (1.5.6)
216
+ loofah (2.0.3)
217
+ nokogiri (>= 1.5.9)
218
+ method_source (0.8.2)
219
+ mime-types (2.99.3)
220
+ mini_portile2 (2.1.0)
221
+ minitest (5.10.1)
222
+ multi_json (1.12.1)
223
+ multi_xml (0.6.0)
224
+ multipart-post (2.0.0)
225
+ netrc (0.11.0)
226
+ nokogiri (1.6.8.1)
227
+ mini_portile2 (~> 2.1.0)
228
+ oauth2 (1.3.0)
229
+ faraday (>= 0.8, < 0.11)
230
+ jwt (~> 1.0)
231
+ multi_json (~> 1.3)
232
+ multi_xml (~> 0.5)
233
+ rack (>= 1.2, < 3)
234
+ psych (2.2.4)
235
+ public_suffix (2.0.5)
236
+ rack (2.0.1)
237
+ rack-canonical-host (0.2.2)
238
+ addressable (> 0, < 3)
239
+ rack (>= 1.0.0, < 3)
240
+ rack-ssl-enforcer (0.2.9)
241
+ rack-test (0.6.3)
242
+ rack (>= 1.0)
243
+ rails-dom-testing (2.0.2)
244
+ activesupport (>= 4.2.0, < 6.0)
245
+ nokogiri (~> 1.6)
246
+ rails-html-sanitizer (1.0.3)
247
+ loofah (~> 2.0)
248
+ railties (5.0.1)
249
+ actionpack (= 5.0.1)
250
+ activesupport (= 5.0.1)
251
+ method_source
252
+ rake (>= 0.8.7)
253
+ thor (>= 0.18.1, < 2.0)
254
+ rake (12.0.0)
255
+ rbvmomi (1.9.4)
256
+ builder (~> 3.2)
257
+ json (>= 1.8)
258
+ nokogiri (~> 1.5)
259
+ trollop (~> 2.1)
260
+ rdoc (5.1.0)
261
+ rest-client (1.8.0)
262
+ http-cookie (>= 1.0.2, < 2.0)
263
+ mime-types (>= 1.16, < 3.0)
264
+ netrc (~> 0.7)
265
+ rollbar (2.14.0)
266
+ multi_json
267
+ sass (3.4.23)
268
+ sass-rails (5.0.6)
269
+ railties (>= 4.0.0, < 6)
270
+ sass (~> 3.1)
271
+ sprockets (>= 2.8, < 4.0)
272
+ sprockets-rails (>= 2.0, < 4.0)
273
+ tilt (>= 1.1, < 3)
274
+ semantic (1.6.0)
275
+ semver2 (3.4.2)
276
+ sitemap_generator (5.3.0)
277
+ builder (~> 3.0)
278
+ slack-notifier (2.0.0)
279
+ sprockets (3.7.1)
280
+ concurrent-ruby (~> 1.0)
281
+ rack (> 1, < 3)
282
+ sprockets-rails (3.2.0)
283
+ actionpack (>= 4.0)
284
+ activesupport (>= 4.0)
285
+ sprockets (>= 3.0.0)
286
+ thor (0.19.4)
287
+ thread_safe (0.3.6)
288
+ tilt (2.0.6)
289
+ trollop (2.1.2)
290
+ tzinfo (1.2.2)
291
+ thread_safe (~> 0.1)
292
+ unf (0.1.4)
293
+ unf_ext
294
+ unf_ext (0.0.7.2)
295
+ uniform_notifier (1.10.0)
296
+ web-console (2.3.0)
297
+ activemodel (>= 4.0)
298
+ binding_of_caller (>= 0.7.2)
299
+ railties (>= 4.0)
300
+ sprockets-rails (>= 2.0, < 4.0)
301
+ xml-simple (1.1.5)
302
+
303
+ PLATFORMS
304
+ ruby
305
+
306
+ DEPENDENCIES
307
+ better_errors
308
+ binding_of_caller
309
+ bullet
310
+ byebug
311
+ carrierwave
312
+ cloudinary
313
+ faraday
314
+ fog
315
+ fog-aws
316
+ geocoder
317
+ hashie
318
+ jeweler (~> 2.3.2)
319
+ rack-canonical-host
320
+ rack-ssl-enforcer
321
+ rollbar
322
+ sass-rails (~> 5.0)
323
+ semantic
324
+ sitemap_generator
325
+ slack-notifier
326
+ web-console (~> 2.0)
327
+
328
+ BUNDLED WITH
329
+ 1.14.3
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2016 Ian Hunter
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2016 Ian Hunter
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,134 @@
1
+ # Installation
2
+
3
+ Install the mvp gem:
4
+
5
+ ```
6
+ gem install minimum_viable_product
7
+ ```
8
+
9
+ Then setup your project:
10
+
11
+ ```
12
+ mvp new PROJECT
13
+ ```
14
+
15
+ # Setup
16
+
17
+ ## `.env`
18
+
19
+ Set your `.env` file up with your own variables
20
+
21
+ ```
22
+ ROLLBAR_CLIENT_ACCESS_TOKEN=
23
+ ROLLBAR_SERVER_ACCESS_TOKEN=
24
+ SEGMENT_WRITE_KEY=
25
+ SLACK_WEBHOOK_URL=
26
+ SLACK_POST_USERNAME=
27
+ FACEBOOK_TRACKING_ID=
28
+ AMPLITUDE_API_KEY=
29
+ HOST_DOMAIN=localhost
30
+ HOST_PORT=3000
31
+ HOST_PROTOCOL=http
32
+ GOOGLE_ANALYTICS_ID=
33
+ HOTJAR_ID=
34
+ AWS_ACCESS_KEY_ID=
35
+ AWS_SECRET_ACCESS_KEY=
36
+ AWS_S3_BUCKET=
37
+ SPOOF_IP=true
38
+ ```
39
+
40
+ ## Heroku
41
+
42
+ To setup deployment for heroku, first create the project:
43
+
44
+ ```
45
+ heroku create PROJECT
46
+ ```
47
+
48
+ You're probably going to want Database backups. This will let you use `rake db:import`
49
+
50
+ ```
51
+ heroku pg:backups capture
52
+ ```
53
+
54
+ You're also going to need to setup the buildpacks
55
+
56
+ ```
57
+ heroku buildpacks:set heroku/ruby
58
+ heroku buildpacks:add --index 1 heroku/nodejs
59
+ ```
60
+
61
+ Make sure to turn off npm cacheing (since we're loading MVP from a repo)
62
+
63
+ ```
64
+ heroku config:set NODE_MODULES_CACHE=false
65
+ ```
66
+
67
+ Add a scheduled task to update your sitemaps:
68
+
69
+ ```
70
+ heroku addons:create scheduler:standard
71
+ heroku addons:open scheduler
72
+ ```
73
+
74
+ Add the following task: `rake sitemap:worker`. Your choice on the frequency but I usually use `daily`
75
+
76
+ # SEO
77
+
78
+ ## Meta Properties
79
+
80
+ All meta fields are controlled via the `page` object. Set attributes on this in order to get meta properties populated. This is best done at the controller level.
81
+
82
+ ### Available Properties
83
+
84
+ |Property|Description|Inheritance|
85
+ |---|---|---|
86
+ |`page.title`| | |
87
+ |`page.description`| | |
88
+ |`page.author`| | |
89
+ |`page.og_url`| | |
90
+ |`page.og_type`| | |
91
+ |`page.og_title`| |`page.title`|
92
+ |`page.og_description`| |`page.description`|
93
+ |`page.og_image`| | |
94
+ |`page.twitter_card`| | | |
95
+
96
+ ## Sitemaps
97
+
98
+ ### Setup
99
+
100
+ Edit `config/sitemap.rb` with your own custom routes.
101
+
102
+ ### Updating
103
+
104
+ Run `sitemap:refresh` in production to update Bing/Google with changes to the sitemap.
105
+
106
+ Put this in a `cron` task or in Heroku Scheduler.
107
+
108
+ # Helpers
109
+
110
+ ## Geolocation
111
+
112
+ By default, Geolocation of the session will automatically happen.
113
+
114
+ You can access the session's geolocation in `request.location`.
115
+
116
+ To test geolocation locally, set `SPOOF_IP=true` in your `.env`.
117
+
118
+ For more info see [Geocoder](https://github.com/alexreisner/geocoder).
119
+
120
+ ## Bootstrap
121
+
122
+ ### `row_groups_of`
123
+
124
+ Makes a series of row/col `div` elements based in group count.
125
+
126
+ ```
127
+ <% row_groups_of(3, [1,2,3,4,5,6,7,8,9]) do |i| %>
128
+ <div class="panel panel-default">
129
+ <div class="panel-heading">
130
+ <h2 class="text-center"><%= i %></h2>
131
+ </div>
132
+ </div>
133
+ <% end %>
134
+ ```
data/Rakefile ADDED
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
17
+ gem.name = "mvpkit"
18
+ gem.homepage = "http://github.com/ian/mvp"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{The start-to-finish 3 minute product platform}
21
+ gem.description = %Q{Built for Developers. Ideal for MVPs, product ideation and validation.}
22
+ gem.email = "ianhunter@gmail.com"
23
+ gem.authors = ["Ian Hunter"]
24
+ gem.executables = []
25
+ # dependencies defined in Gemfile
26
+ end
27
+ Jeweler::RubygemsDotOrgTasks.new
28
+
29
+ require 'rake/testtask'
30
+ Rake::TestTask.new(:test) do |test|
31
+ test.libs << 'lib' << 'test'
32
+ test.pattern = 'test/**/test_*.rb'
33
+ test.verbose = true
34
+ end
35
+
36
+ desc "Code coverage detail"
37
+ task :simplecov do
38
+ ENV['COVERAGE'] = "true"
39
+ Rake::Task['test'].execute
40
+ end
41
+
42
+ task :default => :test
43
+
44
+ require 'rdoc/task'
45
+ Rake::RDocTask.new do |rdoc|
46
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
47
+
48
+ rdoc.rdoc_dir = 'rdoc'
49
+ rdoc.title = "MVP #{version}"
50
+ rdoc.rdoc_files.include('README*')
51
+ rdoc.rdoc_files.include('lib/**/*.rb')
52
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.8.0
@@ -0,0 +1 @@
1
+ console.log("MVP Loaded")
File without changes
@@ -0,0 +1,78 @@
1
+ module MVP
2
+ module AnalyticsConcern
3
+ extend ActiveSupport::Concern
4
+
5
+ INVISIBLE_SESSION_COOKIE = 'invisible'
6
+
7
+ included do
8
+ before_action :generate_uid_if_not_set
9
+ helper_method :analytics_id
10
+ helper_method :analytics_identify_events
11
+ helper_method :analytics_track_events
12
+ end
13
+
14
+ def identify!(id, properties={})
15
+ return if session[INVISIBLE_SESSION_COOKIE].to_b == true
16
+
17
+ events = flash['__analytics_identify_events'] ||= []
18
+ events << {
19
+ 'id': id,
20
+ 'properties': properties
21
+ }
22
+ flash['__analytics_identify_events'] = events
23
+ end
24
+
25
+ def track!(event, properties={})
26
+ return if session[INVISIBLE_SESSION_COOKIE].to_b == true
27
+
28
+ events = flash['__analytics_track_events'] ||= []
29
+ events << {
30
+ 'name': event,
31
+ 'properties': properties.reverse_merge({
32
+ iteration: MVP::Iteration.version,
33
+ user: current_user.try(:name),
34
+ url: request.fullpath
35
+ })
36
+ }
37
+ flash['__analytics_track_events'] = events
38
+ end
39
+
40
+ def slack!(message, properties=nil)
41
+ if ENV['SLACK_WEBHOOK_URL']
42
+ _msg = [message]
43
+ _msg << properties.inspect if properties
44
+
45
+ begin
46
+ slack_notifier.ping _msg.join(' ')
47
+ rescue
48
+ slack_notifier.ping "Tried to use slack messaging but failure happened"
49
+ end
50
+ end
51
+ end
52
+
53
+ def analytics_identify_events
54
+ flash['__analytics_identify_events'] ||= []
55
+ flash['__analytics_identify_events']
56
+ end
57
+
58
+ def analytics_track_events
59
+ flash['__analytics_track_events'] ||= []
60
+ flash['__analytics_track_events']
61
+ end
62
+
63
+ private
64
+
65
+ def slack_notifier
66
+ Slack::Notifier.new ENV['SLACK_WEBHOOK_URL'], channel: ENV['SLACK_POST_CHANNEL'],
67
+ username: ENV['SLACK_POST_USERNAME']
68
+ end
69
+
70
+ def analytics_id
71
+ cookies[:uid]
72
+ end
73
+
74
+ def generate_uid_if_not_set
75
+ cookies[:uid] = SecureRandom.uuid unless cookies[:uid].present?
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,25 @@
1
+ module MVP
2
+ module SEOConcern
3
+ extend ActiveSupport::Concern
4
+
5
+ private
6
+
7
+ included do
8
+ before_action :force_no_trailing_slash
9
+ helper_method :page
10
+ end
11
+
12
+ def force_no_trailing_slash
13
+ return if request.path == '/'
14
+ redirect_to request.original_url.gsub(/\/$/,'') if request.original_url.match(/\/$/)
15
+ end
16
+
17
+ def page
18
+ @page ||= begin
19
+ h = Hashie::Mash.new
20
+ h.classes = []
21
+ h
22
+ end
23
+ end
24
+ end
25
+ end