mvpkit 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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