apimaster 0.0.2 → 0.0.3
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.
- data/apimaster.gemspec +2 -2
- data/lib/apimaster/generators/{application.rb → app_generator.rb} +6 -15
- data/lib/apimaster/generators/base.rb +55 -3
- data/lib/apimaster/generators/controller_generator.rb +34 -0
- data/lib/apimaster/generators/model_generator.rb +33 -0
- data/lib/apimaster/generators/scripts.rb +18 -15
- data/lib/apimaster/generators/templates/Gemfile +6 -3
- data/lib/apimaster/generators/templates/Rakefile +4 -18
- data/lib/apimaster/generators/templates/app/controllers/befores_controller.rb.erb +13 -0
- data/lib/apimaster/generators/templates/app/controllers/examples_controller.rb.erb +15 -0
- data/lib/apimaster/generators/templates/app/controllers/index_controller.rb.erb +4 -0
- data/lib/apimaster/generators/templates/app/models/example.rb.erb +15 -0
- data/lib/apimaster/generators/templates/app/tasks/stat.rake.erb +27 -0
- data/lib/apimaster/generators/templates/app/tasks/test.rake.erb +21 -0
- data/lib/apimaster/generators/templates/config/application.rb.erb +2 -4
- data/lib/apimaster/generators/templates/config/initializer.rb.erb +1 -1
- data/lib/apimaster/generators/templates/config/settings/mongoid.yml.erb +15 -56
- data/lib/apimaster/generators/templates/test.watchr +21 -0
- data/lib/apimaster/generators/templates/test/factory/example_factory.rb.erb +7 -0
- data/lib/apimaster/generators/templates/test/functional/examples_controller_test.rb.erb +20 -0
- data/lib/apimaster/generators/templates/test/functional_test.rb.erb +0 -1
- data/lib/apimaster/generators/templates/test/test_helper.rb.erb +60 -0
- data/lib/apimaster/generators/templates/test/unit/example_test.rb.erb +11 -0
- data/lib/apimaster/generators/templates/test/unit_test.rb.erb +10 -1
- data/lib/apimaster/mapper.rb +39 -23
- metadata +14 -3
data/apimaster.gemspec
CHANGED
@@ -1,23 +1,10 @@
|
|
1
|
-
require 'rbconfig'
|
2
1
|
|
3
2
|
module Apimaster::Generators
|
4
|
-
class
|
5
|
-
|
6
|
-
DEFAULT_SHEBANG = File.join(RbConfig::CONFIG['bindir'],
|
7
|
-
RbConfig::CONFIG['ruby_install_name'])
|
8
|
-
|
9
|
-
default_options :shebang => DEFAULT_SHEBANG,
|
10
|
-
:an_option => 'some_default'
|
11
|
-
|
3
|
+
class AppGenerator < Create
|
12
4
|
attr_reader :app_name, :module_name
|
13
5
|
|
14
6
|
def initialize(runtime_args, runtime_options = {})
|
15
|
-
runtime_options[:source] = File.dirname(__FILE__) + '/templates'
|
16
|
-
runtime_options[:destination] = Dir.pwd
|
17
|
-
runtime_options[:collision] = :ask
|
18
|
-
runtime_options[:stdout] = STDOUT
|
19
7
|
super
|
20
|
-
usage if args.empty?
|
21
8
|
#@destination_root = args.shift
|
22
9
|
#@app_name = File.basename(File.expand_path(@destination_root))
|
23
10
|
@app_name = args[0]
|
@@ -46,14 +33,17 @@ module Apimaster::Generators
|
|
46
33
|
m.template "config.ru.erb", "config.ru"
|
47
34
|
m.template "gitignore", ".gitignore"
|
48
35
|
m.template "lib/module.rb.erb", "lib/#{app_name}.rb"
|
36
|
+
m.template "app/tasks/test.rake.erb", "app/tasks/test.rake"
|
37
|
+
m.template "app/tasks/stat.rake.erb", "app/tasks/stat.rake"
|
49
38
|
m.template "app/controllers/index_controller.rb.erb", "app/controllers/index_controller.rb"
|
39
|
+
m.template "app/controllers/befores_controller.rb.erb", "app/controllers/befores_controller.rb"
|
50
40
|
|
51
41
|
# Test stubs
|
52
42
|
m.template "test/test_helper.rb.erb", "test/test_helper.rb"
|
53
43
|
m.template "test/functional_test.rb.erb", "test/functional/index_controller_test.rb"
|
54
44
|
m.template "test/unit_test.rb.erb", "test/unit/#{app_name}_test.rb"
|
55
45
|
|
56
|
-
%w(LICENSE Rakefile README.md Gemfile TODO).each do |file|
|
46
|
+
%w(LICENSE Rakefile README.md Gemfile TODO test.watchr).each do |file|
|
57
47
|
m.template file, file
|
58
48
|
end
|
59
49
|
end
|
@@ -94,6 +84,7 @@ module Apimaster::Generators
|
|
94
84
|
app/views
|
95
85
|
app/models
|
96
86
|
app/helpers
|
87
|
+
app/tasks
|
97
88
|
bin
|
98
89
|
config
|
99
90
|
config/settings
|
@@ -34,6 +34,8 @@
|
|
34
34
|
# +manifest+ method inside your generator subclass.
|
35
35
|
#
|
36
36
|
#
|
37
|
+
require 'rbconfig'
|
38
|
+
|
37
39
|
module Apimaster::Generators
|
38
40
|
class GeneratorsError < StandardError; end
|
39
41
|
class UsageError < GeneratorsError; end
|
@@ -74,6 +76,12 @@ module Apimaster::Generators
|
|
74
76
|
class Base
|
75
77
|
include Options
|
76
78
|
|
79
|
+
DEFAULT_SHEBANG = File.join(RbConfig::CONFIG['bindir'],
|
80
|
+
RbConfig::CONFIG['ruby_install_name'])
|
81
|
+
|
82
|
+
default_options :shebang => DEFAULT_SHEBANG,
|
83
|
+
:an_option => 'some_default'
|
84
|
+
|
77
85
|
# Declare default options for the generator. These options
|
78
86
|
# are inherited to subclasses.
|
79
87
|
default_options :collision => :ask, :quiet => false, :stdout => STDOUT
|
@@ -94,6 +102,10 @@ module Apimaster::Generators
|
|
94
102
|
attr_reader :source_root, :destination_root, :args, :stdout
|
95
103
|
|
96
104
|
def initialize(runtime_args, runtime_options = {})
|
105
|
+
runtime_options[:source] = File.dirname(__FILE__) + '/templates'
|
106
|
+
runtime_options[:destination] = Dir.pwd
|
107
|
+
runtime_options[:collision] = :ask
|
108
|
+
runtime_options[:stdout] = STDOUT
|
97
109
|
runtime_options[:backtrace] = true
|
98
110
|
@logger = SimpleLogger.new
|
99
111
|
@args = runtime_args
|
@@ -171,9 +183,14 @@ module Apimaster::Generators
|
|
171
183
|
# and a hash of parsed arguments, takes the generator as an option
|
172
184
|
# or first remaining argument, and invokes the requested command.
|
173
185
|
def run
|
174
|
-
|
175
|
-
|
176
|
-
|
186
|
+
name = args.shift
|
187
|
+
if name
|
188
|
+
# Look up generator instance and invoke command on it.
|
189
|
+
manifest.replay(self)
|
190
|
+
after_generate
|
191
|
+
else
|
192
|
+
puts 'Undefined name.' unless options[:help]
|
193
|
+
end
|
177
194
|
rescue => e
|
178
195
|
puts e
|
179
196
|
puts " #{e.backtrace.join("\n ")}\n" if options[:backtrace]
|
@@ -186,6 +203,41 @@ module Apimaster::Generators
|
|
186
203
|
string.gsub(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{$2.capitalize}" }.gsub('/', '::')
|
187
204
|
end
|
188
205
|
|
206
|
+
def pluralize(word)
|
207
|
+
rules = {}
|
208
|
+
rules.store(/$/, 's')
|
209
|
+
rules.store(/s$/i, 's')
|
210
|
+
rules.store(/(ax|test)is$/i, '\1es')
|
211
|
+
rules.store(/(octop|vir)us$/i, '\1i')
|
212
|
+
rules.store(/(octop|vir)i$/i, '\1i')
|
213
|
+
rules.store(/(alias|status)$/i, '\1es')
|
214
|
+
rules.store(/(bu)s$/i, '\1ses')
|
215
|
+
rules.store(/(buffal|tomat)o$/i, '\1oes')
|
216
|
+
rules.store(/([ti])um$/i, '\1a')
|
217
|
+
rules.store(/([ti])a$/i, '\1a')
|
218
|
+
rules.store(/sis$/i, 'ses')
|
219
|
+
rules.store(/(?:([^f])fe|([lr])f)$/i, '\1\2ves')
|
220
|
+
rules.store(/(hive)$/i, '\1s')
|
221
|
+
rules.store(/([^aeiouy]|qu)y$/i, '\1ies')
|
222
|
+
rules.store(/(x|ch|ss|sh)$/i, '\1es')
|
223
|
+
rules.store(/(matr|vert|ind)(?:ix|ex)$/i, '\1ices')
|
224
|
+
rules.store(/(m|l)ouse$/i, '\1ice')
|
225
|
+
rules.store(/(m|l)ice$/i, '\1ice')
|
226
|
+
rules.store(/^(ox)$/i, '\1en')
|
227
|
+
rules.store(/^(oxen)$/i, '\1')
|
228
|
+
rules.store(/(quiz)$/i, '\1zes')
|
229
|
+
uncountables = %w(equipment information rice money species series fish sheep jeans)
|
230
|
+
|
231
|
+
result = word.to_s.dup
|
232
|
+
|
233
|
+
if word.empty? || uncountables.any? { |inflection| result =~ /\b#{inflection}\Z/i }
|
234
|
+
result
|
235
|
+
else
|
236
|
+
rules.each { |(rule, replacement)| break if result.gsub!(rule, replacement) }
|
237
|
+
result
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
189
241
|
protected
|
190
242
|
# Convenience method for generator subclasses to record a manifest.
|
191
243
|
def record
|
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
module Apimaster::Generators
|
3
|
+
class ControllerGenerator < Create
|
4
|
+
attr_reader :app_name, :module_name, :name
|
5
|
+
|
6
|
+
def initialize(runtime_args, runtime_options = {})
|
7
|
+
super
|
8
|
+
@app_name = File.basename(File.expand_path('./'))
|
9
|
+
@module_name = camelize(app_name)
|
10
|
+
@name = args[0]
|
11
|
+
raise 'Undefined app name.' unless @app_name
|
12
|
+
end
|
13
|
+
|
14
|
+
def manifest
|
15
|
+
record do |m|
|
16
|
+
m.template "app/controllers/examples_controller.rb.erb", "app/controllers/#{pluralize name}_controller.rb"
|
17
|
+
m.template "test/functional/examples_controller_test.rb.erb", "test/functional/#{pluralize name}_controller_test.rb"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def banner
|
23
|
+
<<-EOS
|
24
|
+
Creates an Apimaster controller.
|
25
|
+
|
26
|
+
USAGE: apimaster controller your_controller_name"
|
27
|
+
|
28
|
+
NOTE: Without `_controller` suffix
|
29
|
+
|
30
|
+
EOS
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
module Apimaster::Generators
|
3
|
+
class ModelGenerator < Create
|
4
|
+
attr_reader :app_name, :module_name, :name
|
5
|
+
|
6
|
+
def initialize(runtime_args, runtime_options = {})
|
7
|
+
super
|
8
|
+
@app_name = File.basename(File.expand_path('./'))
|
9
|
+
@module_name = camelize(app_name)
|
10
|
+
@name = args[0]
|
11
|
+
raise 'Undefined app name.' unless @app_name
|
12
|
+
end
|
13
|
+
|
14
|
+
def manifest
|
15
|
+
record do |m|
|
16
|
+
m.template "app/models/example.rb.erb", "app/models/#{name}.rb"
|
17
|
+
m.template "test/unit/example_test.rb.erb", "test/unit/#{name}_test.rb"
|
18
|
+
m.template "test/factory/example_factory.rb.erb", "test/factory/#{name}_factory.rb"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def banner
|
24
|
+
<<-EOS
|
25
|
+
Creates an Apimaster model.
|
26
|
+
|
27
|
+
USAGE: apimaster model your_model_name"
|
28
|
+
|
29
|
+
EOS
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -7,7 +7,9 @@ require File.dirname(__FILE__) + '/simple_logger'
|
|
7
7
|
|
8
8
|
require File.dirname(__FILE__) + '/base'
|
9
9
|
require File.dirname(__FILE__) + '/command'
|
10
|
-
require File.dirname(__FILE__) + '/
|
10
|
+
require File.dirname(__FILE__) + '/app_generator'
|
11
|
+
require File.dirname(__FILE__) + '/model_generator'
|
12
|
+
require File.dirname(__FILE__) + '/controller_generator'
|
11
13
|
|
12
14
|
module Apimaster::Generators
|
13
15
|
module Scripts
|
@@ -25,7 +27,9 @@ module Apimaster::Generators
|
|
25
27
|
|
26
28
|
def initialize
|
27
29
|
@commands ||= {}
|
28
|
-
register("new",
|
30
|
+
register("new", AppGenerator)
|
31
|
+
register("model", ModelGenerator)
|
32
|
+
register("controller", ControllerGenerator)
|
29
33
|
end
|
30
34
|
|
31
35
|
def register name, klass
|
@@ -44,21 +48,20 @@ module Apimaster::Generators
|
|
44
48
|
end
|
45
49
|
|
46
50
|
# Look up generator instance and invoke command on it.
|
47
|
-
|
48
|
-
|
49
|
-
commands
|
50
|
-
|
51
|
-
|
52
|
-
|
51
|
+
begin
|
52
|
+
command = args.shift
|
53
|
+
if command and commands.key?(command)
|
54
|
+
commands[command].new(args).run
|
55
|
+
else
|
56
|
+
raise "Invalid command name: #{command}"
|
57
|
+
end
|
58
|
+
rescue => e
|
59
|
+
stdout.puts e
|
60
|
+
stdout.puts " #{e.backtrace.join("\n ")}\n" if options[:backtrace]
|
61
|
+
raise SystemExit unless options[:no_exit]
|
53
62
|
end
|
54
|
-
rescue => e
|
55
|
-
stdout.puts e
|
56
|
-
stdout.puts " #{e.backtrace.join("\n ")}\n" if options[:backtrace]
|
57
|
-
raise SystemExit unless options[:no_exit]
|
58
63
|
end
|
59
64
|
|
60
|
-
|
61
|
-
stdout.puts "apimaster new your_app_name"
|
62
|
-
end
|
65
|
+
end
|
63
66
|
end
|
64
67
|
end
|
@@ -1,4 +1,7 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Copyright (C) 2011-2012 AdMaster, Inc.
|
4
|
+
|
2
5
|
source "https://rubygems.org"
|
3
6
|
|
4
7
|
gem "sinatra"
|
@@ -6,6 +9,8 @@ gem "sinatra-contrib"
|
|
6
9
|
gem "thin"
|
7
10
|
gem "json"
|
8
11
|
gem "rake"
|
12
|
+
gem "mongoid"
|
13
|
+
gem "bson_ext"
|
9
14
|
gem "apimaster"
|
10
15
|
|
11
16
|
group :development do
|
@@ -15,7 +20,5 @@ group :production do
|
|
15
20
|
end
|
16
21
|
|
17
22
|
group :test do
|
18
|
-
gem "sqlite3"
|
19
23
|
gem "rack-test"
|
20
24
|
end
|
21
|
-
|
@@ -1,19 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require 'bundler'
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Copyright (C) 2011-2012 AdMaster, Inc.
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
require 'spec/rake/spectask'
|
9
|
-
desc "Run specs"
|
10
|
-
Spec::Rake::SpecTask.new do |t|
|
11
|
-
t.spec_files = FileList['spec/**/*_spec.rb']
|
12
|
-
t.spec_opts = %w(-fs --color)
|
13
|
-
t.spec_opts << '--loadby' << 'random'
|
14
|
-
|
15
|
-
t.rcov_opts << '--exclude' << 'spec,.bundle'
|
16
|
-
t.rcov = ENV.has_key?('NO_RCOV') ? ENV['NO_RCOV'] != 'true' : true
|
17
|
-
t.rcov_opts << '--text-summary'
|
18
|
-
t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
|
19
|
-
end
|
5
|
+
Dir["./app/tasks/**/*.rake"].sort.each { |ext| load ext }
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module <%= module_name %>
|
2
|
+
class <%= pluralize camelize(name) %>Controller < Sinatra::Base
|
3
|
+
|
4
|
+
get '/<%= pluralize name %>/:id' do
|
5
|
+
<%= name %> = <%= camelize name %>.find params[:id]
|
6
|
+
json <%= name %>.to_hash(:get)
|
7
|
+
end
|
8
|
+
|
9
|
+
get '/<%= pluralize name %>' do
|
10
|
+
<%= pluralize name %> = <%= camelize name %>.all
|
11
|
+
json <%= pluralize name %>.to_hashes(:list)
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Copyright (C) 2011-2012 AdMaster, Inc.
|
4
|
+
|
5
|
+
module <%= module_name %>
|
6
|
+
class <%= camelize name %> < Apimaster::Mapper
|
7
|
+
include Mongoid::Document
|
8
|
+
|
9
|
+
field :title, type: String
|
10
|
+
field :content, type: String
|
11
|
+
|
12
|
+
attr_options :title, accessor: [:list], required: [:post]
|
13
|
+
attr_options :content, accessor: [:get], required: [:post]
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
namespace :metric do
|
2
|
+
|
3
|
+
desc "project statistics"
|
4
|
+
task 'stat' do
|
5
|
+
puts "All:"
|
6
|
+
stat_files Dir.glob('**/*.{rb,slim,coffee,scss}')
|
7
|
+
puts "\nRuby:"
|
8
|
+
stat_files Dir.glob('**/*.rb') - Dir.glob('test/**/*.rb')
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def stat_files fs
|
15
|
+
c = 0
|
16
|
+
fc = 0
|
17
|
+
total_size = 0.0
|
18
|
+
fs.each do |f|
|
19
|
+
fc += 1
|
20
|
+
data = File.binread f
|
21
|
+
c += data.count "\n"
|
22
|
+
total_size += data.bytesize
|
23
|
+
end
|
24
|
+
puts "files: #{fc}"
|
25
|
+
puts "lines: #{c}"
|
26
|
+
puts "chars: #{total_size.to_i}"
|
27
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
%w[unit functional integration performance].each do |type|
|
2
|
+
desc "Run #{type} tests"
|
3
|
+
task "test:#{type}" do
|
4
|
+
require "./test/test_helper"
|
5
|
+
Dir.glob "./test/#{type}/*_test.rb" do |f|
|
6
|
+
require f
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Run single file tests"
|
11
|
+
task "test:#{type}:file" do
|
12
|
+
file = "./test/#{type}/#{ENV["name"]}_test.rb"
|
13
|
+
if File.exists? file
|
14
|
+
require "./test/test_helper"
|
15
|
+
require file
|
16
|
+
else
|
17
|
+
puts "Test file not found: #{file}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -1,66 +1,25 @@
|
|
1
|
-
|
1
|
+
production:
|
2
2
|
sessions:
|
3
3
|
default:
|
4
|
-
database:
|
4
|
+
database: <%= app_name %>
|
5
|
+
username: user
|
6
|
+
username: user
|
7
|
+
password: password
|
5
8
|
hosts:
|
6
9
|
- localhost:27017
|
7
|
-
|
8
|
-
# Tell Mongoid which environment this configuration is for.
|
9
|
-
production:
|
10
|
-
# This starts the session configuration settings. You may have as
|
11
|
-
# many sessions as you like, but you must have at least 1 named
|
12
|
-
# 'default'.
|
10
|
+
development:
|
13
11
|
sessions:
|
14
|
-
# Define the default session.
|
15
12
|
default:
|
16
|
-
|
17
|
-
|
18
|
-
# an array of host:port pairs. This session is single server.
|
19
|
-
hosts:
|
20
|
-
- flame.mongohq.com:27017
|
21
|
-
# Define the default database name.
|
22
|
-
database: mongoid
|
23
|
-
# Since this database points at a session connected to MongoHQ, we must
|
24
|
-
# provide the authentication details.
|
13
|
+
database: <%= app_name %>_develop
|
14
|
+
username: user
|
25
15
|
username: user
|
26
16
|
password: password
|
27
|
-
# This defines a secondary session at a replica set.
|
28
|
-
replica_set:
|
29
|
-
# This configuration is a 3 node replica set.
|
30
17
|
hosts:
|
31
|
-
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
# on secondary nodes, and defaulting the session to safe mode.
|
37
|
-
options:
|
38
|
-
consistency: :eventual
|
39
|
-
safe: true
|
40
|
-
# This defines a tertiary session at a Mongos fronted shard.
|
41
|
-
shard:
|
42
|
-
# This configuration is a Mongos shard server.
|
18
|
+
- localhost:27017
|
19
|
+
test:
|
20
|
+
sessions:
|
21
|
+
default:
|
22
|
+
database: <%= app_name %>_test
|
43
23
|
hosts:
|
44
|
-
-
|
45
|
-
|
46
|
-
# This configuration shows an authenticated replica set via a uri.
|
47
|
-
another:
|
48
|
-
uri: mongodb://user:pass@59.1.22.1:27017,59.1.22.2:27017/mongoid
|
49
|
-
# Here we put the Mongoid specific configuration options. These are explained
|
50
|
-
# in more detail next.
|
51
|
-
options:
|
52
|
-
allow_dynamic_fields: false
|
53
|
-
identity_map_enabled: true
|
54
|
-
include_root_in_json: true
|
55
|
-
include_type_for_serialization: true
|
56
|
-
# Note this can also be true if you want to preload everything, but this is
|
57
|
-
# almost never necessary. Most of the time set this to false.
|
58
|
-
preload_models:
|
59
|
-
- Canvas
|
60
|
-
- Browser
|
61
|
-
- Firefox
|
62
|
-
scope_overwrite_exception: true
|
63
|
-
raise_not_found_error: false
|
64
|
-
skip_version_check: false
|
65
|
-
use_activesupport_time_zone: false
|
66
|
-
use_utc: true
|
24
|
+
- localhost:27017
|
25
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
#watch('^test.*/.*_test\.rb') { run tests }
|
3
|
+
watch('^test/functional/(.*)_test\.rb') { |m| run tests('functional', m[1]) }
|
4
|
+
watch('^test/unit/(.*)_test\.rb') { |m| run tests('unit', m[1]) }
|
5
|
+
# --------------------------------------------------
|
6
|
+
# Helpers
|
7
|
+
# --------------------------------------------------
|
8
|
+
|
9
|
+
def tests(type, file = nil)
|
10
|
+
cmd = "rake test:#{type}"
|
11
|
+
cmd << ":file name=#{file}" if file
|
12
|
+
end
|
13
|
+
|
14
|
+
def run(cmd)
|
15
|
+
now = Time.now.to_s
|
16
|
+
puts "", "=" * cmd.length, now, ""
|
17
|
+
puts cmd
|
18
|
+
puts "-" * cmd.length, ""
|
19
|
+
system cmd
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class <%= pluralize camelize(name) %>ControllerTest < FunctionalTestCase
|
2
|
+
def setup
|
3
|
+
<%= module_name %>::<%= camelize name %>.delete_all
|
4
|
+
end
|
5
|
+
|
6
|
+
def test_get_<%= name %>_by_id
|
7
|
+
<%= name %> = <%= camelize name %>Factory.post
|
8
|
+
|
9
|
+
get "/<%= pluralize name %>/#{<%= name %>._id}"
|
10
|
+
assert_equal 200, last_response.status
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_get_<%= pluralize name %>
|
14
|
+
3.times { <%= camelize name %>Factory.post }
|
15
|
+
|
16
|
+
get "/<%= pluralize name %>"
|
17
|
+
assert_equal 200, last_response.status
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -1 +1,61 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Copyright (C) 2011-2012 AdMaster, Inc.
|
1
4
|
|
5
|
+
ENV['RACK_ENV'] ||= "test"
|
6
|
+
|
7
|
+
require "minitest/autorun"
|
8
|
+
require "rack/test"
|
9
|
+
require "./config/boot"
|
10
|
+
|
11
|
+
class BaseFactory
|
12
|
+
|
13
|
+
def self.define name, value = nil
|
14
|
+
self.attrs[name] = value
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.attrs
|
18
|
+
@attrs ||= {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.attr key
|
22
|
+
@attrs ||= {}
|
23
|
+
@attrs[key]
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.register name
|
27
|
+
@klass = name
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.post data = {}
|
31
|
+
raise "Please register class first.`" unless @klass
|
32
|
+
@klass.post attrs.merge(data)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
class TestCase < MiniTest::Unit::TestCase
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
class FunctionalTestCase < TestCase
|
42
|
+
|
43
|
+
include Rack::Test::Methods
|
44
|
+
|
45
|
+
def app
|
46
|
+
@app ||= Sinatra.new(<%= module_name %>::Application) {}
|
47
|
+
end
|
48
|
+
|
49
|
+
def body
|
50
|
+
last_response.body
|
51
|
+
end
|
52
|
+
|
53
|
+
def patch(uri, params = {}, env = {}, &block)
|
54
|
+
env = env.merge(:method => "PATCH", :params => params)
|
55
|
+
request(uri, env, &block)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
Dir.glob "./test/factory/**/*_factory.rb" do |f| require f end
|
61
|
+
Dir.glob "./test/mock/**/*_mock.rb" do |f| require f end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class <%= camelize name %>Test < TestCase
|
2
|
+
def setup
|
3
|
+
<%= module_name %>::<%= camelize name %>.delete_all
|
4
|
+
end
|
5
|
+
|
6
|
+
def test_title
|
7
|
+
<%= name %> = <%= module_name %>::<%= camelize name %>.new
|
8
|
+
<%= name %>.title = 'hello'
|
9
|
+
assert_equal 'hello', <%= name %>.title
|
10
|
+
end
|
11
|
+
end
|
data/lib/apimaster/mapper.rb
CHANGED
@@ -4,34 +4,24 @@
|
|
4
4
|
|
5
5
|
module Apimaster
|
6
6
|
class Mapper
|
7
|
-
#
|
7
|
+
#include ::Mongoid::Document
|
8
8
|
|
9
9
|
def post hash
|
10
|
-
|
11
|
-
save
|
10
|
+
save_with_hash hash, :post
|
12
11
|
end
|
13
12
|
|
14
13
|
def put hash
|
15
|
-
|
16
|
-
save
|
14
|
+
save_with_hash hash, :put
|
17
15
|
end
|
18
16
|
|
19
17
|
def patch hash
|
20
|
-
|
21
|
-
save
|
18
|
+
save_with_hash hash, :patch
|
22
19
|
end
|
23
20
|
|
24
|
-
def
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
if self.respond_to?(field)
|
29
|
-
record[field] = self.send(field)
|
30
|
-
else
|
31
|
-
raise "Dataset #{self.class} has no method with the name of #{field}"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
record
|
21
|
+
def save_with_hash hash, method
|
22
|
+
from_hash hash, method
|
23
|
+
save
|
24
|
+
self
|
35
25
|
end
|
36
26
|
|
37
27
|
def from_hash(hash, method = :all)
|
@@ -39,7 +29,7 @@ module Apimaster
|
|
39
29
|
attrs = [:required, :optional]
|
40
30
|
|
41
31
|
attrs.each do |type|
|
42
|
-
fields = self.class.
|
32
|
+
fields = self.class.find_attrs_in_options(type, method)
|
43
33
|
fields.each do |field|
|
44
34
|
if hash.has_key?(field)
|
45
35
|
data[field] = hash[field]
|
@@ -62,25 +52,51 @@ module Apimaster
|
|
62
52
|
self.send name, val
|
63
53
|
end
|
64
54
|
|
55
|
+
def to_hash accessor = :all
|
56
|
+
record = {}
|
57
|
+
fields = self.class.find_attrs_in_options(:accessor, accessor)
|
58
|
+
fields.each do |field|
|
59
|
+
if self.respond_to?(field)
|
60
|
+
record[field] = self.send(field)
|
61
|
+
else
|
62
|
+
raise "Dataset #{self.class} has no method with the name of #{field}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
record
|
66
|
+
end
|
67
|
+
|
65
68
|
class << self
|
66
69
|
|
67
70
|
OPTION_TYPES = [:accessor, :required, :optional]
|
68
71
|
|
69
|
-
@attr_options ||= {}
|
70
|
-
|
71
72
|
# attr_options :url, accessor: [:get, :list]
|
72
73
|
def attr_options name, options = {}
|
74
|
+
@attr_options ||= {}
|
73
75
|
@attr_options[name] = options
|
74
76
|
end
|
75
77
|
|
76
78
|
# [:url, :name]
|
77
79
|
def find_attrs_in_options type, option = :all
|
78
80
|
raise "Unknown attribute options type: #{type}" unless OPTION_TYPES.include? type
|
81
|
+
@attr_options ||= {}
|
79
82
|
@attr_options.select do |name, options|
|
80
|
-
type_options = options.is_a?(Hash) and options.key?(type) ? options[type] : nil
|
81
|
-
type_options.is_a?(Array) and (type_options.include?(option) or type_options.include(:all))
|
83
|
+
type_options = (options.is_a?(Hash) and options.key?(type)) ? options[type] : nil
|
84
|
+
type_options.is_a?(Array) and (type_options.include?(option) or type_options.include?(:all))
|
82
85
|
end.keys
|
83
86
|
end
|
87
|
+
|
88
|
+
def post hash
|
89
|
+
self.new.post hash
|
90
|
+
end
|
91
|
+
|
92
|
+
def to_hashes accessor = :all
|
93
|
+
result = []
|
94
|
+
self.each do |val|
|
95
|
+
result << val.to_hash(accessor)
|
96
|
+
end
|
97
|
+
result
|
98
|
+
end
|
99
|
+
|
84
100
|
end
|
85
101
|
end
|
86
102
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apimaster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-07-
|
14
|
+
date: 2012-07-12 00:00:00.000000000 Z
|
15
15
|
dependencies: []
|
16
16
|
description: A simple restful api framework.
|
17
17
|
email: sunxiqiu@admaster.com.cn
|
@@ -24,14 +24,21 @@ files:
|
|
24
24
|
- lib/apimaster/application.rb
|
25
25
|
- lib/apimaster/controllers/errors.rb
|
26
26
|
- lib/apimaster/error.rb
|
27
|
-
- lib/apimaster/generators/
|
27
|
+
- lib/apimaster/generators/app_generator.rb
|
28
28
|
- lib/apimaster/generators/base.rb
|
29
29
|
- lib/apimaster/generators/command.rb
|
30
|
+
- lib/apimaster/generators/controller_generator.rb
|
30
31
|
- lib/apimaster/generators/manifest.rb
|
32
|
+
- lib/apimaster/generators/model_generator.rb
|
31
33
|
- lib/apimaster/generators/options.rb
|
32
34
|
- lib/apimaster/generators/scripts.rb
|
33
35
|
- lib/apimaster/generators/simple_logger.rb
|
36
|
+
- lib/apimaster/generators/templates/app/controllers/befores_controller.rb.erb
|
37
|
+
- lib/apimaster/generators/templates/app/controllers/examples_controller.rb.erb
|
34
38
|
- lib/apimaster/generators/templates/app/controllers/index_controller.rb.erb
|
39
|
+
- lib/apimaster/generators/templates/app/models/example.rb.erb
|
40
|
+
- lib/apimaster/generators/templates/app/tasks/stat.rake.erb
|
41
|
+
- lib/apimaster/generators/templates/app/tasks/test.rake.erb
|
35
42
|
- lib/apimaster/generators/templates/config/application.rb.erb
|
36
43
|
- lib/apimaster/generators/templates/config/boot.rb.erb
|
37
44
|
- lib/apimaster/generators/templates/config/initializer.rb.erb
|
@@ -46,9 +53,13 @@ files:
|
|
46
53
|
- lib/apimaster/generators/templates/LICENSE
|
47
54
|
- lib/apimaster/generators/templates/Rakefile
|
48
55
|
- lib/apimaster/generators/templates/README.md
|
56
|
+
- lib/apimaster/generators/templates/test/factory/example_factory.rb.erb
|
57
|
+
- lib/apimaster/generators/templates/test/functional/examples_controller_test.rb.erb
|
49
58
|
- lib/apimaster/generators/templates/test/functional_test.rb.erb
|
50
59
|
- lib/apimaster/generators/templates/test/test_helper.rb.erb
|
60
|
+
- lib/apimaster/generators/templates/test/unit/example_test.rb.erb
|
51
61
|
- lib/apimaster/generators/templates/test/unit_test.rb.erb
|
62
|
+
- lib/apimaster/generators/templates/test.watchr
|
52
63
|
- lib/apimaster/generators/templates/TODO
|
53
64
|
- lib/apimaster/generators/version.rb
|
54
65
|
- lib/apimaster/helpers/headers.rb
|