noodles 0.0.1 → 0.0.6

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.travis.yml +10 -0
  4. data/Gemfile +1 -0
  5. data/LICENSE.txt +1 -1
  6. data/README.md +9 -1
  7. data/Rakefile +10 -0
  8. data/bin/noodles +2 -0
  9. data/cli/noodles_cli.rb +92 -0
  10. data/cli/template/.gitignore +0 -0
  11. data/cli/template/Gemfile +6 -0
  12. data/cli/template/app/controllers/.keep +0 -0
  13. data/cli/template/app/handlers/.keep +0 -0
  14. data/cli/template/app/templates/.keep +0 -0
  15. data/cli/template/app/views/.keep +0 -0
  16. data/cli/template/config.ru +12 -0
  17. data/cli/template/config/application.rb +7 -0
  18. data/cli/template/config/router.rb +2 -0
  19. data/cli/template/config/secrets.yml +7 -0
  20. data/cli/template/config/setup.rb +3 -0
  21. data/cli/template/public/css/.keep +0 -0
  22. data/cli/template/public/images/.keep +0 -0
  23. data/cli/template/public/js/.keep +0 -0
  24. data/lib/noodles.rb +51 -3
  25. data/lib/noodles/application.rb +23 -0
  26. data/lib/noodles/cache.rb +6 -0
  27. data/lib/noodles/dependencies.rb +12 -0
  28. data/lib/noodles/environment.rb +47 -0
  29. data/lib/noodles/http/application.rb +34 -0
  30. data/lib/noodles/http/controller.rb +106 -0
  31. data/lib/noodles/http/errors/no_router_error.rb +9 -0
  32. data/lib/noodles/http/router.rb +81 -0
  33. data/lib/noodles/http/view.rb +6 -0
  34. data/lib/noodles/utils.rb +8 -0
  35. data/lib/noodles/version.rb +1 -1
  36. data/lib/noodles/websocket/application.rb +14 -0
  37. data/lib/noodles/websocket/channel.rb +22 -0
  38. data/lib/noodles/websocket/handler.rb +47 -0
  39. data/lib/noodles/websocket/routing.rb +12 -0
  40. data/noodles.gemspec +22 -6
  41. data/test/secrets.yml +11 -0
  42. data/test/templates/current_user_temp.erb +1 -0
  43. data/test/templates/current_user_temp.haml +1 -0
  44. data/test/templates/current_user_temp.slim +1 -0
  45. data/test/templates/index.haml +2 -0
  46. data/test/templates/index.slim +2 -0
  47. data/test/templates/layout.haml +3 -0
  48. data/test/templates/show.erb +1 -0
  49. data/test/templates/with_variables.erb +2 -0
  50. data/test/templates/with_variables.haml +2 -0
  51. data/test/templates/with_variables.slim +2 -0
  52. data/test/test_application.rb +299 -0
  53. data/test/test_cache.rb +66 -0
  54. data/test/test_environment.rb +24 -0
  55. data/test/test_helper.rb +10 -0
  56. data/test/test_secrets.rb +24 -0
  57. metadata +271 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: de3e5bdbbc141a6e9ac7eee7c5691aa57bec8d0e
4
- data.tar.gz: f8efbd60ed342320df23077afd54701795e9df7e
3
+ metadata.gz: a896063e69e7bb35bc1e1cf23c8100d421d408d6
4
+ data.tar.gz: 1282c8f3b37bef8dddada044f10f81ff8f6a1472
5
5
  SHA512:
