locomotivecms_steam 1.0.0.pre.beta.2 → 1.0.0.pre.beta.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +7 -1
  3. data/Gemfile.lock +22 -12
  4. data/bin/steam.rb +21 -7
  5. data/lib/locomotive/steam/adapters/mongodb.rb +1 -1
  6. data/lib/locomotive/steam/adapters/mongodb/query.rb +6 -0
  7. data/lib/locomotive/steam/configuration.rb +9 -0
  8. data/lib/locomotive/steam/errors.rb +3 -0
  9. data/lib/locomotive/steam/liquid/drops/content_types.rb +20 -2
  10. data/lib/locomotive/steam/liquid/filters/json.rb +42 -0
  11. data/lib/locomotive/steam/liquid/filters/misc.rb +4 -0
  12. data/lib/locomotive/steam/liquid/filters/number.rb +51 -0
  13. data/lib/locomotive/steam/liquid/tags/concerns/i18n_page.rb +0 -9
  14. data/lib/locomotive/steam/liquid/tags/concerns/path.rb +1 -1
  15. data/lib/locomotive/steam/liquid/tags/editable.rb +1 -0
  16. data/lib/locomotive/steam/liquid/tags/editable/base.rb +3 -1
  17. data/lib/locomotive/steam/liquid/tags/editable/model.rb +19 -0
  18. data/lib/locomotive/steam/liquid/tags/inherited_block.rb +25 -1
  19. data/lib/locomotive/steam/middlewares/site.rb +9 -5
  20. data/lib/locomotive/steam/models/entity.rb +9 -8
  21. data/lib/locomotive/steam/models/mapper.rb +22 -6
  22. data/lib/locomotive/steam/repositories/content_entry_repository.rb +15 -1
  23. data/lib/locomotive/steam/repositories/content_type_field_select_option_repository.rb +4 -0
  24. data/lib/locomotive/steam/repositories/page_repository.rb +7 -0
  25. data/lib/locomotive/steam/repositories/site_repository.rb +1 -2
  26. data/lib/locomotive/steam/server.rb +7 -0
  27. data/lib/locomotive/steam/services.rb +10 -11
  28. data/lib/locomotive/steam/services/page_finder_service.rb +21 -0
  29. data/lib/locomotive/steam/version.rb +1 -1
  30. data/spec/integration/repositories/content_entry_repository_spec.rb +5 -0
  31. data/spec/integration/repositories/page_repository_spec.rb +5 -0
  32. data/spec/support/liquid.rb +11 -0
  33. data/spec/unit/liquid/filters/json_spec.rb +57 -0
  34. data/spec/unit/liquid/filters/misc_spec.rb +14 -0
  35. data/spec/unit/liquid/filters/number_spec.rb +100 -0
  36. data/spec/unit/liquid/tags/editable/model_spec.rb +84 -0
  37. data/spec/unit/liquid/tags/inherited_block_spec.rb +13 -0
  38. data/spec/unit/liquid/tags/link_to_spec.rb +2 -2
  39. data/spec/unit/liquid/tags/path_to_spec.rb +3 -3
  40. data/spec/unit/middlewares/site_spec.rb +43 -0
  41. data/spec/unit/repositories/content_entry_repository_spec.rb +13 -12
  42. data/spec/unit/services_spec.rb +23 -1
  43. metadata +13 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a200877da9098d215eb31f61067aa85e17cdd031
4
- data.tar.gz: 7e4a6550691aa4d42578e19471457148004791d4
3
+ metadata.gz: afc4338f5582de4d66788ef18ebb8d1d8d3d024d
4
+ data.tar.gz: 457d04823de496fc46c507f64d3b1e1313c7a6dd
5
5
  SHA512:
