noodles 0.0.1 → 0.0.6

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