puer 0.0.4 → 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.
@@ -0,0 +1,66 @@
1
+ require 'rubygems'
2
+ require 'cli-colorize'
3
+ require 'hirb'
4
+ require File.dirname(__FILE__) + '/../view'
5
+ require File.dirname(__FILE__) + '/jam'
6
+
7
+ module Puer
8
+ module Generators
9
+ class Controller < Jam
10
+ include CLIColorize
11
+
12
+ CLIColorize.default_color = :red
13
+ author 'Eiffel Qiu'
14
+ homepage 'http://www.likenote.com'
15
+ email 'eiffelqiu@gmail.com'
16
+ version Puer::Version::STRING
17
+
18
+ # Add this generator to our appjam
19
+ Puer::Generators.add_generator(:controller, self)
20
+
21
+ init_generator
22
+
23
+ desc "Description:\n\n\tpuer will generates an new Controller for titanium"
24
+
25
+ argument :name, :desc => "The name of your titanium controller"
26
+
27
+ class_option :root, :desc => "The root destination", :aliases => '-r', :default => ".", :type => :string
28
+ class_option :destroy, :aliases => '-d', :default => false, :type => :boolean
29
+
30
+ def create_controller
31
+ if in_app_root?
32
+ valid_constant?(options[:model] || name)
33
+ @controller_name = (options[:model] || name).gsub(/\W/, "_").downcase
34
+ @class_name = (options[:model] || name).gsub(/\W/, "_").capitalize
35
+ @developer = "#{`whoami`.strip}"
36
+ @created_on = Date.today.to_s
37
+ self.destination_root = options[:root]
38
+ self.behavior = :revoke if options[:destroy]
39
+
40
+ puts colorize( "Puer Version: #{Puer::Version::STRING}", { :foreground => :red, :background => :white, :config => :underline } )
41
+ puts
42
+ eval(File.read(__FILE__) =~ /^__END__\n/ && $' || '')
43
+
44
+ say (<<-TEXT).gsub(/ {10}/,'')
45
+
46
+ =================================================================
47
+ Your [#{@controller_name.capitalize}] Controller has been generated.
48
+ Build and Run
49
+ =================================================================
50
+
51
+ TEXT
52
+ else
53
+ puts
54
+ puts '-'*70
55
+ puts "You are not in a titanium project folder"
56
+ puts '-'*70
57
+ puts
58
+ end
59
+ end
60
+ end # Model
61
+ end # Generators
62
+ end # Puer
63
+
64
+ __END__
65
+ template "templates/controller.tt" , "Resources/controllers/#{@controller_name}.js"
66
+ template "templates/view.tt" , "Resources/views/#{@controller_name}.js"
@@ -0,0 +1,247 @@
1
+ require 'rubygems'
2
+ require 'fileutils'
3
+ require 'net/http'
4
+ require 'net/https'
5
+ require 'uri'
6
+ require "open-uri"
7
+ require 'tempfile'
8
+ require 'cli-colorize'
9
+ require 'hirb'
10
+ require File.dirname(__FILE__) + '/../view'
11
+ require File.dirname(__FILE__) + '/jam'
12
+
13
+ class String
14
+ def is_numeric?
15
+ Float(self)
16
+ true
17
+ rescue
18
+ false
19
+ end
20
+ end
21
+
22
+ module Puer
23
+ module Generators
24
+ class Gist < Jam
25
+ include CLIColorize
26
+
27
+ CLIColorize.default_color = :red
28
+ class << self
29
+ def self.attr_rw(*attrs)
30
+ attrs.each do |attr|
31
+ class_eval %Q{
32
+ def #{attr}(val=nil)
33
+ val.nil? ? @#{attr} : @#{attr} = val
34
+ end
35
+ }
36
+ end
37
+ end
38
+ attr_rw :gist_name, :gist_description, :gist_id, :gist_body
39
+ def preview_gist(gid)
40
+ uri = URI("https://gist.github.com/#{gid}.txt")
41
+ http = Net::HTTP.new(uri.host, uri.port)
42
+ if uri.scheme == 'https'
43
+ http.use_ssl = true
44
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
45
+ end
46
+
47
+ result = http.start {|h| h.request(Net::HTTP::Get.new(uri.path))}
48
+ tempfile = Tempfile.new('gist')
49
+ tempfile.puts(result)
50
+ tempfile.close
51
+
52
+ if system('which qlmanage')
53
+ system("qlmanage -p #{tempfile.path}/* >& /dev/null")
54
+ end
55
+ end
56
+
57
+ def update_gist
58
+ puer_dir = '~/.puer'
59
+ puer_gist = File.expand_path("~") + '/.puer/gist.yml'
60
+ system "mkdir -p #{puer_dir}" unless File.exist?(puer_dir)
61
+ begin
62
+ puts "fetching new gist list from server ... "
63
+ page_source = Net::HTTP.get(URI.parse("http://eiffelqiu.github.com/puer/gist.yml"))
64
+ File.open(puer_gist, 'w') {|f| f.write(page_source) }
65
+ rescue SocketError => e
66
+ puts "can not access github.com, back to local version gist.yml"
67
+ origin_gist = File.expand_path(File.dirname(__FILE__) + '/gist.yml')
68
+ system "cp #{origin_gist} #{puer_gist}"
69
+ end
70
+ end
71
+
72
+ def download_gists(username, page=1)
73
+ puts "-- Downloading page #{page} of gists --"
74
+ url = URI.parse("http://gist.github.com")
75
+ res = Net::HTTP.start(url.host, url.port) do |http|
76
+ response = http.get("/#{username}?page=#{page}")
77
+ if response.code == '200'
78
+ links = get_links(response.body)
79
+ links.each do |link, gist_id|
80
+ puts "git://gist.github.com/#{gist_id}.git"
81
+ if File.directory?("Gist/#{gist_id}")
82
+ `cd Gist/#{gist_id} && git pull ; cd ..`
83
+ else
84
+ `git clone git://gist.github.com/#{gist_id}.git Gist/#{gist_id}`
85
+ end
86
+ end
87
+ download_gists(username, page+1) unless links.empty?
88
+ end
89
+ end
90
+ end
91
+
92
+ def download_gist(gist_id,git_category,gist_name,gist_type)
93
+ puts "-- fetching gist [#{gist_name}] --"
94
+ # require 'uri'
95
+ # require 'yajl/http_stream'
96
+ #
97
+ # uri = URI.parse("http://gist.github.com/api/v1/json/#{gist_id}")
98
+ # Yajl::HttpStream.get(uri, :symbolize_keys => true) do |hash|
99
+ #
100
+ # end
101
+ if File.directory?("Gist/#{git_category}/#{gist_name.downcase}")
102
+ `rm -rf Gist/#{git_category}/#{gist_name.downcase}`
103
+ end
104
+ if("#{gist_id}".is_numeric?)
105
+ if system('which git') != nil
106
+ `git clone git://gist.github.com/#{gist_id}.git Gist/#{git_category}/#{gist_name.downcase} && rm -rf Gist/#{git_category}/#{gist_name.downcase}/.git`
107
+ else
108
+ say "="*70
109
+ say "Git was not installed!! check http://git-scm.com/ for installation."
110
+ say "="*70
111
+ end
112
+ else
113
+ if "#{gist_type}".strip == 'hg'
114
+ if system('which hg') != nil
115
+ `hg clone #{gist_id} Gist/#{git_category}/#{gist_name.downcase} && rm -rf Gist/#{git_category}/#{gist_name.downcase}/.hg`
116
+ else
117
+ say "="*70
118
+ say "Mercurial was not installed!! check http://mercurial.selenic.com/ for installation."
119
+ say "="*70
120
+ end
121
+ end
122
+ if "#{gist_type}".strip == 'svn'
123
+ if system('which svn') != nil
124
+ `svn co #{gist_id} Gist/#{git_category}/#{gist_name.downcase} && rm -rf Gist/#{git_category}/#{gist_name.downcase}/.svn`
125
+ else
126
+ say "="*70
127
+ say "Subversion was not installed!! check http://www.open.collab.net/downloads/community/ for installation."
128
+ say "="*70
129
+ end
130
+ end
131
+ if "#{gist_type}".strip == 'git'
132
+ if system('which git') != nil
133
+ `git clone #{gist_id} Gist/#{git_category}/#{gist_name.downcase} && rm -rf Gist/#{git_category}/#{gist_name.downcase}/.git`
134
+ else
135
+ say "="*70
136
+ say "Git was not installed!! check http://git-scm.com/ for installation."
137
+ say "="*70
138
+ end
139
+ end
140
+ end
141
+ if system('which qlmanage')
142
+ system("qlmanage -p Gist/#{git_category}/#{gist_name.downcase}/* >& /dev/null")
143
+ end
144
+ end
145
+ end
146
+
147
+ # Add this generator to our puer
148
+ Puer::Generators.add_generator(:gist, self)
149
+
150
+ # Define the source Gist root
151
+ def self.source_root; File.expand_path(File.dirname(__FILE__)); end
152
+ def self.banner; "puer gist [name]"; end
153
+
154
+ # Include related modules
155
+ include Thor::Actions
156
+ include Puer::Generators::Actions
157
+
158
+ desc "Description:\n\n\tpuer will generates function snippet for iphone"
159
+
160
+ argument :name, :desc => "The name of your function"
161
+
162
+ class_option :root, :desc => "The root destination", :aliases => '-r', :default => ".", :type => :string
163
+ class_option :destroy, :aliases => '-d', :default => false, :type => :boolean
164
+
165
+ def in_app_root?
166
+ # File.exist?('Classes')
167
+ Dir.glob("tiapp.xml").count >= 1
168
+ end
169
+
170
+ def create_git
171
+ valid_constant?(options[:gist] || name)
172
+ @gist_name = (options[:app] || name).gsub(/W/, "_").downcase
173
+ @class_name = (options[:app] || name).gsub(/W/, "_").capitalize
174
+ @developer = "eiffel"
175
+ @created_on = Date.today.to_s
176
+ self.destination_root = options[:root]
177
+
178
+ puts colorize( "Puer Version: #{Puer::Version::STRING}", { :foreground => :red, :background => :white, :config => :underline } )
179
+ puts
180
+
181
+ unless @gist_name == 'update'
182
+ if in_app_root?
183
+ require 'yaml'
184
+ @xcode_project_name = File.basename(Dir.glob('tiapp.xml')[0],'tiapp.xml').downcase
185
+ # begin
186
+ # page_source = Net::HTTP.get(URI.parse("http://eiffelqiu.github.com/puer/gist.yml"))
187
+ # rescue SocketError => e
188
+ # puts "can not access github.com, back to local version gist.yml"
189
+ # end
190
+ gistfile = File.expand_path("~") + '/.puer/gist.yml'
191
+ Gist::update_gist unless File.exist?(gistfile)
192
+ begin
193
+ puts "fetching new gists ..."
194
+ g = YAML.load_file(gistfile)
195
+ rescue ArgumentError => e
196
+ puts "can't fetch new gists, loading local gists ..."
197
+ g = YAML.load_file(File.expand_path(File.dirname(__FILE__) + '/gist.yml'))
198
+ end
199
+ puts "notice: a new version '#{g['info']}' released" if g['info'] and g['info'].strip != "#{Puer::Version::STRING}"
200
+ puts
201
+ g.each_pair {|key,value|
202
+ gcategory = key.downcase
203
+ unless (gcategory == 'lib' or gcategory == 'info')
204
+
205
+ g[key].each { |k|
206
+ k.each_pair { |k1,v1|
207
+ if "#{k1}" == @gist_name
208
+ gid = k[k1][0]['id']
209
+ gname = k[k1][1]['name']
210
+ gtype = 'git'
211
+ if k[k1].length == 4
212
+ gtype = k[k1][3]['type']
213
+ end
214
+ puts "repository type: #{gtype}"
215
+ Gist::download_gist("#{gid}",gcategory,gname,gtype)
216
+ eval(File.read(__FILE__) =~ /^__END__/ && $' || '')
217
+ say "================================================================="
218
+ say "Your '#{gname.capitalize}' snippet code has been generated."
219
+ say "Check Gist/#{gcategory}/#{gname}/ for snippet"
220
+ say "Open #{@xcode_project_name.capitalize}.xcodeproj"
221
+ say "Add 'Gist/#{gcategory}/#{gname}/' folder to the 'Classes/apps' Group"
222
+ say "Build and Run"
223
+ say "================================================================="
224
+ end
225
+ }
226
+ }
227
+ end
228
+ }
229
+ else
230
+ puts
231
+ puts '-'*70
232
+ puts "You are not in an iphone project folder"
233
+ puts '-'*70
234
+ puts
235
+ end
236
+ else
237
+ Gist::update_gist
238
+ end
239
+ end # create_gist
240
+
241
+ end # Gist
242
+ end # Generators
243
+ end # Puer
244
+
245
+ __END__
246
+ # put your Gist command here
247
+
@@ -0,0 +1,43 @@
1
+ info: 0.0.5
2
+ lib:
3
+ - alloy:
4
+ - id : git://github.com/appcelerator/alloy.git
5
+ - name : Alloy
6
+ - description : Alloy is an MVC framework for Titanium by Appcelerator
7
+ - titanium_modules:
8
+ - id : git://github.com/appcelerator/titanium_modules.git
9
+ - name : TitaniumModules
10
+ - description : Modules for Appcelerator's Titanium
11
+ - appcelerator_titanium_redux:
12
+ - id : git://github.com/dawsontoth/Appcelerator-Titanium-Redux.git
13
+ - name : AppceleratorTitaniumRedux
14
+ - description : Reduces the amount of code you need to write when using Titanium
15
+
16
+ utility:
17
+ - titanium_tools:
18
+ - id : git://github.com/krawaller/Titanium-Tools.git
19
+ - name : TitaniumTools
20
+ - description : A collection of nifty tools for Titanium Mobile
21
+ - titanium_calendar:
22
+ - id : git://github.com/stelford/Titanium-Calendar.git
23
+ - name : TitaniumCalendar
24
+ - description : Providing a Calendar Widget and Event creation for iPhone
25
+
26
+ app:
27
+ - kitchen_sink:
28
+ - id : git://github.com/appcelerator/KitchenSink.git
29
+ - name : KitchenSink
30
+ - description : Titanium Mobile Kitchen Sink Demo
31
+ - kitchen_sink_nook:
32
+ - id : git://github.com/appcelerator/KitchenSinkNook.git
33
+ - name : KitchenSinkNook
34
+ - description : Titanium Mobile Kitchen Sink Nook Demo
35
+ - kitchen_sink_ipad:
36
+ - id : git://github.com/appcelerator/KitchenSinkiPad.git
37
+ - name : KitchenSinkiPad
38
+ - description : Kitchen Sink app for iPad
39
+ - titanium_jasmine:
40
+ - id : git://github.com/guilhermechapiewski/titanium-jasmine.git
41
+ - name : TitaniumJasmine
42
+ - description : provides testing for Appcelerator’s Titanium
43
+
@@ -0,0 +1,82 @@
1
+ require 'rubygems'
2
+ require 'cli-colorize'
3
+ require 'thor/group'
4
+ require 'hirb'
5
+ require File.dirname(__FILE__) + '/../view'
6
+ require File.dirname(__FILE__) + '/jam'
7
+
8
+ module Puer
9
+ module Generators
10
+ class Help < Jam
11
+ include CLIColorize
12
+
13
+ CLIColorize.default_color = :red
14
+ RENDER_OPTIONS = { :fields => [:category,:command,:description] }
15
+
16
+ # Add this generator to our puer
17
+ Puer::Generators.add_generator(:help, self)
18
+
19
+ # Define the source root
20
+ def self.source_root; File.expand_path(File.dirname(__FILE__)); end
21
+ def self.banner; "puer help"; end
22
+
23
+ # Include related modules
24
+ include Thor::Actions
25
+ include Puer::Generators::Actions
26
+
27
+ desc "Description:\n\n\tpuer help screen"
28
+ argument :name, :default => ""
29
+
30
+ def create_help
31
+ @developer = "eiffel"
32
+ @created_on = Date.today.to_s
33
+ puts colorize( "Puer Version: #{Puer::Version::STRING}", { :foreground => :red, :background => :white, :config => :underline } )
34
+ puts
35
+ puts "Puer is a Titanium Starter Project Generate Tool"
36
+ puts
37
+ require 'yaml'
38
+ gistfile = File.expand_path("~") + '/.puer/gist.yml'
39
+ Gist::update_gist unless File.exist?(gistfile)
40
+ begin
41
+ g = YAML.load_file(gistfile)
42
+ rescue ArgumentError => e
43
+ g = YAML.load_file(File.expand_path(File.dirname(__FILE__) + '/gist.yml'))
44
+ end
45
+ puts "notice: a new version '#{g['info']}' released" if g['info'] and g['info'].strip != "#{Puer::Version::STRING}"
46
+ puts
47
+ puts colorize("Generator Options")
48
+ opt = [{ :category => "generator", :command => "puer controller controller_name", :description => "generate controller for titanium"},
49
+ { :category => "generator", :command => "puer model model_name", :description => "generate model for titanium"},
50
+ { :category => "generator", :command => "puer xib", :description => "convert xib to js"}
51
+ ]
52
+ View.render(opt, RENDER_OPTIONS)
53
+ puts
54
+ g.each_pair {|key,value|
55
+ gitopt = []
56
+ gname = key.downcase.gsub('_',' ')
57
+ puts
58
+ if gname == 'lib'
59
+ puts colorize("Framework Lib")
60
+ else
61
+ puts colorize("Gist Category [#{gname}]") unless gname == 'info'
62
+ end
63
+ unless gname == 'info'
64
+ g[key].each { |k|
65
+ k.each_pair { |k1,v1|
66
+ if gname == 'lib'
67
+ gitopt << {:category => "#{key.gsub('_',' ')}", :command => "puer lib #{k1}", :description => "#{k[k1][2]['description']}" }
68
+ else
69
+ gitopt << {:category => "#{key.gsub('_',' ')}", :command => "puer gist #{k1}", :description => "#{k[k1][2]['description']}" }
70
+ end
71
+ }
72
+ }
73
+ end
74
+ View.render(gitopt, RENDER_OPTIONS) unless gname == 'info'
75
+ }
76
+ puts
77
+ end
78
+
79
+ end # Search
80
+ end # Generators
81
+ end # Puer
82
+
@@ -0,0 +1,80 @@
1
+ require 'thor'
2
+ require 'hirb'
3
+ require 'thor/group'
4
+ require 'thor/actions'
5
+ require 'active_support/core_ext/string'
6
+ require 'active_support/inflector'
7
+ require 'date'
8
+ require File.dirname(__FILE__) + '/actions'
9
+ require File.dirname(__FILE__) + '/../view'
10
+
11
+ module Puer
12
+ module Generators
13
+ class Jam < Thor::Group
14
+
15
+ def self.init_generator
16
+ # Define the source template root
17
+ def self.source_root; File.expand_path(File.dirname(__FILE__)); end
18
+ def self.banner; "puer #{self.to_s.downcase.intern} [name]"; end
19
+
20
+ # Include related modules
21
+ include Thor::Actions
22
+ include Puer::Generators::Actions
23
+ end
24
+
25
+ def self.parseTemplate(data)
26
+ eval(data)
27
+ end
28
+
29
+ desc "Description:\n\n\tthis should not be used, only acts as Parent Class"
30
+
31
+ argument :name, :desc => "The name of your #{self.to_s.downcase.intern}"
32
+
33
+ class_option :root, :desc => "The root destination", :aliases => '-r', :default => ".", :type => :string
34
+ class_option :destroy, :aliases => '-d', :default => false, :type => :boolean
35
+
36
+ def in_app_root?
37
+ # File.exist?('Classes')
38
+ Dir.glob("tiapp.xml").count >= 1
39
+ end
40
+
41
+ def create_jam
42
+ valid_constant?(options["#{self.to_s.downcase.intern}"] || name)
43
+ @jam_name = (options["#{self.to_s.downcase.intern}"] || name).gsub(/\W/, "_").downcase
44
+ @developer = "#{`whoami`.strip}"
45
+ @created_on = Date.today.to_s
46
+ self.destination_root = options[:root]
47
+ project = options["#{self.to_s.downcase.intern}"]
48
+ self.behavior = :revoke if options[:destroy]
49
+
50
+ #empty_directory "#{@jam_name}"
51
+
52
+ # View.render(options)
53
+ # say (<<-TEXT).gsub(/ {10}/,'')
54
+ #
55
+ # =================================================================
56
+ # Your #{@jam_name} has been generated.
57
+ # =================================================================
58
+ #
59
+ # TEXT
60
+ end
61
+
62
+ class << self
63
+ # The methods below define the JAM DSL.
64
+ attr_reader :stable, :unstable
65
+
66
+ def self.attr_rw(*attrs)
67
+ attrs.each do |attr|
68
+ class_eval %Q{
69
+ def #{attr}(val=nil)
70
+ val.nil? ? @#{attr} : @#{attr} = val
71
+ end
72
+ }
73
+ end
74
+ end
75
+ attr_rw :version, :homepage, :author, :email, :data
76
+ end
77
+
78
+ end # Jam
79
+ end # Generators
80
+ end # Puer