6
- metadata.gz: 35c4e6ef24a93b95c0a302174bac850a28283cb8a2efb231a0e0fa7398009654c5fa2f9bb0bd87a6c12dd59556e6510a860762a02ab3943830b078306035d15d
7
- data.tar.gz: a7f438df4b3685f1da9accf8874fcc1fc18a29f141c29367acb1df52dfaae08027f0143a4a9be61ddb9424cd840656a1adbae92a83355ced83b5036938e05d33
6
+ metadata.gz: 38071d83a98a7e53dd81591d58f7a3b035ac244b563e2077b115ba939cddbb4b55a54ee77e60f361dde5352fe5fd14cf8547229a95116416b43189999cb9619d
7
+ data.tar.gz: 7378ea6a8eeda23d69bac0991d430dcaa4abed935598aca30294ba5f6a60097058b7e8f0e20a727f18c61814447a47f426278b68c249c0525e20b3c71cb204e1
data/Gemfile CHANGED
@@ -7,9 +7,15 @@ group :development do
7
7
  # gem 'locomotivecms_models', '~> 0.0.1', path: '../models'
8
8
  # gem 'locomotivecms_models', '0.0.1.pre.alpha'
9
9
  # gem 'locomotivecms-liquid', path: '/Users/didier/Documents/LocomotiveCMS/gems/liquid'
10
- gem 'thin'
10
+ # gem 'thin'
11
+ gem 'puma'
11
12
  # gem 'sprockets-sass', '~> 1.2.0'
12
13
  gem 'yui-compressor', '~> 0.12.0'
14
+
15
+ gem 'rack-mini-profiler'
16
+ gem 'flamegraph'
17
+ gem 'stackprof' # ruby 2.1+ only
18
+ gem 'memory_profiler'
13
19
  end
14
20
 
15
21
  group :test do
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- locomotivecms_steam (1.0.0.pre.beta.2)
4
+ locomotivecms_steam (1.0.0.pre.beta.3)
5
5
  RedCloth (~> 4.2.9)
6
6
  chronic (~> 0.10.2)
7
7
  coffee-script (~> 2.4.1)
@@ -28,7 +28,7 @@ GEM
28
28
  remote: https://rubygems.org/
29
29
  specs:
30
30
  RedCloth (4.2.9)
31
- activesupport (4.2.3)
31
+ activesupport (4.2.4)
32
32
  i18n (~> 0.7)
33
33
  json (~> 1.7, >= 1.7.7)
34
34
  minitest (~> 5.1)
@@ -70,7 +70,6 @@ GEM
70
70
  term-ansicolor (~> 1.3)
71
71
  thor (~> 0.19.1)
72
72
  crass (1.0.2)
73
- daemons (1.2.2)
74
73
  diff-lcs (1.2.5)
75
74
  docile (1.1.5)
76
75
  domain_name (0.5.24)
@@ -79,9 +78,13 @@ GEM
79
78
  addressable (~> 2.3)
80
79
  multi_json (~> 1.0)
81
80
  rack (>= 1.3.0)
82
- eventmachine (1.0.7)
83
- execjs (2.5.2)
81
+ execjs (2.6.0)
82
+ fast_stack (0.1.0)
83
+ rake
84
+ rake-compiler
84
85
  ffi (1.9.10)
86
+ flamegraph (0.1.0)
87
+ fast_stack
85
88
  haml (4.0.7)
86
89
  tilt
87
90
  hike (1.2.3)
@@ -109,11 +112,12 @@ GEM
109
112
  activesupport (~> 4.2.1)
110
113
  colorize
111
114
  stringex (~> 2.5.2)
115
+ memory_profiler (0.9.4)
112
116
  method_source (0.8.2)
113
117
  mime-types (2.6.1)
114
118
  mimetype-fu (0.1.2)
115
119
  mini_portile (0.6.2)
116
- minitest (5.7.0)
120
+ minitest (5.8.0)
117
121
  moneta (0.8.0)
118
122
  moped (2.0.6)
119
123
  bson (~> 3.0)
@@ -136,15 +140,20 @@ GEM
136
140
  pry-byebug (3.1.0)
137
141
  byebug (~> 4.0)
138
142
  pry (~> 0.10)
143
+ puma (2.12.3)
139
144
  rack (1.6.1)