6
- metadata.gz: 26ba3e682b7b71443f6b2737f725aca7f523a091844db070bc8e79c5de1a32a2ea5c5da734cb95c18d48aff8fa31fcc9d4aea6c9274bb2e1b39d4ea26878d180
7
- data.tar.gz: d1f014eebc40f185c7c51db8e388e921dd9dc04dffc490ecb2da53b50331bf2749d9123fa8d86e14a8b3abcb9b3786529623915d04483b093dcca019102b473b
6
+ metadata.gz: 54a6721974b100c1904f77b019f41e5452066aa6cfc3fa0801da3ad62338899d90efe0cc7fb0a3cd4b9bb2b2f06cc50fdc7056b7d4229b07a63da6636c9c082f
7
+ data.tar.gz: 68039d453bc0109a1d6cc1da5f766f13e6635f15f16af2f6c77f4dc1c252d9e65691cf342ba1684ddf6ecd635b31e3f7fd860fbab002de1d69ff0c12b84655ad
data/.gitignore CHANGED
@@ -3,7 +3,6 @@
3
3
  .bundle
4
4
  .config
5
5
  .yardoc
6
- Gemfile.lock
7
6
  InstalledFiles
8
7
  _yardoc
9
8
  coverage
@@ -15,3 +14,4 @@ spec/reports
15
14
  test/tmp
16
15
  test/version_tmp
17
16
  tmp
17
+ Gemfile.lock
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.1
6
+ services:
7
+ - memcached
8
+ env:
9
+ global:
10
+ secure: BGfmqUck2al6tPwv0KQKwbdBKLPIUEkxy1bn3vm55H/n/NwZR4zBE1ZO6HmX22BILrGtFIxxOPKg8+OIV+vk9u0MJNnzuze+G1M9h8zLgYpzRT8ZJtxItJXc6/1Ps2KXjY1seyk22B9oPYq+ZwGbnqb1FQrz0ZsU3WtG7yjoTaI=
data/Gemfile CHANGED
@@ -2,3 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in noodles.gemspec
4
4
  gemspec
5
+ gem "codeclimate-test-reporter", group: :test, require: nil
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 damir
1
+ Copyright (c) 2014 Damir Svrtan
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,9 +1,17 @@
1
1
  # Noodles
2
2
 