140
145
  rack-cache (1.2)
141
146
  rack (>= 0.4)
147
+ rack-mini-profiler (0.9.7)
148
+ rack (>= 1.1.3)
142
149
  rack-rewrite (1.5.1)
143
150
  rack-test (0.6.3)
144
151
  rack (>= 1.0)
145
152
  rack_csrf (2.5.0)
146
153
  rack (>= 1.1.0)
147
154
  rake (10.4.2)
155
+ rake-compiler (0.9.5)
156
+ rake
148
157
  rb-fsevent (0.9.5)
149
158
  rb-inotify (0.9.5)
150
159
  ffi (>= 0.5.0)
@@ -169,7 +178,7 @@ GEM
169
178
  crass (~> 1.0.2)
170
179
  nokogiri (>= 1.4.4)
171
180
  nokogumbo (= 1.4.1)
172
- sass (3.4.16)
181
+ sass (3.4.18)
173
182
  simplecov (0.10.0)
174
183
  docile (~> 1.1.0)
175
184
  json (~> 1.8)
@@ -187,13 +196,10 @@ GEM
187
196
  sprockets-sass (1.3.1)
188
197
  sprockets (~> 2.0)
189
198
  tilt (~> 1.1)
199
+ stackprof (0.2.7)
190
200
  stringex (2.5.2)
191
201
  term-ansicolor (1.3.0)
192
202
  tins (~> 1.0)
193
- thin (1.6.3)
194
- daemons (~> 1.0, >= 1.0.9)
195
- eventmachine (~> 1.0)
196
- rack (~> 1.0)
197
203
  thor (0.19.1)
198
204
  thread_safe (0.3.5)
199
205
  tilt (1.4.1)
@@ -213,15 +219,19 @@ DEPENDENCIES
213
219
  bundler (~> 1.7)
214
220
  codeclimate-test-reporter (~> 0.4.7)
215
221
  coveralls (~> 0.8.1)
222
+ flamegraph
216
223
  i18n-spec (~> 0.6.0)
217
224
  json_spec (~> 1.1.4)
218
225
  locomotivecms_steam!
226
+ memory_profiler
219
227
  moped (~> 2.0.6)
220
228
  origin (~> 2.1.1)
221
229
  pry-byebug (~> 3.1.0)
230
+ puma
231
+ rack-mini-profiler
222
232
  rack-test (~> 0.6.3)
223
233
  rake (~> 10.4.2)
224
234
  rspec (~> 3.3.0)
225
- thin
235
+ stackprof
226
236
  timecop (~> 0.7.4)
227
237
  yui-compressor (~> 0.12.0)
data/bin/steam.rb CHANGED
@@ -5,10 +5,9 @@ require 'bundler/setup'
5
5
 
6
6
  Bundler.require
7
7
 
8
- require 'thin'
9
8
  require 'optparse'
10
9
 
11
- server_options = { address: 'localhost', port: 8080 }
10
+ server_options = { address: '0.0.0.0', port: 8080 }
12
11
 
13
12
  options = {
14
13
  adapter: {
@@ -85,13 +84,28 @@ end
85
84
 
86
85
  app = Locomotive::Steam::Server.to_app
87
86
 
87
+ # Thin rack handler
88
88
  # Note: alt thin settings (Threaded)
89
- server = Thin::Server.new(server_options[:address], server_options[:port], app)
90
- server.threaded = true
91
- server.start
89
+ # require 'thin'
90
+ # server = Thin::Server.new(server_options[:address], server_options[:port], app)
91
+ # server.threaded = true
92
+ # server.start
93
+ # Locomotive::Common::Logger.info 'Server started...'
92
94
  # FIXME: Rack::Handler::Thin.run app (not threaded)
93
95
 
94
96
  # WEBRick rack handler
95
97
  # Rack::Handler::WEBrick.run app
96
-
97
- Locomotive::Common::Logger.info 'Server started...'
98
+ # Locomotive::Common::Logger.info 'Server started...'
99
+
100
+ # Puma rack handler
101
+ require 'puma'
102
+ server = ::Puma::Server.new(app)
103
+ server.add_tcp_listener server_options[:address], server_options[:port]
104
+ server.min_threads = 4
105
+ server.max_threads = 16
106
+ begin
107
+ Locomotive::Common::Logger.info 'Server started...'
108
+ server.run.join
109
+ rescue Interrupt
110
+ server.stop(true)
111
+ end
@@ -80,7 +80,7 @@ module Locomotive::Steam
80
80
  end
81
81
 
82
82
  def session
83
- if uri
83
+ Thread.current[:moped_session] ||= if uri
84
84
  Moped::Session.connect(uri)
85
85
  else
86
86
  Moped::Session.new([*hosts]).tap do |session|
@@ -59,6 +59,12 @@ module Locomotive::Steam
59
59
  build_origin_query.only(@fields).where(@criteria).order_by(*@sort)
60
60
  end
61
61
 
62
+ def key(name, operator)
63
+ :"#{name}".send(operator.to_sym)
64
+ end
65
+
66
+ alias :k :key
67
+
62
68
  private
63
69
 
64
70
  def build_origin_query
@@ -93,6 +93,15 @@ module Locomotive
93
93
  attr_accessor :moneta
94
94
  def moneta; @moneta.nil? ? { store: Moneta.new(:Memory, expires: true) } : @moneta; end
95
95
 
96
+ # Render a 404 page if no site has been found.
97
+ # If Steam is embedded in another app, it's better to let the app handle
98
+ # the no site case.
99
+ #
100
+ # default: true
101
+ #
102
+ attr_accessor :render_404_if_no_site
103
+ def render_404_if_no_site; @render_404_if_no_site.nil? ? true : @render_404_if_no_site; end
104
+
96
105
  # Lambda called once a Services instance has been built.
97
106
  # It is used when we want to change one of the services
98
107
  #
@@ -1,5 +1,8 @@
1
1
  module Locomotive::Steam
2
2
 
3
+ class NoSiteException < ::Exception
4
+ end
5
+
3
6
  class RenderError < ::StandardError
4
7
 
5
8
  LINES_RANGE = 10
@@ -5,9 +5,27 @@ module Locomotive
5
5
  class ContentTypes < ::Liquid::Drop
6
6
 
7
7
  def before_method(meth)
8
- repository = @context.registers[:services].repositories.content_type
8
+ fetch_content_type(meth.to_s)
9
+ end
10
+
11
+ private
12
+
13
+ def repository
14
+ @context.registers[:services].repositories.content_type
15
+ end
16
+
17
+ def fetch_content_type(slug)
18
+ @content_type_map ||= {}
19
+
20
+ if !@content_type_map.include?(slug)
21
+ @content_type_map[slug] = _fetch_content_type(slug)
22
+ end
23
+
24
+ @content_type_map[slug]
25
+ end
9
26
 
10
- if content_type = repository.by_slug(meth.to_s)
27
+ def _fetch_content_type(slug)
28
+ if content_type = repository.by_slug(slug)
11
29
  ContentEntryCollection.new(content_type)
12
30
  else
13
31
  nil
@@ -0,0 +1,42 @@
1
+ module Locomotive
2
+ module Steam
3
+ module Liquid
4
+ module Filters
5
+ module Json
6
+
7
+ def json(input, fields = nil)
8
+ if fields && fields.is_a?(String)
9
+ fields = fields.split(',').map(&:strip)
10
+ end
11
+
12
+ if fields.blank?
13
+ input.to_json
14
+ elsif input.respond_to?(:each)
15
+ if fields.size == 1
16
+ input.map { |object| object[fields.first].to_json }.join(',')
17
+ else
18
+ input.map { |object| "{" + object_to_json(object, fields) + "}" }.join(',')
19
+ end
20
+ else
21
+ object_to_json(input, fields)
22
+ end
23
+ end
24
+
25
+ protected
26
+
27
+ def object_to_json(input, fields)
28
+ [].tap do |output|
29
+ fields.each do |field|
30
+ output << %("#{field}":#{input[field].to_json})
31
+ end
32
+ end.join(',')
33
+ end
34
+
35
+ end
36
+
37
+ ::Liquid::Template.register_filter(Json)
38
+
39
+ end
40
+ end
41
+ end
42
+ end
@@ -40,6 +40,10 @@ module Locomotive
40
40
 
41
41
  end
42
42
 
43
+ def hexdigest(input, key, digest = nil)
44
+ OpenSSL::HMAC.hexdigest(digest || 'sha1', key, input)
45
+ end
46
+
43
47
  end
44
48
 
45
49
  ::Liquid::Template.register_filter(Misc)
@@ -0,0 +1,51 @@
1
+ module Locomotive
2
+ module Steam
3
+ module Liquid
4
+ module Filters
5
+ module Number
6
+
7
+ def money(input, *options)
8
+ NumberProxyHelper.new(:currency, @context).invoke(input, options)
9
+ end
10
+
11
+ def percentage(input, *options)
12
+ NumberProxyHelper.new(:percentage, @context).invoke(input, options)
13
+ end
14
+
15
+ def mod(input, modulus)
16
+ input.to_i % modulus.to_i
17
+ end
18
+
19
+ class NumberProxyHelper
20
+
21
+ include ActiveSupport::NumberHelper
22
+
23
+ def initialize(name, context)
24
+ @name = name
25
+ @context = context
26
+ end
27
+
28
+ def invoke(input, options)
29
+ _options = parse_and_interpolate_options(options)
30
+ send :"number_to_#{@name}", input, _options
31
+ end
32
+
33
+ def parse_and_interpolate_options(string_or_array)
34
+ return {} if string_or_array.empty?
35
+
36
+ string = [*string_or_array].flatten.join(', ')
37
+ arguments = Solid::Arguments.parse(string)
38
+
39
+ (arguments.interpolate(@context).first || {})
40
+ end
41
+
42
+ end
43
+
44
+ ::Liquid::Template.register_filter(Number)
45
+
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+ end
@@ -18,15 +18,6 @@ module Locomotive
18
18
  end
19
19
  end
20
20
 
21
- # def build_fullpath(page)
22
- # services.url_builder.url_for(page, locale).tap do |fullpath|
23
- # if page.templatized?
24
- # entry = page.send(:_source).content_entry
25
- # fullpath.gsub!('content_type_template', entry._slug)
26
- # end
27
- # end
28
- # end
29
-
30
21
  end
31
22
 
32
23
  end
@@ -66,7 +66,7 @@ module Locomotive
66
66
  end
67
67
 
68
68
  def _retrieve_page_drop_from(handle)
69
- if page = repository.by_handle(handle)
69
+ if page = services.page_finder.by_handle(handle)
70
70
  page.to_liquid.tap { |d| d.context = @context }
71
71
  end
72
72
  end
@@ -2,3 +2,4 @@ require_relative 'editable/base'
2
2
  require_relative 'editable/text'
3
3
  require_relative 'editable/file'
4
4
  require_relative 'editable/control'
5
+ require_relative 'editable/model'
@@ -27,10 +27,12 @@ module Locomotive
27
27
  end
28
28
  end
29
29
 
30
+ alias :default_render :render
31
+
30
32
  def render(context)
31
33
  service = context.registers[:services].editable_element
32
34
  page = context.registers[:page]
33
- block = context['block'].try(:name)
35
+ block = @element_options[:block] || context['block'].try(:name)
34
36
 
35
37
  if element = service.find(page, block, @slug)
36
38
  render_element(context, element)
@@ -0,0 +1,19 @@
1
+ module Locomotive
2
+ module Steam
3
+ module Liquid
4
+ module Tags
5
+ module Editable
6
+ class Model < Base
7
+
8
+ def render(context)
9
+ default_render(context)
10
+ end
11
+
12
+ end
13
+
14
+ ::Liquid::Template.register_tag('editable_model'.freeze, Model)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end