3
+ [![Build Status](https://travis-ci.org/DamirSvrtan/noodles.svg?branch=master)](https://travis-ci.org/DamirSvrtan/noodles)
4
+ [![Dependency Status](https://gemnasium.com/DamirSvrtan/noodles.svg)](https://gemnasium.com/DamirSvrtan/noodles)
5
+ [![Code Climate](https://codeclimate.com/github/DamirSvrtan/noodles.png)](https://codeclimate.com/github/DamirSvrtan/noodles)
6
+
3
7
  TODO: Write a gem description
4
8
 
5
9
  ## Installation
6
10
 
11
+ Start memcached:
12
+
13
+ memcached -l localhost
14
+
7
15
  Add this line to your application's Gemfile:
8
16
 
9
17
  gem 'noodles'
@@ -22,7 +30,7 @@ TODO: Write usage instructions here
22
30
 
23
31
  ## Contributing
24
32
 
25
- 1. Fork it
33
+ 1. Fork it ( http://github.com/<my-github-username>/noodles/fork )
26
34
  2. Create your feature branch (`git checkout -b my-new-feature`)
27
35
  3. Commit your changes (`git commit -am 'Add some feature'`)
28
36
  4. Push to the branch (`git push origin my-new-feature`)
data/Rakefile CHANGED
@@ -1 +1,11 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+ task default: :test
4
+
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.name = "test" # this is the default
8
+ t.libs << "test" # load the test dir
9
+ t.test_files = Dir['test/*test*.rb']
10
+ t.verbose = true
11
+ end
@@ -0,0 +1,2 @@
1
+ require_relative '../cli/noodles_cli'
2
+ NoodlesCLI.start(ARGV)
@@ -0,0 +1,92 @@
1
+ require 'thor'
2
+ require 'pry'
3
+ require 'find'
4
+ require 'irb'
5
+ require 'colorize'
6
+
7
+ class NoodlesCLI < Thor
8
+ include Thor::Actions
9
+
10
+ desc "new app_name", "creates a boilerplate Noodles folder structure"
11
+ def new(app_name)
12
+ template_path = Pathname.new File.expand_path('../template', __FILE__)
13
+
14
+ all_paths = Find.find(template_path).map {|path| Pathname.new(path)}
15
+ all_paths = all_paths[1..-1] # remove '.'
16
+
17
+ create_dir(app_name)
18
+
19
+ all_paths.each do |abs_path|
20
+ rel_path = abs_path.relative_path_from(template_path).to_s
21
+ rel_path = File.join app_name, rel_path
22
+ create_file_or_dir(abs_path, rel_path)
23
+ end
24
+
25
+ bundle_install(app_name)
26
+ git_init(app_name)
27
+ end
28
+
29
+ desc "start", "start the server"
30
+ option :port, aliases: :p
31
+ def start
32
+ if File.exist?('config.ru')
33
+ basic_command = "thin -R config.ru start"
34
+ basic_command << " -p #{options[:port]}" if options[:port]
35
+ run basic_command, verbose: false
36
+ else
37
+ puts "No config.ru file present."
38
+ end
39
+ end
40
+
41
+ desc "console", "starts the interactive console"
42
+ def console
43
+ init_path = File.expand_path "config/init.rb"
44
+ if File.exist?(init_path)
45
+ require init_path
46
+ Pry.start
47
+ else
48
+ puts "No config/init.rb file present."
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def create_file_or_dir(abs_path, rel_path)
55
+ if abs_path.directory?
56
+ create_dir(rel_path)
57
+ else
58
+ create_file(abs_path, rel_path)
59
+ end
60
+ end
61
+
62
+ def create_dir(rel_path)
63
+ FileUtils.mkdir(rel_path)
64
+ echo(:mkdir, rel_path)
65
+ end
66
+
67
+ def create_file(abs_path, rel_path)
68
+ File.open(rel_path, 'w') {|file| file.write(File.read(abs_path))}
69
+ echo(:create, rel_path)
70
+ end
71
+
72
+ def echo(action, subject)
73
+ line = "#{adjust(action).colorize(:green).bold} #{subject}"
74
+ puts line
75
+ end
76
+
77
+ def adjust(action)
78
+ action.to_s.rjust(8, " ")
79
+ end
80
+
81
+ def bundle_install(app_name)
82
+ echo(:run, 'bundle install')
83
+ run "cd #{app_name} && bundle install", verbose: false
84
+ end
85
+
86
+ def git_init(app_name)
87
+ unless `which git`.empty?
88
+ echo(:run, 'git init')
89
+ run "cd #{app_name} && git init", verbose: false
90
+ end
91
+ end
92
+ end
File without changes
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+ gem 'noodles'
3
+
4
+ group :development do
5
+ gem 'shotgun'
6
+ end
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,12 @@
1
+ require './config/application'
2
+ require './config/router'
3
+ require 'better_errors'
4
+
5
+ use Rack::Session::Cookie, :secret => 'abc123'
6
+ use BetterErrors::Middleware if Noodles.env.development?
7
+ use Rack::CommonLogger, $stdout
8
+ use Rack::ContentType
9
+ use Rack::MethodOverride
10
+ use Rack::Static, urls: ["/css", "/images", "/js", "/favicon.ico"], root: "public"
11
+
12
+ run Noodles.application
@@ -0,0 +1,7 @@
1
+ require 'noodles'
2
+
3
+ %w(controllers handlers channels).each do |app_folder|
4
+ app_folder_path = File.join(File.dirname(__FILE__), "..", "app", app_folder)
5
+ $LOAD_PATH << app_folder_path
6
+ Dir[File.join(app_folder_path, "*.rb")].each {|file| require file }
7
+ end
@@ -0,0 +1,2 @@
1
+ Noodles.http_app.routes do
2
+ end
@@ -0,0 +1,7 @@
1
+ development:
2
+
3
+ test:
4
+
5
+ staging:
6
+
7
+ production:
@@ -0,0 +1,3 @@
1
+ Noodles.setup do |config|
2
+ config.cache_store_name = 'my_noodles_app'
3
+ end
File without changes
File without changes
File without changes
@@ -1,5 +1,53 @@
1
- require "noodles/version"
1
+ # require "noodles/dependencies"
2
+ require 'noodles/version'
3
+ require 'noodles/utils'
4
+ require 'noodles/application'
5
+ require 'noodles/environment'
6
+ require 'noodles/cache'
7
+ require 'multi_json'
2
8
 
3
9
  module Noodles
4
- # Your code goes here...
5
- end
10
+ class << self
11
+ def env
12
+ Environment
13
+ end
14
+
15
+ def application
16
+ return @@application if defined? @@application
17
+ @@application = Noodles::Application.new
18
+ end
19
+
20
+ def http_app
21
+ return @@http_app if defined? @@http_app
22
+ @@http_app = application.http_app
23
+ end
24
+
25
+ def websocket_app
26
+ return @@websocket_app if defined? @@websocket_app
27
+ @@websocket_app = application.websocket_app
28
+ end
29
+
30
+ def secrets
31
+ rendered_string = Erubis::Eruby.new(File.read(secrets_path)).result
32
+ secrets_hash = YAML.load(rendered_string)[Noodles.env.to_s]
33
+ OpenStruct.new(secrets_hash)
34
+ end
35
+
36
+ def secrets_path
37
+ File.join('config', 'secrets.yml')
38
+ end
39
+
40
+ def cache
41
+ return @@cache if defined? @@cache
42
+ namespace = cache_store_name || 'noodle_app'
43
+ options = { namespace: namespace, compress: true }
44
+ @@cache = Cache.new('localhost:11211', options)
45
+ end
46
+
47
+ def setup
48
+ yield self
49
+ end
50
+
51
+ attr_accessor :cache_store_name
52
+ end
53
+ end
@@ -0,0 +1,23 @@
1
+ require "noodles/http/application"
2
+ require "noodles/websocket/application"
3
+ require 'yaml'
4
+
5
+ module Noodles
6
+ class Application
7
+
8
+ attr_reader :http_app, :websocket_app
9
+
10
+ def initialize
11
+ @http_app = Noodles::Http::Application.new
12
+ @websocket_app = Noodles::Websocket::Application.new
13
+ end
14
+
15
+ def call(env)
16
+ if env['HTTP_UPGRADE'] == "websocket"
17
+ @websocket_app.call(env)
18
+ else
19
+ @http_app.call(env)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,6 @@
1
+ require 'dalli'
2
+
3
+ module Noodles
4
+ class Cache < Dalli::Client
5
+ end
6
+ end
@@ -0,0 +1,12 @@
1
+ require 'pry'
2
+ class Object
3
+ def self.const_missing(c)
4
+ return nil if @calling_const_missing
5
+ @calling_const_missing = true
6
+
7
+ require Noodles.to_underscore(c.to_s)
8
+ klass = Object.const_get(c)
9
+ @calling_const_missing = false
10
+ klass
11
+ end
12
+ end
@@ -0,0 +1,47 @@
1
+ module Noodles
2
+ module Environment
3
+ class << self
4
+
5
+ def development?
6
+ environment.to_s == 'development'
7
+ end
8
+
9
+ def production?
10
+ environment.to_s == 'production'
11
+ end
12
+
13
+ def test?
14
+ environment.to_s == 'test'
15
+ end
16
+
17
+ def environment?
18
+ environment
19
+ end
20
+
21
+ def to_s
22
+ environment
23
+ end
24
+
25
+ def to_sym
26
+ environment.to_sym
27
+ end
28
+
29
+ def ==(other)
30
+ case other
31
+ when String
32
+ environment.to_s == other
33
+ when Symbol
34
+ environment.to_sym == other
35
+ else
36
+ super
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def environment
43
+ ENV['RACK_ENV'] || 'development'
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,34 @@
1
+ require "noodles/http/router"
2
+ require "noodles/http/controller"
3
+ require "noodles/http/errors/no_router_error"
4
+
5
+ module Noodles
6
+ module Http
7
+ class Application
8
+
9
+ def call(env)
10
+ if rack_app = get_rack_app(env)
11
+ rack_app.call(env)
12
+ else
13
+ response_not_found
14
+ end
15
+ end
16
+
17
+ def routes(&block)
18
+ @router ||= Router.new
19
+ @router.instance_eval(&block)
20
+ end
21
+
22
+ private
23
+
24
+ def get_rack_app(env)
25
+ raise NoRouterError.new if @router.nil?
26
+ @router.find_by_url(env['REQUEST_METHOD'], env['PATH_INFO'])
27
+ end
28
+
29
+ def response_not_found
30
+ [404, {'Content-Type' => 'text/html'}, ["<h1>404</h1>"]]
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,106 @@
1
+ require 'noodles/http/view'
2
+ require 'tilt/erubis'
3
+ require 'tilt/haml'
4
+ require 'slim'
5
+
6
+ module Noodles
7
+ module Http
8
+ class Controller
9
+
10
+ attr_reader :env, :request, :response, :session
11
+
12
+ def initialize(env)
13
+ @env = env
14
+ @routing_params = {}
15
+ @request = Rack::Request.new(env)
16
+ @response = Rack::Response.new([], 200, {'Content-Type' => 'text/html'})
17
+ @session = @env['rack.session']
18
+ end
19
+
20
+ def text(textual_response)
21
+ @response['Content-Type'] = 'text/plain'
22
+ @response.body = [textual_response]
23
+ end
24
+
25
+ def html(template_name)
26
+ @response.body = [read_file(template_name, :html)]
27
+ end
28
+
29
+ def json(jsonized_response)
30
+ @response['Content-Type'] = 'application/json'
31
+ unless jsonized_response.is_a? String
32
+ jsonized_response = jsonized_response.to_json
33
+ end
34
+ @response.body = [jsonized_response]
35
+ end
36
+
37
+ [:erb, :haml, :slim].each do |template_engine|
38
+ define_method template_engine do |template_name|
39
+ filename = get_rendering_path(template_name, template_engine)
40
+ @response.body = [Tilt.new(filename).render(map_instance_variables_to_object)]
41
+ end
42
+ end
43
+
44
+ def params
45
+ request.params.merge @routing_params
46
+ end
47
+
48
+ def redirect(redirect_path, status=302)
49
+ @response.body = []
50
+ @response['Location'] = redirect_path
51
+ @response.status = status
52
+ end
53
+
54
+ alias_method :redirect_to, :redirect
55
+
56
+ def self.action(action, routing_params)
57
+ proc { |e| self.new(e).dispatch(action, routing_params) }
58
+ end
59
+
60
+ def dispatch(action, routing_params)
61
+ @routing_params = routing_params
62
+ self.send(action)
63
+ @response.finish
64
+ end
65
+
66
+ def self.view(view)
67
+ @@view = view
68
+ end
69
+
70
+ def view_clazz
71
+ if defined? @@view
72
+ @@view
73
+ else
74
+ View
75
+ end
76
+ end
77
+
78
+ private
79
+
80
+ def read_file(template_name, template_type)
81
+ File.read get_rendering_path(template_name, template_type)
82
+ end
83
+
84
+ def get_rendering_path(template_name, template_type)
85
+ File.join 'app', 'templates', controller_name, "#{template_name}.#{template_type}"
86
+ end
87
+
88
+ def controller_name
89
+ klass = self.class.to_s.gsub /Controller$/, ""
90
+ Noodles.to_underscore klass
91
+ end
92
+
93
+ def mapped_instance_variables
94
+ Hash[self.instance_variables.map {|var| [var, self.instance_variable_get(var)]}]
95
+ end
96
+
97
+ def map_instance_variables_to_object
98
+ new_object = view_clazz.new
99
+ mapped_instance_variables.each do |k,v|
100
+ new_object.instance_variable_set k, v
101
+ end
102
+ new_object
103
+ end
104
+ end
105
+ end
106
+ end