mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			175 Commits
		
	
	
		
			test/attri
			...
			v3.3.0
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					afb6041104 | ||
| 
						 | 
					4b28fdbc4d | ||
| 
						 | 
					4f14db10ea | ||
| 
						 | 
					98e348ba5f | ||
| 
						 | 
					a69b20c1a4 | ||
| 
						 | 
					9275e5240f | ||
| 
						 | 
					7dcc3b3edf | ||
| 
						 | 
					6e872c11b6 | ||
| 
						 | 
					e5b6001759 | ||
| 
						 | 
					769f1b8658 | ||
| 
						 | 
					5814b61356 | ||
| 
						 | 
					8a6d7f67ed | ||
| 
						 | 
					bcb016a938 | ||
| 
						 | 
					065c6c02a8 | ||
| 
						 | 
					f7386fcd72 | ||
| 
						 | 
					df703ef997 | ||
| 
						 | 
					9f6c421d91 | ||
| 
						 | 
					91370ae955 | ||
| 
						 | 
					ffc0be191e | ||
| 
						 | 
					6e9f6da2a2 | ||
| 
						 | 
					c8cb7b7cab | ||
| 
						 | 
					7baa130d8d | ||
| 
						 | 
					332d97b57f | ||
| 
						 | 
					9c0dbdd48e | ||
| 
						 | 
					bec0052065 | ||
| 
						 | 
					5010f32421 | ||
| 
						 | 
					ded4672ccc | ||
| 
						 | 
					03bb48cf28 | ||
| 
						 | 
					e71eefe8fc | ||
| 
						 | 
					c203781e1b | ||
| 
						 | 
					7a2be16d77 | ||
| 
						 | 
					77126e9e17 | ||
| 
						 | 
					d1d5c61df5 | ||
| 
						 | 
					09323c8bbc | ||
| 
						 | 
					ac9f82544a | ||
| 
						 | 
					2e4e602787 | ||
| 
						 | 
					9d0ba5801b | ||
| 
						 | 
					0cd7d85ec4 | ||
| 
						 | 
					b0f674e511 | ||
| 
						 | 
					2b411aad90 | ||
| 
						 | 
					1c6483a499 | ||
| 
						 | 
					6edf4498ce | ||
| 
						 | 
					b160a39678 | ||
| 
						 | 
					86b4de89bd | ||
| 
						 | 
					a35d9a8d29 | ||
| 
						 | 
					8012876d5e | ||
| 
						 | 
					2e3e8c5b89 | ||
| 
						 | 
					5284608942 | ||
| 
						 | 
					ea2c7d8b27 | ||
| 
						 | 
					b0db064d09 | ||
| 
						 | 
					3ff1e38f6c | ||
| 
						 | 
					b533b682d5 | ||
| 
						 | 
					f59cf24a82 | ||
| 
						 | 
					f87436d499 | ||
| 
						 | 
					178d4756ef | ||
| 
						 | 
					5152bd7124 | ||
| 
						 | 
					b5015b6cc7 | ||
| 
						 | 
					097900a327 | ||
| 
						 | 
					1d2a6c38c7 | ||
| 
						 | 
					cc87ceb0d5 | ||
| 
						 | 
					a38f77683b | ||
| 
						 | 
					d8da05cde2 | ||
| 
						 | 
					554b5bfe7f | ||
| 
						 | 
					86aa4c3f3d | ||
| 
						 | 
					19b8721225 | ||
| 
						 | 
					0cb1ebc41e | ||
| 
						 | 
					c7c4883f49 | ||
| 
						 | 
					d8b4d4639c | ||
| 
						 | 
					ebe45e6f37 | ||
| 
						 | 
					cb016f8439 | ||
| 
						 | 
					92212d2652 | ||
| 
						 | 
					950882be78 | ||
| 
						 | 
					036855072e | ||
| 
						 | 
					29bbf50900 | ||
| 
						 | 
					ca59303dba | ||
| 
						 | 
					e21f35039b | ||
| 
						 | 
					f2b377fae8 | ||
| 
						 | 
					24a36bf4bb | ||
| 
						 | 
					3284450dc4 | ||
| 
						 | 
					ea9d326819 | ||
| 
						 | 
					4cc679c1e5 | ||
| 
						 | 
					c49ce55714 | ||
| 
						 | 
					9d4b5416a5 | ||
| 
						 | 
					82285df54b | ||
| 
						 | 
					e67c1789b8 | ||
| 
						 | 
					015af19eaf | ||
| 
						 | 
					156985ed52 | ||
| 
						 | 
					71d1bd75c0 | ||
| 
						 | 
					8e7c9c4bc4 | ||
| 
						 | 
					7b7236fe30 | ||
| 
						 | 
					55d997f43a | ||
| 
						 | 
					1829b38339 | ||
| 
						 | 
					e4c28e12cf | ||
| 
						 | 
					066cf45f4a | ||
| 
						 | 
					ac32b09a6b | ||
| 
						 | 
					92296f4b4b | ||
| 
						 | 
					3b4d2499eb | ||
| 
						 | 
					f38e15790e | ||
| 
						 | 
					b67c2bc2b2 | ||
| 
						 | 
					393c9b759e | ||
| 
						 | 
					54a7cf6785 | ||
| 
						 | 
					1cf7a6389c | ||
| 
						 | 
					c204d7c297 | ||
| 
						 | 
					5932f5f273 | ||
| 
						 | 
					98977c87db | ||
| 
						 | 
					ff457af2d4 | ||
| 
						 | 
					0e86ab9044 | ||
| 
						 | 
					3d39e842ec | ||
| 
						 | 
					16c1aa2845 | ||
| 
						 | 
					d0cf883558 | ||
| 
						 | 
					64e4830aad | ||
| 
						 | 
					0c47f2af75 | ||
| 
						 | 
					14c5d8c95a | ||
| 
						 | 
					6850499056 | ||
| 
						 | 
					9288f784a1 | ||
| 
						 | 
					dab75f6f97 | ||
| 
						 | 
					8cdb8ed48d | ||
| 
						 | 
					417bf7e1c9 | ||
| 
						 | 
					149f8967ad | ||
| 
						 | 
					e376fe921b | ||
| 
						 | 
					8d8020ddb5 | ||
| 
						 | 
					7d13b9eb99 | ||
| 
						 | 
					6ed0a05b44 | ||
| 
						 | 
					c4c479578a | ||
| 
						 | 
					441caa91dd | ||
| 
						 | 
					20154eb049 | ||
| 
						 | 
					84ea710d42 | ||
| 
						 | 
					8d524d618e | ||
| 
						 | 
					9fa34ab1fe | ||
| 
						 | 
					47db1cf1ac | ||
| 
						 | 
					f2f9b70659 | ||
| 
						 | 
					61c93ab08c | ||
| 
						 | 
					d72f3fae33 | ||
| 
						 | 
					3f14d15722 | ||
| 
						 | 
					963c0b46a0 | ||
| 
						 | 
					66b4977a67 | ||
| 
						 | 
					126c2147e9 | ||
| 
						 | 
					f7c42a4e6a | ||
| 
						 | 
					b1ea1fd96f | ||
| 
						 | 
					a5475bf839 | ||
| 
						 | 
					be9e187cc6 | ||
| 
						 | 
					d5098c6f66 | ||
| 
						 | 
					41fc785330 | ||
| 
						 | 
					4d83bf34f3 | ||
| 
						 | 
					3a797e2583 | ||
| 
						 | 
					7802030a53 | ||
| 
						 | 
					e8e1e0ca23 | ||
| 
						 | 
					973431be40 | ||
| 
						 | 
					24fb5a8e29 | ||
| 
						 | 
					37d161c290 | ||
| 
						 | 
					ddefa5f9e6 | ||
| 
						 | 
					955dd3d4d5 | ||
| 
						 | 
					d125205564 | ||
| 
						 | 
					7fa1b52497 | ||
| 
						 | 
					a90d21899a | ||
| 
						 | 
					569058f481 | ||
| 
						 | 
					4ecda08f1f | ||
| 
						 | 
					3b23059c09 | ||
| 
						 | 
					a474ffc101 | ||
| 
						 | 
					f7672b837a | ||
| 
						 | 
					5235871fd8 | ||
| 
						 | 
					cac9873e20 | ||
| 
						 | 
					9094923de9 | ||
| 
						 | 
					6454c96e6a | ||
| 
						 | 
					7fbb9edc0f | ||
| 
						 | 
					0a717f5c81 | ||
| 
						 | 
					dab9777621 | ||
| 
						 | 
					c8d1e9def1 | ||
| 
						 | 
					272dd45a43 | ||
| 
						 | 
					5abec96df7 | ||
| 
						 | 
					e860f961a9 | ||
| 
						 | 
					c4b876472f | ||
| 
						 | 
					5580f39df2 | ||
| 
						 | 
					d94bffb198 | ||
| 
						 | 
					2beb450df6 | 
							
								
								
									
										0
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,3 +1,5 @@
 | 
				
			|||||||
Gemfile.lock
 | 
					Gemfile.lock
 | 
				
			||||||
.bundle/
 | 
					.bundle/
 | 
				
			||||||
vendor/
 | 
					vendor/
 | 
				
			||||||
 | 
					benchmark/
 | 
				
			||||||
 | 
					lib/linguist/samples.json
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
before_install: 
 | 
					before_install:
 | 
				
			||||||
  - git fetch origin master:master
 | 
					  - git fetch origin master:master
 | 
				
			||||||
  - git fetch origin v2.0.0:v2.0.0
 | 
					  - git fetch origin v2.0.0:v2.0.0
 | 
				
			||||||
 | 
					  - git fetch origin test/attributes:test/attributes
 | 
				
			||||||
  - sudo apt-get install libicu-dev -y
 | 
					  - sudo apt-get install libicu-dev -y
 | 
				
			||||||
  - gem update --system 2.1.11
 | 
					 | 
				
			||||||
rvm:
 | 
					rvm:
 | 
				
			||||||
  - 1.9.3
 | 
					  - 1.9.3
 | 
				
			||||||
  - 2.0.0
 | 
					  - 2.0.0
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Gemfile
									
									
									
									
									
								
							@@ -1,2 +1,3 @@
 | 
				
			|||||||
source 'https://rubygems.org'
 | 
					source 'https://rubygems.org'
 | 
				
			||||||
gemspec
 | 
					gemspec
 | 
				
			||||||
 | 
					gem 'rugged', '0.21.1b2'
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										60
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								README.md
									
									
									
									
									
								
							@@ -32,33 +32,57 @@ The Language stats bar that you see on every repository is built by aggregating
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
The repository stats API, accessed through `#languages`, can be used on a directory:
 | 
					The repository stats API, accessed through `#languages`, can be used on a directory:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					***API UPDATE***
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Since [Version 3.0.0](https://github.com/github/linguist/releases/tag/v3.0.0) Linguist requires a git repository (in the form of a [Rugged::Repository](https://github.com/libgit2/rugged#repositories)) to be passed when initializing `Linguist::Repository`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```ruby
 | 
					```ruby
 | 
				
			||||||
project = Linguist::Repository.from_directory(".")
 | 
					require 'rugged'
 | 
				
			||||||
project.language.name  #=> "Ruby"
 | 
					require 'linguist'
 | 
				
			||||||
project.languages      #=> { "Ruby" => 0.98, "Shell" => 0.02 }
 | 
					
 | 
				
			||||||
 | 
					repo = Rugged::Repository.new('.')
 | 
				
			||||||
 | 
					project = Linguist::Repository.new(repo, repo.head.target_id)
 | 
				
			||||||
 | 
					project.language       #=> "Ruby"
 | 
				
			||||||
 | 
					project.languages      #=> { "Ruby" => 119387 }
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
These stats are also printed out by the `linguist` binary. You can use the
 | 
					These stats are also printed out by the `linguist` binary. You can use the
 | 
				
			||||||
`--breakdown` flag, and the binary will also output the breakdown of files by language.
 | 
					`--breakdown` flag, and the binary will also output the breakdown of files by language.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
You can try running `linguist` on the `lib/` directory in this repository itself:
 | 
					You can try running `linguist` on the root directory in this repository itself:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $ bundle exec linguist lib/ --breakdown
 | 
					    $ bundle exec linguist --breakdown
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    100.00% Ruby
 | 
					    100.00% Ruby
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Ruby:
 | 
					    Ruby:
 | 
				
			||||||
    linguist/blob_helper.rb
 | 
					    Gemfile
 | 
				
			||||||
    linguist/classifier.rb
 | 
					    Rakefile
 | 
				
			||||||
    linguist/file_blob.rb
 | 
					    bin/linguist
 | 
				
			||||||
    linguist/generated.rb
 | 
					    github-linguist.gemspec
 | 
				
			||||||
    linguist/heuristics.rb
 | 
					    lib/linguist.rb
 | 
				
			||||||
    linguist/language.rb
 | 
					    lib/linguist/blob_helper.rb
 | 
				
			||||||
    linguist/md5.rb
 | 
					    lib/linguist/classifier.rb
 | 
				
			||||||
    linguist/repository.rb
 | 
					    lib/linguist/file_blob.rb
 | 
				
			||||||
    linguist/samples.rb
 | 
					    lib/linguist/generated.rb
 | 
				
			||||||
    linguist/tokenizer.rb
 | 
					    lib/linguist/heuristics.rb
 | 
				
			||||||
    linguist.rb
 | 
					    lib/linguist/language.rb
 | 
				
			||||||
 | 
					    lib/linguist/lazy_blob.rb
 | 
				
			||||||
 | 
					    lib/linguist/md5.rb
 | 
				
			||||||
 | 
					    lib/linguist/repository.rb
 | 
				
			||||||
 | 
					    lib/linguist/samples.rb
 | 
				
			||||||
 | 
					    lib/linguist/tokenizer.rb
 | 
				
			||||||
 | 
					    lib/linguist/version.rb
 | 
				
			||||||
 | 
					    test/test_blob.rb
 | 
				
			||||||
 | 
					    test/test_classifier.rb
 | 
				
			||||||
 | 
					    test/test_heuristics.rb
 | 
				
			||||||
 | 
					    test/test_language.rb
 | 
				
			||||||
 | 
					    test/test_md5.rb
 | 
				
			||||||
 | 
					    test/test_pedantic.rb
 | 
				
			||||||
 | 
					    test/test_repository.rb
 | 
				
			||||||
 | 
					    test/test_samples.rb
 | 
				
			||||||
 | 
					    test/test_tokenizer.rb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Ignore vendored files
 | 
					#### Ignore vendored files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -102,10 +126,6 @@ We try to only add languages once they have some usage on GitHub, so please note
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Almost all bug fixes or new language additions should come with some additional code samples. Just drop them under [`samples/`](https://github.com/github/linguist/tree/master/samples) in the correct subdirectory and our test suite will automatically test them. In most cases you shouldn't need to add any new assertions.
 | 
					Almost all bug fixes or new language additions should come with some additional code samples. Just drop them under [`samples/`](https://github.com/github/linguist/tree/master/samples) in the correct subdirectory and our test suite will automatically test them. In most cases you shouldn't need to add any new assertions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
To update the `samples.json` after adding new files to [`samples/`](https://github.com/github/linguist/tree/master/samples):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bundle exec rake samples
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### A note on language extensions
 | 
					### A note on language extensions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Linguist has a number of methods available to it for identifying the language of a particular file. The initial lookup is based upon the extension of the file, possible file extensions are defined in an array called `extensions`. Take a look at this example for example for `Perl`:
 | 
					Linguist has a number of methods available to it for identifying the language of a particular file. The initial lookup is based upon the extension of the file, possible file extensions are defined in an array called `extensions`. Take a look at this example for example for `Perl`:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										82
									
								
								Rakefile
									
									
									
									
									
								
							
							
						
						
									
										82
									
								
								Rakefile
									
									
									
									
									
								
							@@ -7,6 +7,16 @@ task :default => :test
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Rake::TestTask.new
 | 
					Rake::TestTask.new
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Extend test task to check for samples
 | 
				
			||||||
 | 
					task :test => :check_samples
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					desc "Check that we have samples.json generated"
 | 
				
			||||||
 | 
					task :check_samples do
 | 
				
			||||||
 | 
					  unless File.exist?('lib/linguist/samples.json')
 | 
				
			||||||
 | 
					    Rake::Task[:samples].invoke
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
task :samples do
 | 
					task :samples do
 | 
				
			||||||
  require 'linguist/samples'
 | 
					  require 'linguist/samples'
 | 
				
			||||||
  require 'yajl'
 | 
					  require 'yajl'
 | 
				
			||||||
@@ -15,13 +25,74 @@ task :samples do
 | 
				
			|||||||
  File.open('lib/linguist/samples.json', 'w') { |io| io.write json }
 | 
					  File.open('lib/linguist/samples.json', 'w') { |io| io.write json }
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
task :build_gem do
 | 
					task :build_gem => :samples do
 | 
				
			||||||
  languages = YAML.load_file("lib/linguist/languages.yml")
 | 
					  languages = YAML.load_file("lib/linguist/languages.yml")
 | 
				
			||||||
  File.write("lib/linguist/languages.json", JSON.dump(languages))
 | 
					  File.write("lib/linguist/languages.json", JSON.dump(languages))
 | 
				
			||||||
  `gem build github-linguist.gemspec`
 | 
					  `gem build github-linguist.gemspec`
 | 
				
			||||||
  File.delete("lib/linguist/languages.json")
 | 
					  File.delete("lib/linguist/languages.json")
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace :benchmark do
 | 
				
			||||||
 | 
					  benchmark_path = "benchmark/results"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # $ bundle exec rake benchmark:generate CORPUS=path/to/samples
 | 
				
			||||||
 | 
					  desc "Generate results for"
 | 
				
			||||||
 | 
					  task :generate do
 | 
				
			||||||
 | 
					    ref = `git rev-parse HEAD`.strip[0,8]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    corpus = File.expand_path(ENV["CORPUS"] || "samples")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    require 'linguist/language'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    results = Hash.new
 | 
				
			||||||
 | 
					    Dir.glob("#{corpus}/**/*").each do |file|
 | 
				
			||||||
 | 
					      next unless File.file?(file)
 | 
				
			||||||
 | 
					      filename = file.gsub("#{corpus}/", "")
 | 
				
			||||||
 | 
					      results[filename] = Linguist::FileBlob.new(file).language
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Ensure results directory exists
 | 
				
			||||||
 | 
					    FileUtils.mkdir_p("benchmark/results")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Write results
 | 
				
			||||||
 | 
					    if `git status`.include?('working directory clean')
 | 
				
			||||||
 | 
					      result_filename = "benchmark/results/#{File.basename(corpus)}-#{ref}.json"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      result_filename = "benchmark/results/#{File.basename(corpus)}-#{ref}-unstaged.json"
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    File.write(result_filename, results.to_json)
 | 
				
			||||||
 | 
					    puts "wrote #{result_filename}"
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # $ bundle exec rake benchmark:compare REFERENCE=path/to/reference.json CANDIDATE=path/to/candidate.json
 | 
				
			||||||
 | 
					  desc "Compare results"
 | 
				
			||||||
 | 
					  task :compare do
 | 
				
			||||||
 | 
					    reference_file = ENV["REFERENCE"]
 | 
				
			||||||
 | 
					    candidate_file = ENV["CANDIDATE"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    reference = JSON.parse(File.read(reference_file))
 | 
				
			||||||
 | 
					    reference_counts = Hash.new(0)
 | 
				
			||||||
 | 
					    reference.each { |filename, language| reference_counts[language] += 1 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    candidate = JSON.parse(File.read(candidate_file))
 | 
				
			||||||
 | 
					    candidate_counts = Hash.new(0)
 | 
				
			||||||
 | 
					    candidate.each { |filename, language| candidate_counts[language] += 1 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    changes = diff(reference_counts, candidate_counts)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if changes.any?
 | 
				
			||||||
 | 
					      changes.each do |language, (before, after)|
 | 
				
			||||||
 | 
					        before_percent = 100 * before / reference.size.to_f
 | 
				
			||||||
 | 
					        after_percent = 100 * after / candidate.size.to_f
 | 
				
			||||||
 | 
					        puts "%s changed from %.1f%% to %.1f%%" % [language || 'unknown', before_percent, after_percent]
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      puts "No changes"
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace :classifier do
 | 
					namespace :classifier do
 | 
				
			||||||
  LIMIT = 1_000
 | 
					  LIMIT = 1_000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -37,7 +108,7 @@ namespace :classifier do
 | 
				
			|||||||
      next if file_language.nil? || file_language == 'Text'
 | 
					      next if file_language.nil? || file_language == 'Text'
 | 
				
			||||||
      begin
 | 
					      begin
 | 
				
			||||||
        data = open(file_url).read
 | 
					        data = open(file_url).read
 | 
				
			||||||
        guessed_language, score = Linguist::Classifier.classify(Linguist::Samples::DATA, data).first
 | 
					        guessed_language, score = Linguist::Classifier.classify(Linguist::Samples.cache, data).first
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        total += 1
 | 
					        total += 1
 | 
				
			||||||
        guessed_language == file_language ? correct += 1 : incorrect += 1
 | 
					        guessed_language == file_language ? correct += 1 : incorrect += 1
 | 
				
			||||||
@@ -71,3 +142,10 @@ namespace :classifier do
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def diff(a, b)
 | 
				
			||||||
 | 
					  (a.keys | b.keys).each_with_object({}) do |key, diff|
 | 
				
			||||||
 | 
					    diff[key] = [a[key], b[key]] unless a[key] == b[key]
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,10 +17,10 @@ Gem::Specification.new do |s|
 | 
				
			|||||||
  s.add_dependency 'escape_utils',    '~> 1.0.1'
 | 
					  s.add_dependency 'escape_utils',    '~> 1.0.1'
 | 
				
			||||||
  s.add_dependency 'mime-types',      '~> 1.19'
 | 
					  s.add_dependency 'mime-types',      '~> 1.19'
 | 
				
			||||||
  s.add_dependency 'pygments.rb',     '~> 0.6.0'
 | 
					  s.add_dependency 'pygments.rb',     '~> 0.6.0'
 | 
				
			||||||
  s.add_dependency 'rugged',          '~> 0.21.0'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  s.add_development_dependency 'json'
 | 
					  s.add_development_dependency 'json'
 | 
				
			||||||
  s.add_development_dependency 'mocha'
 | 
					  s.add_development_dependency 'mocha'
 | 
				
			||||||
 | 
					  s.add_development_dependency 'pry'
 | 
				
			||||||
  s.add_development_dependency 'rake'
 | 
					  s.add_development_dependency 'rake'
 | 
				
			||||||
  s.add_development_dependency 'yajl-ruby'
 | 
					  s.add_development_dependency 'yajl-ruby'
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -321,6 +321,11 @@ module Linguist
 | 
				
			|||||||
      language ? language.lexer : Pygments::Lexer.find_by_name('Text only')
 | 
					      language ? language.lexer : Pygments::Lexer.find_by_name('Text only')
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Internal: Get the TextMate compatible scope for the blob
 | 
				
			||||||
 | 
					    def tm_scope
 | 
				
			||||||
 | 
					      language && language.tm_scope
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Public: Highlight syntax of blob
 | 
					    # Public: Highlight syntax of blob
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
    # options - A Hash of options (defaults to {})
 | 
					    # options - A Hash of options (defaults to {})
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -63,6 +63,7 @@ module Linguist
 | 
				
			|||||||
        generated_jni_header? ||
 | 
					        generated_jni_header? ||
 | 
				
			||||||
        composer_lock? ||
 | 
					        composer_lock? ||
 | 
				
			||||||
        node_modules? ||
 | 
					        node_modules? ||
 | 
				
			||||||
 | 
					        godeps? ||
 | 
				
			||||||
        vcr_cassette? ||
 | 
					        vcr_cassette? ||
 | 
				
			||||||
        generated_by_zephir?
 | 
					        generated_by_zephir?
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
@@ -231,6 +232,14 @@ module Linguist
 | 
				
			|||||||
      !!name.match(/node_modules\//)
 | 
					      !!name.match(/node_modules\//)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Internal: Is the blob part of Godeps/,
 | 
				
			||||||
 | 
					    # which are not meant for humans in pull requests.
 | 
				
			||||||
 | 
					    #
 | 
				
			||||||
 | 
					    # Returns true or false.
 | 
				
			||||||
 | 
					    def godeps?
 | 
				
			||||||
 | 
					      !!name.match(/Godeps\//)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Internal: Is the blob a generated php composer lock file?
 | 
					    # Internal: Is the blob a generated php composer lock file?
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
    # Returns true or false.
 | 
					    # Returns true or false.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,11 +19,17 @@ module Linguist
 | 
				
			|||||||
        if languages.all? { |l| ["ECL", "Prolog"].include?(l) }
 | 
					        if languages.all? { |l| ["ECL", "Prolog"].include?(l) }
 | 
				
			||||||
          result = disambiguate_ecl(data, languages)
 | 
					          result = disambiguate_ecl(data, languages)
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
 | 
					        if languages.all? { |l| ["IDL", "Prolog"].include?(l) }
 | 
				
			||||||
 | 
					          result = disambiguate_pro(data, languages)
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					        if languages.all? { |l| ["Common Lisp", "OpenCL"].include?(l) }
 | 
				
			||||||
 | 
					          result = disambiguate_cl(data, languages)
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
        return result
 | 
					        return result
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # .h extensions are ambigious between C, C++, and Objective-C.
 | 
					    # .h extensions are ambiguous between C, C++, and Objective-C.
 | 
				
			||||||
    # We want to shortcut look for Objective-C _and_ now C++ too!
 | 
					    # We want to shortcut look for Objective-C _and_ now C++ too!
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
    # Returns an array of Languages or []
 | 
					    # Returns an array of Languages or []
 | 
				
			||||||
@@ -48,6 +54,16 @@ module Linguist
 | 
				
			|||||||
      matches
 | 
					      matches
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def self.disambiguate_pro(data, languages)
 | 
				
			||||||
 | 
					      matches = []
 | 
				
			||||||
 | 
					      if (data.include?(":-"))
 | 
				
			||||||
 | 
					        matches << Language["Prolog"]
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        matches << Language["IDL"]
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					      matches
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def self.disambiguate_ts(data, languages)
 | 
					    def self.disambiguate_ts(data, languages)
 | 
				
			||||||
      matches = []
 | 
					      matches = []
 | 
				
			||||||
      if (data.include?("</translation>"))
 | 
					      if (data.include?("</translation>"))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -135,8 +135,8 @@ module Linguist
 | 
				
			|||||||
        # No shebang. Still more work to do. Try to find it with our heuristics.
 | 
					        # No shebang. Still more work to do. Try to find it with our heuristics.
 | 
				
			||||||
        elsif (determined = Heuristics.find_by_heuristics(data, possible_language_names)) && !determined.empty?
 | 
					        elsif (determined = Heuristics.find_by_heuristics(data, possible_language_names)) && !determined.empty?
 | 
				
			||||||
          determined.first
 | 
					          determined.first
 | 
				
			||||||
        # Lastly, fall back to the probablistic classifier.
 | 
					        # Lastly, fall back to the probabilistic classifier.
 | 
				
			||||||
        elsif classified = Classifier.classify(Samples::DATA, data, possible_language_names).first
 | 
					        elsif classified = Classifier.classify(Samples.cache, data, possible_language_names).first
 | 
				
			||||||
          # Return the actual Language object based of the string language name (i.e., first element of `#classify`)
 | 
					          # Return the actual Language object based of the string language name (i.e., first element of `#classify`)
 | 
				
			||||||
          Language[classified[0]]
 | 
					          Language[classified[0]]
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
@@ -290,6 +290,16 @@ module Linguist
 | 
				
			|||||||
      @lexer = Pygments::Lexer.find_by_name(attributes[:lexer] || name) ||
 | 
					      @lexer = Pygments::Lexer.find_by_name(attributes[:lexer] || name) ||
 | 
				
			||||||
        raise(ArgumentError, "#{@name} is missing lexer")
 | 
					        raise(ArgumentError, "#{@name} is missing lexer")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @tm_scope = attributes[:tm_scope] || begin
 | 
				
			||||||
 | 
					        context = case @type
 | 
				
			||||||
 | 
					                  when :data, :markup, :prose
 | 
				
			||||||
 | 
					                    'text'
 | 
				
			||||||
 | 
					                  when :programming, nil
 | 
				
			||||||
 | 
					                    'source'
 | 
				
			||||||
 | 
					                  end
 | 
				
			||||||
 | 
					        "#{context}.#{@name.downcase}"
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      @ace_mode = attributes[:ace_mode]
 | 
					      @ace_mode = attributes[:ace_mode]
 | 
				
			||||||
      @wrap = attributes[:wrap] || false
 | 
					      @wrap = attributes[:wrap] || false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -363,6 +373,11 @@ module Linguist
 | 
				
			|||||||
    # Returns the Lexer
 | 
					    # Returns the Lexer
 | 
				
			||||||
    attr_reader :lexer
 | 
					    attr_reader :lexer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Public: Get the name of a TextMate-compatible scope
 | 
				
			||||||
 | 
					    #
 | 
				
			||||||
 | 
					    # Returns the scope
 | 
				
			||||||
 | 
					    attr_reader :tm_scope
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Public: Get Ace mode
 | 
					    # Public: Get Ace mode
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
    # Examples
 | 
					    # Examples
 | 
				
			||||||
@@ -510,9 +525,9 @@ module Linguist
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  extensions = Samples::DATA['extnames']
 | 
					  extensions = Samples.cache['extnames']
 | 
				
			||||||
  interpreters = Samples::DATA['interpreters']
 | 
					  interpreters = Samples.cache['interpreters']
 | 
				
			||||||
  filenames = Samples::DATA['filenames']
 | 
					  filenames = Samples.cache['filenames']
 | 
				
			||||||
  popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__))
 | 
					  popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  languages_yml = File.expand_path("../languages.yml", __FILE__)
 | 
					  languages_yml = File.expand_path("../languages.yml", __FILE__)
 | 
				
			||||||
@@ -564,6 +579,7 @@ module Linguist
 | 
				
			|||||||
      :type              => options['type'],
 | 
					      :type              => options['type'],
 | 
				
			||||||
      :aliases           => options['aliases'],
 | 
					      :aliases           => options['aliases'],
 | 
				
			||||||
      :lexer             => options['lexer'],
 | 
					      :lexer             => options['lexer'],
 | 
				
			||||||
 | 
					      :tm_scope          => options['tm_scope'],
 | 
				
			||||||
      :ace_mode          => options['ace_mode'],
 | 
					      :ace_mode          => options['ace_mode'],
 | 
				
			||||||
      :wrap              => options['wrap'],
 | 
					      :wrap              => options['wrap'],
 | 
				
			||||||
      :group_name        => options['group'],
 | 
					      :group_name        => options['group'],
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -83,6 +83,7 @@ ATS:
 | 
				
			|||||||
ActionScript:
 | 
					ActionScript:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
  lexer: ActionScript 3
 | 
					  lexer: ActionScript 3
 | 
				
			||||||
 | 
					  tm_scope: source.actionscript.3
 | 
				
			||||||
  color: "#e3491a"
 | 
					  color: "#e3491a"
 | 
				
			||||||
  search_term: as3
 | 
					  search_term: as3
 | 
				
			||||||
  aliases:
 | 
					  aliases:
 | 
				
			||||||
@@ -119,7 +120,7 @@ ApacheConf:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Apex:
 | 
					Apex:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
  lexer: Text only
 | 
					  lexer: Java
 | 
				
			||||||
  extensions:
 | 
					  extensions:
 | 
				
			||||||
  - .cls
 | 
					  - .cls
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -282,8 +283,9 @@ C:
 | 
				
			|||||||
C#:
 | 
					C#:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
  ace_mode: csharp
 | 
					  ace_mode: csharp
 | 
				
			||||||
 | 
					  tm_scope: source.cs
 | 
				
			||||||
  search_term: csharp
 | 
					  search_term: csharp
 | 
				
			||||||
  color: "#5a25a2"
 | 
					  color: "#178600"
 | 
				
			||||||
  aliases:
 | 
					  aliases:
 | 
				
			||||||
  - csharp
 | 
					  - csharp
 | 
				
			||||||
  extensions:
 | 
					  extensions:
 | 
				
			||||||
@@ -411,6 +413,7 @@ Clojure:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
CoffeeScript:
 | 
					CoffeeScript:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
 | 
					  tm_scope: source.coffee
 | 
				
			||||||
  ace_mode: coffee
 | 
					  ace_mode: coffee
 | 
				
			||||||
  color: "#244776"
 | 
					  color: "#244776"
 | 
				
			||||||
  aliases:
 | 
					  aliases:
 | 
				
			||||||
@@ -453,6 +456,7 @@ ColdFusion CFC:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Common Lisp:
 | 
					Common Lisp:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
 | 
					  tm_scope: source.lisp
 | 
				
			||||||
  color: "#3fb68b"
 | 
					  color: "#3fb68b"
 | 
				
			||||||
  aliases:
 | 
					  aliases:
 | 
				
			||||||
  - lisp
 | 
					  - lisp
 | 
				
			||||||
@@ -648,6 +652,7 @@ Elm:
 | 
				
			|||||||
Emacs Lisp:
 | 
					Emacs Lisp:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
  lexer: Common Lisp
 | 
					  lexer: Common Lisp
 | 
				
			||||||
 | 
					  tm_scope: source.lisp
 | 
				
			||||||
  color: "#c065db"
 | 
					  color: "#c065db"
 | 
				
			||||||
  aliases:
 | 
					  aliases:
 | 
				
			||||||
  - elisp
 | 
					  - elisp
 | 
				
			||||||
@@ -748,6 +753,7 @@ Forth:
 | 
				
			|||||||
  - .fth
 | 
					  - .fth
 | 
				
			||||||
  - .4th
 | 
					  - .4th
 | 
				
			||||||
  - .forth
 | 
					  - .forth
 | 
				
			||||||
 | 
					  - .frt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Frege:
 | 
					Frege:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
@@ -756,6 +762,14 @@ Frege:
 | 
				
			|||||||
  extensions:
 | 
					  extensions:
 | 
				
			||||||
  - .fr
 | 
					  - .fr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G-code:
 | 
				
			||||||
 | 
					  type: data
 | 
				
			||||||
 | 
					  lexer: Text only
 | 
				
			||||||
 | 
					  extensions:
 | 
				
			||||||
 | 
					  - .g
 | 
				
			||||||
 | 
					  - .gco
 | 
				
			||||||
 | 
					  - .gcode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Game Maker Language:
 | 
					Game Maker Language:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
  color: "#8ad353"
 | 
					  color: "#8ad353"
 | 
				
			||||||
@@ -785,6 +799,12 @@ GAS:
 | 
				
			|||||||
  - .s
 | 
					  - .s
 | 
				
			||||||
  - .S
 | 
					  - .S
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GDScript:
 | 
				
			||||||
 | 
					  type: programming
 | 
				
			||||||
 | 
					  lexer: Text only
 | 
				
			||||||
 | 
					  extensions:
 | 
				
			||||||
 | 
					  - .gd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLSL:
 | 
					GLSL:
 | 
				
			||||||
  group: C
 | 
					  group: C
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
@@ -877,6 +897,12 @@ Grammatical Framework:
 | 
				
			|||||||
  searchable: true
 | 
					  searchable: true
 | 
				
			||||||
  color: "#ff0000"
 | 
					  color: "#ff0000"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Graph Modeling Language:
 | 
				
			||||||
 | 
					  type: data
 | 
				
			||||||
 | 
					  lexer: Text only
 | 
				
			||||||
 | 
					  extensions:
 | 
				
			||||||
 | 
					  - .gml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Groff:
 | 
					Groff:
 | 
				
			||||||
  extensions:
 | 
					  extensions:
 | 
				
			||||||
  - .man
 | 
					  - .man
 | 
				
			||||||
@@ -911,6 +937,7 @@ Groovy Server Pages:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
HTML:
 | 
					HTML:
 | 
				
			||||||
  type: markup
 | 
					  type: markup
 | 
				
			||||||
 | 
					  tm_scope: text.html.basic
 | 
				
			||||||
  ace_mode: html
 | 
					  ace_mode: html
 | 
				
			||||||
  aliases:
 | 
					  aliases:
 | 
				
			||||||
  - xhtml
 | 
					  - xhtml
 | 
				
			||||||
@@ -1137,6 +1164,7 @@ Java Server Pages:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
JavaScript:
 | 
					JavaScript:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
 | 
					  tm_scope: source.js
 | 
				
			||||||
  ace_mode: javascript
 | 
					  ace_mode: javascript
 | 
				
			||||||
  color: "#f1e05a"
 | 
					  color: "#f1e05a"
 | 
				
			||||||
  aliases:
 | 
					  aliases:
 | 
				
			||||||
@@ -1149,6 +1177,7 @@ JavaScript:
 | 
				
			|||||||
  - .es6
 | 
					  - .es6
 | 
				
			||||||
  - .frag
 | 
					  - .frag
 | 
				
			||||||
  - .jake
 | 
					  - .jake
 | 
				
			||||||
 | 
					  - .jsb
 | 
				
			||||||
  - .jsfl
 | 
					  - .jsfl
 | 
				
			||||||
  - .jsm
 | 
					  - .jsm
 | 
				
			||||||
  - .jss
 | 
					  - .jss
 | 
				
			||||||
@@ -1547,6 +1576,7 @@ ObjDump:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Objective-C:
 | 
					Objective-C:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
 | 
					  tm_scope: source.objc
 | 
				
			||||||
  color: "#438eff"
 | 
					  color: "#438eff"
 | 
				
			||||||
  aliases:
 | 
					  aliases:
 | 
				
			||||||
  - obj-c
 | 
					  - obj-c
 | 
				
			||||||
@@ -1647,6 +1677,7 @@ PAWN:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
PHP:
 | 
					PHP:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
 | 
					  tm_scope: text.html.php
 | 
				
			||||||
  ace_mode: php
 | 
					  ace_mode: php
 | 
				
			||||||
  color: "#4F5D95"
 | 
					  color: "#4F5D95"
 | 
				
			||||||
  extensions:
 | 
					  extensions:
 | 
				
			||||||
@@ -1704,6 +1735,7 @@ Pascal:
 | 
				
			|||||||
  - .dfm
 | 
					  - .dfm
 | 
				
			||||||
  - .dpr
 | 
					  - .dpr
 | 
				
			||||||
  - .lpr
 | 
					  - .lpr
 | 
				
			||||||
 | 
					  - .pp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Perl:
 | 
					Perl:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
@@ -1792,10 +1824,12 @@ Processing:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Prolog:
 | 
					Prolog:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
 | 
					  lexer: Logtalk
 | 
				
			||||||
  color: "#74283c"
 | 
					  color: "#74283c"
 | 
				
			||||||
  extensions:
 | 
					  extensions:
 | 
				
			||||||
  - .pl
 | 
					  - .pl
 | 
				
			||||||
  - .ecl
 | 
					  - .ecl
 | 
				
			||||||
 | 
					  - .pro
 | 
				
			||||||
  - .prolog
 | 
					  - .prolog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Propeller Spin:
 | 
					Propeller Spin:
 | 
				
			||||||
@@ -2065,6 +2099,7 @@ SQF:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
SQL:
 | 
					SQL:
 | 
				
			||||||
  type: data
 | 
					  type: data
 | 
				
			||||||
 | 
					  tm_scope: source.sql
 | 
				
			||||||
  ace_mode: sql
 | 
					  ace_mode: sql
 | 
				
			||||||
  extensions:
 | 
					  extensions:
 | 
				
			||||||
  - .sql
 | 
					  - .sql
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,13 @@
 | 
				
			|||||||
require 'linguist/blob_helper'
 | 
					require 'linguist/blob_helper'
 | 
				
			||||||
 | 
					require 'linguist/language'
 | 
				
			||||||
require 'rugged'
 | 
					require 'rugged'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module Linguist
 | 
					module Linguist
 | 
				
			||||||
  class LazyBlob
 | 
					  class LazyBlob
 | 
				
			||||||
 | 
					    GIT_ATTR = ['linguist-language', 'linguist-vendored']
 | 
				
			||||||
 | 
					    GIT_ATTR_OPTS = { :priority => [:index], :skip_system => true }
 | 
				
			||||||
 | 
					    GIT_ATTR_FLAGS = Rugged::Repository::Attributes.parse_opts(GIT_ATTR_OPTS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    include BlobHelper
 | 
					    include BlobHelper
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MAX_SIZE = 128 * 1024
 | 
					    MAX_SIZE = 128 * 1024
 | 
				
			||||||
@@ -19,6 +24,29 @@ module Linguist
 | 
				
			|||||||
      @mode = mode
 | 
					      @mode = mode
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def git_attributes
 | 
				
			||||||
 | 
					      @git_attributes ||= repository.fetch_attributes(
 | 
				
			||||||
 | 
					        name, GIT_ATTR, GIT_ATTR_FLAGS)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def vendored?
 | 
				
			||||||
 | 
					      if attr = git_attributes['linguist-vendored']
 | 
				
			||||||
 | 
					        return boolean_attribute(attr)
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        return super
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def language
 | 
				
			||||||
 | 
					      return @language if defined?(@language)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @language = if lang = git_attributes['linguist-language']
 | 
				
			||||||
 | 
					        Language.find_by_name(lang)
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        super
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def data
 | 
					    def data
 | 
				
			||||||
      load_blob!
 | 
					      load_blob!
 | 
				
			||||||
      @data
 | 
					      @data
 | 
				
			||||||
@@ -30,6 +58,12 @@ module Linguist
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protected
 | 
					    protected
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Returns true if the attribute is present and not the string "false".
 | 
				
			||||||
 | 
					    def boolean_attribute(attr)
 | 
				
			||||||
 | 
					      attr != "false"
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def load_blob!
 | 
					    def load_blob!
 | 
				
			||||||
      @data, @size = Rugged::Blob.to_buffer(repository, oid, MAX_SIZE) if @data.nil?
 | 
					      @data, @size = Rugged::Blob.to_buffer(repository, oid, MAX_SIZE) if @data.nil?
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -110,18 +110,30 @@ module Linguist
 | 
				
			|||||||
        if @old_commit_oid == @commit_oid
 | 
					        if @old_commit_oid == @commit_oid
 | 
				
			||||||
          @old_stats
 | 
					          @old_stats
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
          compute_stats(@old_commit_oid, @commit_oid, @old_stats)
 | 
					          compute_stats(@old_commit_oid, @old_stats)
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def read_index
 | 
				
			||||||
 | 
					      attr_index = Rugged::Index.new
 | 
				
			||||||
 | 
					      attr_index.read_tree(current_tree)
 | 
				
			||||||
 | 
					      repository.index = attr_index
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def current_tree
 | 
				
			||||||
 | 
					      @tree ||= Rugged::Commit.lookup(repository, @commit_oid).tree
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protected
 | 
					    protected
 | 
				
			||||||
    def compute_stats(old_commit_oid, commit_oid, cache = nil)
 | 
					
 | 
				
			||||||
 | 
					    def compute_stats(old_commit_oid, cache = nil)
 | 
				
			||||||
      file_map = cache ? cache.dup : {}
 | 
					      file_map = cache ? cache.dup : {}
 | 
				
			||||||
      old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree
 | 
					      old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree
 | 
				
			||||||
      new_tree = Rugged::Commit.lookup(repository, commit_oid).tree
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      diff = Rugged::Tree.diff(repository, old_tree, new_tree)
 | 
					      read_index
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      diff = Rugged::Tree.diff(repository, old_tree, current_tree)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      diff.each_delta do |delta|
 | 
					      diff.each_delta do |delta|
 | 
				
			||||||
        old = delta.old_file[:path]
 | 
					        old = delta.old_file[:path]
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -17,9 +17,11 @@ module Linguist
 | 
				
			|||||||
    PATH = File.expand_path('../samples.json', __FILE__)
 | 
					    PATH = File.expand_path('../samples.json', __FILE__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Hash of serialized samples object
 | 
					    # Hash of serialized samples object
 | 
				
			||||||
    if File.exist?(PATH)
 | 
					    def self.cache
 | 
				
			||||||
      serializer = defined?(JSON) ? JSON : YAML
 | 
					      @cache ||= begin
 | 
				
			||||||
      DATA = serializer.load(File.read(PATH))
 | 
					        serializer = defined?(JSON) ? JSON : YAML
 | 
				
			||||||
 | 
					        serializer.load(File.read(PATH))
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Public: Iterate over each sample.
 | 
					    # Public: Iterate over each sample.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,6 +33,9 @@
 | 
				
			|||||||
# Erlang bundles
 | 
					# Erlang bundles
 | 
				
			||||||
- ^rebar$
 | 
					- ^rebar$
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Go dependencies
 | 
				
			||||||
 | 
					- Godeps/_workspace/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Bootstrap minified css and js
 | 
					# Bootstrap minified css and js
 | 
				
			||||||
- (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$
 | 
					- (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -235,3 +238,7 @@
 | 
				
			|||||||
- octicons.css
 | 
					- octicons.css
 | 
				
			||||||
- octicons.min.css
 | 
					- octicons.min.css
 | 
				
			||||||
- sprockets-octicons.scss
 | 
					- sprockets-octicons.scss
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Typesafe Activator
 | 
				
			||||||
 | 
					- (^|/)activator$
 | 
				
			||||||
 | 
					- (^|/)activator\.bat$
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,3 @@
 | 
				
			|||||||
module Linguist
 | 
					module Linguist
 | 
				
			||||||
  VERSION = "3.1.5"
 | 
					  VERSION = "3.3.0"
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +1,13 @@
 | 
				
			|||||||
doc "Test function for Ceylon"
 | 
					"Test function for Ceylon"
 | 
				
			||||||
by  "Enrique"
 | 
					by ("Enrique")
 | 
				
			||||||
shared void test() {
 | 
					shared void test() {
 | 
				
			||||||
  print("test");
 | 
					    print("test");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
doc "Test class for Ceylon"
 | 
					"Test class for Ceylon"
 | 
				
			||||||
shared class Test(name) satisfies Comparable<Test> {
 | 
					shared class Test(name) satisfies Comparable<Test> {
 | 
				
			||||||
    shared String name;
 | 
					    shared String name;
 | 
				
			||||||
    shared actual String string = "Test " name ".";
 | 
					    shared actual String string = "Test ``name``.";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    shared actual Comparison compare(Test other) {
 | 
					    shared actual Comparison compare(Test other) {
 | 
				
			||||||
        return name<=>other.name;
 | 
					        return name<=>other.name;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								samples/Clean/GenHylo.dcl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								samples/Clean/GenHylo.dcl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					definition module GenHylo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import StdGeneric, GenMap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:: Fix f = In (f .(Fix f))
 | 
				
			||||||
 | 
					Out :: !u:(Fix v:a) -> v:(a w:(Fix v:a)), [u <= w]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hylo :: ((.f .b) -> .b) (.a -> (.f .a)) -> (.a -> .b) | gMap{|*->*|} f
 | 
				
			||||||
 | 
					cata :: (u:(f .a) -> .a) -> (Fix u:f) -> .a | gMap{|*->*|} f
 | 
				
			||||||
 | 
					ana :: (.a -> u:(f .a)) -> .a -> (Fix u:f) | gMap{|*->*|} f
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								samples/Clean/GenMap.dcl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/Clean/GenMap.dcl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					definition module GenMap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import StdGeneric
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					generic gMap a b :: .a -> .b
 | 
				
			||||||
 | 
					derive gMap c, UNIT, PAIR, EITHER, CONS, FIELD, OBJECT, {}, {!} 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					derive gMap [], (,), (,,),  (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										19
									
								
								samples/Clean/GenMap.icl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								samples/Clean/GenMap.icl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					implementation module GenMap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import StdClass, StdArray, StdInt, StdFunc
 | 
				
			||||||
 | 
					import StdGeneric, _Array
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					generic gMap a b :: .a -> .b
 | 
				
			||||||
 | 
					gMap{|c|} x 					= x
 | 
				
			||||||
 | 
					gMap{|UNIT|} x 					= x
 | 
				
			||||||
 | 
					gMap{|PAIR|} fx fy (PAIR x y) 	= PAIR (fx x) (fy y) 
 | 
				
			||||||
 | 
					gMap{|EITHER|} fl fr (LEFT x) 	= LEFT (fl x)
 | 
				
			||||||
 | 
					gMap{|EITHER|} fl fr (RIGHT x) 	= RIGHT (fr x)
 | 
				
			||||||
 | 
					gMap{|CONS|} f (CONS x) 		= CONS (f x)
 | 
				
			||||||
 | 
					gMap{|FIELD|} f (FIELD x) 		= FIELD (f x)
 | 
				
			||||||
 | 
					gMap{|OBJECT|} f (OBJECT x) 	= OBJECT (f x)
 | 
				
			||||||
 | 
					gMap{|{}|} f xs 				= mapArray f xs
 | 
				
			||||||
 | 
					gMap{|{!}|} f xs				= mapArray f xs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					derive gMap [], (,), (,,),  (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										54
									
								
								samples/Clean/fsieve.icl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								samples/Clean/fsieve.icl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					module fsieve
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					The Fast Sieve of Eratosthenes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A sequential and optimized version of the sieve of Eratosthenes.
 | 
				
			||||||
 | 
					The program calculates a list of the first NrOfPrime primes.
 | 
				
			||||||
 | 
					The result of the program is the NrOfPrimes'th prime.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Strictness annotations have been added because the strictness analyser
 | 
				
			||||||
 | 
					is not able to deduce all strictness information. Removal of these !'s
 | 
				
			||||||
 | 
					will make the program about 20% slower.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					On a machine without a math coprocessor the execution of this
 | 
				
			||||||
 | 
					program might take a (very) long time. Set NrOfPrimes to a smaller value.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import StdClass; // RWS
 | 
				
			||||||
 | 
					import StdInt, StdReal
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					NrOfPrimes :== 3000 
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					//	The sieve algorithm: generate an infinite list of all primes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Primes::[Int]
 | 
				
			||||||
 | 
					Primes = pr where pr = [5 : Sieve 7 4 pr]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sieve::Int !Int [Int] -> [Int]
 | 
				
			||||||
 | 
					Sieve g i prs
 | 
				
			||||||
 | 
						| IsPrime prs g (toInt (sqrt (toReal g)))	=  [g : Sieve` g i prs]
 | 
				
			||||||
 | 
																	=  Sieve (g + i) (6 - i) prs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sieve`::Int Int [Int] -> [Int]
 | 
				
			||||||
 | 
					Sieve` g i prs =  Sieve (g + i) (6 - i) prs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IsPrime::[Int] !Int Int -> Bool
 | 
				
			||||||
 | 
					IsPrime [f:r] pr bd | f>bd 			=  True
 | 
				
			||||||
 | 
										| pr rem f==0	=  False
 | 
				
			||||||
 | 
														=  IsPrime r pr bd
 | 
				
			||||||
 | 
													  
 | 
				
			||||||
 | 
					//	Select is used to get the NrOfPrimes'th prime from the infinite list.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Select::[x] Int -> x
 | 
				
			||||||
 | 
					Select [f:r] 1 =  f
 | 
				
			||||||
 | 
					Select [f:r] n =  Select r (n - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*	The Start rule: Select the NrOfPrimes'th prime from the list of primes
 | 
				
			||||||
 | 
						generated by Primes.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Start::Int
 | 
				
			||||||
 | 
					Start = Select [2, 3 : Primes] NrOfPrimes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										99
									
								
								samples/Clean/sem.icl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								samples/Clean/sem.icl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
				
			|||||||
 | 
					module monadicSemantics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import StdEnv, StdGeneric, GenMap, GenHylo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* For fun I implemented the recursive datastructre Exp and Stm as fixpoints
 | 
				
			||||||
 | 
					   This helps us define recursive functions on them (only a little bit though)
 | 
				
			||||||
 | 
					   However deriving gMap for Fix did not works out of the box
 | 
				
			||||||
 | 
					   I had to remove some uniqueness typing in GenMap and GenHylo */
 | 
				
			||||||
 | 
					:: Op      = Plus | Minus | Times | Rem | Equal | LessThan
 | 
				
			||||||
 | 
					:: Var     :== String
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:: ExpP a  = Int Int | Var Var | Op Op a a
 | 
				
			||||||
 | 
					:: Exp     :== Fix ExpP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:: StmP a  = Assign Var Exp | If Exp a a | While Exp a | Seq a a | Cont
 | 
				
			||||||
 | 
					:: Stm     :== Fix StmP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					derive gMap ExpP, StmP, Fix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Environment. Semantics is basically Env -> Env
 | 
				
			||||||
 | 
					:: Env :== Var -> Int
 | 
				
			||||||
 | 
					:: Sem :== Env -> (Int, Env)
 | 
				
			||||||
 | 
					empty = \v . 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// return
 | 
				
			||||||
 | 
					rtn :: Int -> Sem
 | 
				
			||||||
 | 
					rtn i = \e. (i, e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// the usual bind
 | 
				
			||||||
 | 
					(>>=) infixl 1 :: Sem (Int->Sem) -> Sem
 | 
				
			||||||
 | 
					(>>=) x y = \e. (\(i,e2).y i e2) (x e)
 | 
				
			||||||
 | 
					(>>|) infixl 1 :: Sem Sem -> Sem
 | 
				
			||||||
 | 
					(>>|) x y = x >>= \_. y
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// read variable from environment
 | 
				
			||||||
 | 
					read :: Var -> Sem
 | 
				
			||||||
 | 
					read v = \e. (e v, e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// assign value to give variable in environment
 | 
				
			||||||
 | 
					write :: Var Int -> Sem
 | 
				
			||||||
 | 
					write v i = \e. (i, \w. if (w==v) i (e w))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// semantics
 | 
				
			||||||
 | 
					class sem a :: a -> Sem
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					operator :: Op -> Int -> Int -> Int
 | 
				
			||||||
 | 
					operator Plus     = (+)
 | 
				
			||||||
 | 
					operator Minus    = (-)
 | 
				
			||||||
 | 
					operator Times    = (*)
 | 
				
			||||||
 | 
					operator Rem      = rem
 | 
				
			||||||
 | 
					operator Equal    = \x y . if (x==y) 1 0
 | 
				
			||||||
 | 
					operator LessThan = \x y . if (x< y)  1 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// semantics of expressions
 | 
				
			||||||
 | 
					instance sem Exp where
 | 
				
			||||||
 | 
						sem x = cata phi x where
 | 
				
			||||||
 | 
							phi (Int n)     = rtn n
 | 
				
			||||||
 | 
							phi (Var v)     = read v
 | 
				
			||||||
 | 
							phi (Op op x y) = x >>= \v1. y >>= return o (operator op v1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// semantics of statments
 | 
				
			||||||
 | 
					// NOTE: while will always return 0, as it might not even be executed
 | 
				
			||||||
 | 
					instance sem Stm where
 | 
				
			||||||
 | 
						sem x = cata phi x where
 | 
				
			||||||
 | 
							phi (Assign v e)     = sem e >>= write v
 | 
				
			||||||
 | 
							phi (If e s1 s2)     = sem e >>= \b . if (b<>0) s1 s2
 | 
				
			||||||
 | 
							phi stm=:(While e s) = sem e >>= \b . if (b<>0) (s >>| phi stm) (phi Cont)
 | 
				
			||||||
 | 
							phi (Seq s1 s2)      = s1 >>| s2    // Here the cata *finally* pays off :D
 | 
				
			||||||
 | 
							phi Cont             = rtn 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// convenience functions
 | 
				
			||||||
 | 
					int    = In o Int
 | 
				
			||||||
 | 
					var    = In o Var
 | 
				
			||||||
 | 
					op o   = In o2 (Op o)
 | 
				
			||||||
 | 
					assign = In o2 Assign
 | 
				
			||||||
 | 
					ifte e = In o2 (If e)
 | 
				
			||||||
 | 
					while  = In o2 While
 | 
				
			||||||
 | 
					seq    = In o2 Seq
 | 
				
			||||||
 | 
					cont   = In Cont
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// test case, also testing the new operator <
 | 
				
			||||||
 | 
					pEuclides =
 | 
				
			||||||
 | 
						while (op LessThan (int 0) (var "b"))(
 | 
				
			||||||
 | 
							seq (assign "r" (op Rem (var "a") (var "b")))
 | 
				
			||||||
 | 
							(seq (assign "a" (var "b"))
 | 
				
			||||||
 | 
							( (assign "b" (var "r")))
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Start = fst (program start) where
 | 
				
			||||||
 | 
						program = sem pEuclides >>| read "a"
 | 
				
			||||||
 | 
						start "a" = 9
 | 
				
			||||||
 | 
						start "b" = 12
 | 
				
			||||||
 | 
						start _ = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Helper
 | 
				
			||||||
 | 
					(o2) infixr 9
 | 
				
			||||||
 | 
					(o2) f g x :== f o (g x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										14
									
								
								samples/Clean/stack.dcl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								samples/Clean/stack.dcl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					definition module stack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:: Stack a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					newStack :: (Stack a)
 | 
				
			||||||
 | 
					push :: a (Stack a) -> Stack a
 | 
				
			||||||
 | 
					pushes :: [a] (Stack a) -> Stack a
 | 
				
			||||||
 | 
					pop :: (Stack a) -> Stack a
 | 
				
			||||||
 | 
					popn :: Int (Stack a) -> Stack a
 | 
				
			||||||
 | 
					top :: (Stack a) -> a
 | 
				
			||||||
 | 
					topn :: Int (Stack a) -> [a]
 | 
				
			||||||
 | 
					elements :: (Stack a) -> [a]
 | 
				
			||||||
 | 
					count :: (Stack a) -> Int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										33
									
								
								samples/Clean/stack.icl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								samples/Clean/stack.icl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					implementation module stack
 | 
				
			||||||
 | 
					import StdEnv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:: Stack a :== [a]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					newStack :: (Stack a)
 | 
				
			||||||
 | 
					newStack = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					push :: a (Stack a) -> Stack a
 | 
				
			||||||
 | 
					push x s = [x:s]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pushes :: [a] (Stack a) -> Stack a
 | 
				
			||||||
 | 
					pushes x s = x ++ s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pop :: (Stack a) -> Stack a
 | 
				
			||||||
 | 
					pop [] = abort "Cannot use pop on an empty stack"
 | 
				
			||||||
 | 
					pop [e:s] = s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					popn :: Int (Stack a) -> Stack a
 | 
				
			||||||
 | 
					popn n s  = drop n s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					top :: (Stack a) -> a
 | 
				
			||||||
 | 
					top [] = abort "Cannot use top on an empty stack"
 | 
				
			||||||
 | 
					top [e:s] = e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					topn :: Int (Stack a) -> [a]
 | 
				
			||||||
 | 
					topn n s = take n s
 | 
				
			||||||
 | 
					elements :: (Stack a) -> [a]
 | 
				
			||||||
 | 
					elements s = s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					count :: (Stack a) -> Int
 | 
				
			||||||
 | 
					count s = length s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										16
									
								
								samples/Clean/streams.dcl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								samples/Clean/streams.dcl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					definition module streams
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import StdEnv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					instance zero [Real]
 | 
				
			||||||
 | 
					instance one [Real]
 | 
				
			||||||
 | 
					instance + [Real]        
 | 
				
			||||||
 | 
					instance - [Real]
 | 
				
			||||||
 | 
					instance * [Real]
 | 
				
			||||||
 | 
					instance / [Real]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					X :: [Real]
 | 
				
			||||||
 | 
					invert :: [Real] -> [Real]
 | 
				
			||||||
 | 
					pow :: [Real] Int -> [Real]
 | 
				
			||||||
 | 
					(shuffle) infixl 7 :: [Real] [Real] -> [Real]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										49
									
								
								samples/Clean/streams.icl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								samples/Clean/streams.icl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
				
			|||||||
 | 
					implementation module streams
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import StdEnv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					instance zero [Real]
 | 
				
			||||||
 | 
					where
 | 
				
			||||||
 | 
					        zero = [] //Infinite row of zeroes represented as empty list to ease computation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					instance one [Real]
 | 
				
			||||||
 | 
					where
 | 
				
			||||||
 | 
					        one = [1.0:zero]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					instance + [Real]
 | 
				
			||||||
 | 
					where
 | 
				
			||||||
 | 
					        (+) [s:s`] [t:t`] = [s+t:s`+t`]
 | 
				
			||||||
 | 
					        (+) [s:s`] [] = [s:s`]
 | 
				
			||||||
 | 
					        (+) [] [t:t`] = [t:t`]
 | 
				
			||||||
 | 
					        (+) [] [] = []
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					instance - [Real]
 | 
				
			||||||
 | 
					where
 | 
				
			||||||
 | 
					        (-) [s:s`] [t:t`] = [s-t:s`-t`]
 | 
				
			||||||
 | 
					        (-) [s:s`] [] = [s:s`]
 | 
				
			||||||
 | 
					        (-) [] [t:t`] = [-1.0] * [t:t`]
 | 
				
			||||||
 | 
					        (-) [] [] = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					instance * [Real]
 | 
				
			||||||
 | 
					where
 | 
				
			||||||
 | 
					        (*) [s:s`] [t:t`] = [s*t:s`*[t:t`]+[s]*t`]
 | 
				
			||||||
 | 
					        (*) _ _ = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					instance / [Real]
 | 
				
			||||||
 | 
					where
 | 
				
			||||||
 | 
					        (/) s t = s * (invert t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					X :: [Real]
 | 
				
			||||||
 | 
					X = [0.0:one]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					invert :: [Real] -> [Real]
 | 
				
			||||||
 | 
					invert [s:s`] = [1.0/s:(invert [s:s`]) * s` * [-1.0/s]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pow :: [Real] Int -> [Real]
 | 
				
			||||||
 | 
					pow s 0 = one
 | 
				
			||||||
 | 
					pow s n = s * pow s (n-1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(shuffle) infixl 7 :: [Real] [Real] -> [Real]
 | 
				
			||||||
 | 
					(shuffle) [s:s`] [t:t`] = [s*t:s` shuffle [t:t`] + [s:s`] shuffle t`]
 | 
				
			||||||
 | 
					(shuffle) _ _ = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										8
									
								
								samples/Forth/bitmap.frt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								samples/Forth/bitmap.frt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					\ Bit arrays.
 | 
				
			||||||
 | 
					: bits ( u1 -- u2 ) 7 + 3 rshift ;
 | 
				
			||||||
 | 
					: bitmap ( u "name" -- ) create bits here over erase allot
 | 
				
			||||||
 | 
					   does> ( u -- a x ) over 3 rshift +  1 rot 7 and lshift ;
 | 
				
			||||||
 | 
					: bit@ ( a x -- f ) swap c@ and ;
 | 
				
			||||||
 | 
					: 1bit ( a x -- ) over c@ or swap c! ;
 | 
				
			||||||
 | 
					: 0bit ( a x -- ) invert over c@ and swap c! ;
 | 
				
			||||||
 | 
					: bit! ( f a x -- ) rot if 1bit else 0bit then ;
 | 
				
			||||||
							
								
								
									
										7
									
								
								samples/Forth/enum.frt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								samples/Forth/enum.frt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					\ Implements ENUM.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ Double DOES>!
 | 
				
			||||||
 | 
					: enum   create 0 ,  does> create dup @ 1 rot +! ,  does> @ ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ But this is simpler.
 | 
				
			||||||
 | 
					: enum   create 0 ,  does> dup @ constant 1 swap +! ;
 | 
				
			||||||
							
								
								
									
										8
									
								
								samples/Forth/macros.frt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								samples/Forth/macros.frt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					\ Simplifies compiling words.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: [[     ; immediate
 | 
				
			||||||
 | 
					: '<>    >in @ ' swap >in ! <> ;
 | 
				
			||||||
 | 
					: (]])   begin dup '<> while postpone postpone repeat drop ;
 | 
				
			||||||
 | 
					: ]]     ['] [[ (]]) ; immediate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					( Usage:   : foo ]] dup * [[ ; immediate   : bar 42 foo . ; )
 | 
				
			||||||
							
								
								
									
										57
									
								
								samples/G-code/duettest.g
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								samples/G-code/duettest.g
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
				
			|||||||
 | 
					; RepRapPro Ormerod
 | 
				
			||||||
 | 
					; Board test GCodes
 | 
				
			||||||
 | 
					M111 S1; Debug on
 | 
				
			||||||
 | 
					G21 ; mm
 | 
				
			||||||
 | 
					G90 ; Absolute positioning
 | 
				
			||||||
 | 
					M83 ; Extrusion relative
 | 
				
			||||||
 | 
					M906 X800 Y800 Z800 E800 ; Motor currents (mA)
 | 
				
			||||||
 | 
					T0 ; Extruder 0
 | 
				
			||||||
 | 
					G1 X50 F500
 | 
				
			||||||
 | 
					G1 X0
 | 
				
			||||||
 | 
					G4 P500
 | 
				
			||||||
 | 
					G1 Y50 F500
 | 
				
			||||||
 | 
					G1 Y0
 | 
				
			||||||
 | 
					G4 P500
 | 
				
			||||||
 | 
					G1 Z20 F200
 | 
				
			||||||
 | 
					G1 Z0
 | 
				
			||||||
 | 
					G4 P500
 | 
				
			||||||
 | 
					G1 E20 F200
 | 
				
			||||||
 | 
					G1 E-20
 | 
				
			||||||
 | 
					G4 P500
 | 
				
			||||||
 | 
					M106 S255
 | 
				
			||||||
 | 
					G4 P500
 | 
				
			||||||
 | 
					M106 S0
 | 
				
			||||||
 | 
					G4 P500
 | 
				
			||||||
 | 
					M105
 | 
				
			||||||
 | 
					G10 P0 S100
 | 
				
			||||||
 | 
					T0
 | 
				
			||||||
 | 
					M140 S100
 | 
				
			||||||
 | 
					G4 P5000
 | 
				
			||||||
 | 
					M105
 | 
				
			||||||
 | 
					G4 P5000
 | 
				
			||||||
 | 
					M105
 | 
				
			||||||
 | 
					G4 P5000
 | 
				
			||||||
 | 
					M105
 | 
				
			||||||
 | 
					G4 P5000
 | 
				
			||||||
 | 
					M105
 | 
				
			||||||
 | 
					G4 P5000
 | 
				
			||||||
 | 
					M105
 | 
				
			||||||
 | 
					G4 P5000
 | 
				
			||||||
 | 
					M105
 | 
				
			||||||
 | 
					G4 P5000
 | 
				
			||||||
 | 
					M105
 | 
				
			||||||
 | 
					G4 P5000
 | 
				
			||||||
 | 
					M105
 | 
				
			||||||
 | 
					G4 P5000
 | 
				
			||||||
 | 
					M105
 | 
				
			||||||
 | 
					G4 P5000
 | 
				
			||||||
 | 
					M105
 | 
				
			||||||
 | 
					G4 P5000
 | 
				
			||||||
 | 
					M105
 | 
				
			||||||
 | 
					G4 P5000
 | 
				
			||||||
 | 
					M105
 | 
				
			||||||
 | 
					M0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										25912
									
								
								samples/G-code/lm.g
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25912
									
								
								samples/G-code/lm.g
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										29735
									
								
								samples/G-code/rm.g
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29735
									
								
								samples/G-code/rm.g
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										13
									
								
								samples/G-code/square.g
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/G-code/square.g
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					G28 X0 Y0
 | 
				
			||||||
 | 
					G1 X55 Y5 F2000
 | 
				
			||||||
 | 
					G1 Y180
 | 
				
			||||||
 | 
					G1 X180
 | 
				
			||||||
 | 
					G1 Y5
 | 
				
			||||||
 | 
					G1 X55
 | 
				
			||||||
 | 
					G1 Y180
 | 
				
			||||||
 | 
					G1 X180
 | 
				
			||||||
 | 
					G1 Y5
 | 
				
			||||||
 | 
					G1 X55
 | 
				
			||||||
 | 
					M0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										57
									
								
								samples/GDScript/example.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								samples/GDScript/example.gd
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
				
			|||||||
 | 
					# Taken from https://github.com/okamstudio/godot/wiki/gdscript
 | 
				
			||||||
 | 
					# a file is a class!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# inheritance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extends BaseClass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# member variables
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var a = 5 
 | 
				
			||||||
 | 
					var s = "Hello"
 | 
				
			||||||
 | 
					var arr = [1, 2, 3]
 | 
				
			||||||
 | 
					var dict = {"key":"value", 2:3}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# constants
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const answer = 42
 | 
				
			||||||
 | 
					const thename = "Charly"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# built-in vector types
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var v2 = Vector2(1, 2)
 | 
				
			||||||
 | 
					var v3 = Vector3(1, 2, 3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# function
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func some_function(param1, param2):
 | 
				
			||||||
 | 
					    var local_var = 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if param1 < local_var:
 | 
				
			||||||
 | 
					        print(param1)
 | 
				
			||||||
 | 
					    elif param2 > 5:
 | 
				
			||||||
 | 
					        print(param2)
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        print("fail!")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for i in range(20):
 | 
				
			||||||
 | 
					        print(i)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while(param2 != 0):
 | 
				
			||||||
 | 
					        param2 -= 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var local_var2 = param1+3
 | 
				
			||||||
 | 
					    return local_var2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# subclass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Something:
 | 
				
			||||||
 | 
					    var a = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# constructor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _init():
 | 
				
			||||||
 | 
					    print("constructed!")
 | 
				
			||||||
 | 
					    var lv = Something.new()
 | 
				
			||||||
 | 
					    print(lv.a)
 | 
				
			||||||
							
								
								
									
										216
									
								
								samples/GDScript/grid.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								samples/GDScript/grid.gd
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,216 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extends Control
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Simple Tetris-like demo, (c) 2012 Juan Linietsky
 | 
				
			||||||
 | 
					# Implemented by using a regular Control and drawing on it during the _draw() callback.
 | 
				
			||||||
 | 
					# The drawing surface is updated only when changes happen (by calling update())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var score = 0
 | 
				
			||||||
 | 
					var score_label=null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const MAX_SHAPES = 7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var block = preload("block.png")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var block_colors=[
 | 
				
			||||||
 | 
						Color(1,0.5,0.5),
 | 
				
			||||||
 | 
						Color(0.5,1,0.5),
 | 
				
			||||||
 | 
						Color(0.5,0.5,1),
 | 
				
			||||||
 | 
						Color(0.8,0.4,0.8),
 | 
				
			||||||
 | 
						Color(0.8,0.8,0.4),
 | 
				
			||||||
 | 
						Color(0.4,0.8,0.8),
 | 
				
			||||||
 | 
						Color(0.7,0.7,0.7)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var	block_shapes=[
 | 
				
			||||||
 | 
						[ Vector2(0,-1),Vector2(0,0),Vector2(0,1),Vector2(0,2) ], # I
 | 
				
			||||||
 | 
						[ Vector2(0,0),Vector2(1,0),Vector2(1,1),Vector2(0,1) ], # O
 | 
				
			||||||
 | 
						[ Vector2(-1,1),Vector2(0,1),Vector2(0,0),Vector2(1,0) ], # S
 | 
				
			||||||
 | 
						[ Vector2(1,1),Vector2(0,1),Vector2(0,0),Vector2(-1,0) ], # Z
 | 
				
			||||||
 | 
						[ Vector2(-1,1),Vector2(-1,0),Vector2(0,0),Vector2(1,0) ], # L
 | 
				
			||||||
 | 
						[ Vector2(1,1),Vector2(1,0),Vector2(0,0),Vector2(-1,0) ], # J
 | 
				
			||||||
 | 
						[ Vector2(0,1),Vector2(1,0),Vector2(0,0),Vector2(-1,0) ]] # T
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var block_rotations=[
 | 
				
			||||||
 | 
						Matrix32( Vector2(1,0),Vector2(0,1), Vector2() ),
 | 
				
			||||||
 | 
						Matrix32( Vector2(0,1),Vector2(-1,0), Vector2() ),
 | 
				
			||||||
 | 
						Matrix32( Vector2(-1,0),Vector2(0,-1), Vector2() ),
 | 
				
			||||||
 | 
						Matrix32( Vector2(0,-1),Vector2(1,0), Vector2() )
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var width=0
 | 
				
			||||||
 | 
					var height=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var cells={}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var piece_active=false
 | 
				
			||||||
 | 
					var piece_shape=0
 | 
				
			||||||
 | 
					var piece_pos=Vector2()
 | 
				
			||||||
 | 
					var piece_rot=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func piece_cell_xform(p,er=0):
 | 
				
			||||||
 | 
						var r = (4+er+piece_rot)%4
 | 
				
			||||||
 | 
						return piece_pos+block_rotations[r].xform(p)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _draw():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var sb = get_stylebox("bg","Tree") # use line edit bg
 | 
				
			||||||
 | 
						draw_style_box(sb,Rect2(Vector2(),get_size()).grow(3))
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						var bs = block.get_size()
 | 
				
			||||||
 | 
						for y in range(height):
 | 
				
			||||||
 | 
							for x in range(width):
 | 
				
			||||||
 | 
								if (Vector2(x,y) in cells):
 | 
				
			||||||
 | 
									draw_texture_rect(block,Rect2(Vector2(x,y)*bs,bs),false,block_colors[cells[Vector2(x,y)]])
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
						if (piece_active):
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							for c in block_shapes[piece_shape]:
 | 
				
			||||||
 | 
								draw_texture_rect(block,Rect2(piece_cell_xform(c)*bs,bs),false,block_colors[piece_shape])
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func piece_check_fit(ofs,er=0):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for c in block_shapes[piece_shape]:
 | 
				
			||||||
 | 
							var pos = piece_cell_xform(c,er)+ofs
 | 
				
			||||||
 | 
							if (pos.x < 0):
 | 
				
			||||||
 | 
								return false
 | 
				
			||||||
 | 
							if (pos.y < 0):
 | 
				
			||||||
 | 
								return false
 | 
				
			||||||
 | 
							if (pos.x >= width):
 | 
				
			||||||
 | 
								return false
 | 
				
			||||||
 | 
							if (pos.y >= height):
 | 
				
			||||||
 | 
								return false
 | 
				
			||||||
 | 
							if (pos in cells):
 | 
				
			||||||
 | 
								return false
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return true	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func new_piece():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						piece_shape = randi() % MAX_SHAPES	
 | 
				
			||||||
 | 
						piece_pos = Vector2(width/2,0)
 | 
				
			||||||
 | 
						piece_active=true
 | 
				
			||||||
 | 
						piece_rot=0
 | 
				
			||||||
 | 
						if (piece_shape==0):
 | 
				
			||||||
 | 
							piece_pos.y+=1
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						if (not piece_check_fit(Vector2())):
 | 
				
			||||||
 | 
							#game over
 | 
				
			||||||
 | 
							#print("GAME OVER!")
 | 
				
			||||||
 | 
							game_over()
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						update()
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					func test_collapse_rows():
 | 
				
			||||||
 | 
						var accum_down=0
 | 
				
			||||||
 | 
						for i in range(height):
 | 
				
			||||||
 | 
							var y = height - i - 1
 | 
				
			||||||
 | 
							var collapse = true
 | 
				
			||||||
 | 
							for x in range(width):
 | 
				
			||||||
 | 
								if (Vector2(x,y) in cells):
 | 
				
			||||||
 | 
									if (accum_down):
 | 
				
			||||||
 | 
										cells[ Vector2(x,y+accum_down) ] = cells[Vector2(x,y)]
 | 
				
			||||||
 | 
								else:
 | 
				
			||||||
 | 
									collapse=false
 | 
				
			||||||
 | 
									if (accum_down):
 | 
				
			||||||
 | 
										cells.erase( Vector2(x,y+accum_down) )
 | 
				
			||||||
 | 
											
 | 
				
			||||||
 | 
							if (collapse):
 | 
				
			||||||
 | 
								accum_down+=1
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
						score+=accum_down*100
 | 
				
			||||||
 | 
						score_label.set_text(str(score))
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
					func game_over():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							piece_active=false
 | 
				
			||||||
 | 
							get_node("gameover").set_text("Game Over")		
 | 
				
			||||||
 | 
							update()
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
					func restart_pressed():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							score=0
 | 
				
			||||||
 | 
							score_label.set_text("0")
 | 
				
			||||||
 | 
							cells.clear()
 | 
				
			||||||
 | 
							get_node("gameover").set_text("")		
 | 
				
			||||||
 | 
							piece_active=true
 | 
				
			||||||
 | 
							update()
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func piece_move_down():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!piece_active):
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						if (piece_check_fit(Vector2(0,1))):
 | 
				
			||||||
 | 
							piece_pos.y+=1
 | 
				
			||||||
 | 
							update()		
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for c in block_shapes[piece_shape]:
 | 
				
			||||||
 | 
								var pos = piece_cell_xform(c)
 | 
				
			||||||
 | 
								cells[pos]=piece_shape
 | 
				
			||||||
 | 
							test_collapse_rows()
 | 
				
			||||||
 | 
							new_piece()
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func piece_rotate():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var adv = 1
 | 
				
			||||||
 | 
						if (not piece_check_fit(Vector2(),1)):
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						piece_rot = (piece_rot + adv) % 4
 | 
				
			||||||
 | 
						update()
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _input(ie):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (not piece_active):
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						if (!ie.is_pressed()):
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ie.is_action("move_left")):
 | 
				
			||||||
 | 
							if (piece_check_fit(Vector2(-1,0))):
 | 
				
			||||||
 | 
								piece_pos.x-=1
 | 
				
			||||||
 | 
								update()
 | 
				
			||||||
 | 
						elif (ie.is_action("move_right")):
 | 
				
			||||||
 | 
							if (piece_check_fit(Vector2(1,0))):
 | 
				
			||||||
 | 
								piece_pos.x+=1
 | 
				
			||||||
 | 
								update()
 | 
				
			||||||
 | 
						elif (ie.is_action("move_down")):
 | 
				
			||||||
 | 
							piece_move_down()
 | 
				
			||||||
 | 
						elif (ie.is_action("rotate")):
 | 
				
			||||||
 | 
							piece_rotate()
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
					func setup(w,h):
 | 
				
			||||||
 | 
						width=w
 | 
				
			||||||
 | 
						height=h
 | 
				
			||||||
 | 
						set_size( Vector2(w,h)*block.get_size() )
 | 
				
			||||||
 | 
						new_piece()
 | 
				
			||||||
 | 
						get_node("timer").start()
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _ready():
 | 
				
			||||||
 | 
						# Initalization here
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						setup(10,20)
 | 
				
			||||||
 | 
						score_label = get_node("../score")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						set_process_input(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										243
									
								
								samples/GDScript/player.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										243
									
								
								samples/GDScript/player.gd
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,243 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					extends RigidBody
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# member variables here, example:
 | 
				
			||||||
 | 
					# var a=2
 | 
				
			||||||
 | 
					# var b="textvar"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#var dir=Vector3()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ANIM_FLOOR = 0
 | 
				
			||||||
 | 
					const ANIM_AIR_UP = 1
 | 
				
			||||||
 | 
					const ANIM_AIR_DOWN = 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SHOOT_TIME = 1.5
 | 
				
			||||||
 | 
					const SHOOT_SCALE = 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const CHAR_SCALE = Vector3(0.3,0.3,0.3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var facing_dir = Vector3(1, 0, 0)
 | 
				
			||||||
 | 
					var movement_dir = Vector3()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var jumping=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var turn_speed=40
 | 
				
			||||||
 | 
					var keep_jump_inertia = true
 | 
				
			||||||
 | 
					var air_idle_deaccel = false
 | 
				
			||||||
 | 
					var accel=19.0
 | 
				
			||||||
 | 
					var deaccel=14.0
 | 
				
			||||||
 | 
					var sharp_turn_threshhold = 140
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var max_speed=3.1
 | 
				
			||||||
 | 
					var on_floor = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var prev_shoot = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var last_floor_velocity = Vector3()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var shoot_blend = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func adjust_facing(p_facing, p_target,p_step, p_adjust_rate,current_gn):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var n = p_target # normal
 | 
				
			||||||
 | 
						var t = n.cross(current_gn).normalized()
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						var x = n.dot(p_facing)
 | 
				
			||||||
 | 
						var y = t.dot(p_facing)
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						var ang = atan2(y,x)
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (abs(ang)<0.001): # too small
 | 
				
			||||||
 | 
							return p_facing
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						var s = sign(ang)
 | 
				
			||||||
 | 
						ang = ang * s
 | 
				
			||||||
 | 
						var turn = ang * p_adjust_rate * p_step
 | 
				
			||||||
 | 
						var a
 | 
				
			||||||
 | 
						if (ang<turn):
 | 
				
			||||||
 | 
							a=ang
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
 | 
							a=turn
 | 
				
			||||||
 | 
						ang = (ang - a) * s
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return ((n * cos(ang)) + (t * sin(ang))) * p_facing.length()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _integrate_forces( state ):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var lv = state.get_linear_velocity() # linear velocity
 | 
				
			||||||
 | 
						var g = state.get_total_gravity()
 | 
				
			||||||
 | 
						var delta = state.get_step()
 | 
				
			||||||
 | 
						var d = 1.0 - delta*state.get_total_density()
 | 
				
			||||||
 | 
						if (d<0):
 | 
				
			||||||
 | 
							d=0
 | 
				
			||||||
 | 
						lv += g * delta #apply gravity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var anim = ANIM_FLOOR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var up = -g.normalized() # (up is against gravity)
 | 
				
			||||||
 | 
						var vv = up.dot(lv) # vertical velocity
 | 
				
			||||||
 | 
						var hv = lv - (up*vv) # horizontal velocity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var hdir = hv.normalized() # horizontal direction
 | 
				
			||||||
 | 
						var hspeed = hv.length()	#horizontal speed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var floor_velocity
 | 
				
			||||||
 | 
						var onfloor = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (state.get_contact_count() == 0):
 | 
				
			||||||
 | 
							floor_velocity = last_floor_velocity
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
 | 
							for i in range(state.get_contact_count()):
 | 
				
			||||||
 | 
								if (state.get_contact_local_shape(i) != 1):
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								onfloor = true
 | 
				
			||||||
 | 
								floor_velocity = state.get_contact_collider_velocity_at_pos(i)
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var dir = Vector3() #where does the player intend to walk to
 | 
				
			||||||
 | 
						var cam_xform = get_node("target/camera").get_global_transform()
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (Input.is_action_pressed("move_forward")):
 | 
				
			||||||
 | 
							dir+=-cam_xform.basis[2] 
 | 
				
			||||||
 | 
						if (Input.is_action_pressed("move_backwards")):
 | 
				
			||||||
 | 
							dir+=cam_xform.basis[2] 
 | 
				
			||||||
 | 
						if (Input.is_action_pressed("move_left")):
 | 
				
			||||||
 | 
							dir+=-cam_xform.basis[0] 
 | 
				
			||||||
 | 
						if (Input.is_action_pressed("move_right")):
 | 
				
			||||||
 | 
							dir+=cam_xform.basis[0] 
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						var jump_attempt = Input.is_action_pressed("jump")
 | 
				
			||||||
 | 
						var shoot_attempt = Input.is_action_pressed("shoot")
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						var target_dir = (dir - up*dir.dot(up)).normalized()
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (onfloor):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							var sharp_turn = hspeed > 0.1 and rad2deg(acos(target_dir.dot(hdir))) > sharp_turn_threshhold
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (dir.length()>0.1 and !sharp_turn) :
 | 
				
			||||||
 | 
								if (hspeed > 0.001) :
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									#linear_dir = linear_h_velocity/linear_vel
 | 
				
			||||||
 | 
									#if (linear_vel > brake_velocity_limit and linear_dir.dot(ctarget_dir)<-cos(Math::deg2rad(brake_angular_limit)))
 | 
				
			||||||
 | 
									#	brake=true
 | 
				
			||||||
 | 
									#else
 | 
				
			||||||
 | 
									hdir = adjust_facing(hdir,target_dir,delta,1.0/hspeed*turn_speed,up)
 | 
				
			||||||
 | 
									facing_dir = hdir
 | 
				
			||||||
 | 
								else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									hdir = target_dir
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								if (hspeed<max_speed):
 | 
				
			||||||
 | 
									hspeed+=accel*delta
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							else:
 | 
				
			||||||
 | 
								hspeed-=deaccel*delta
 | 
				
			||||||
 | 
								if (hspeed<0):
 | 
				
			||||||
 | 
									hspeed=0
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							hv = hdir*hspeed
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							var mesh_xform = get_node("Armature").get_transform() 
 | 
				
			||||||
 | 
							var facing_mesh=-mesh_xform.basis[0].normalized()
 | 
				
			||||||
 | 
							facing_mesh = (facing_mesh - up*facing_mesh.dot(up)).normalized()
 | 
				
			||||||
 | 
							facing_mesh = adjust_facing(facing_mesh,target_dir,delta,1.0/hspeed*turn_speed,up)
 | 
				
			||||||
 | 
							var m3 = Matrix3(-facing_mesh,up,-facing_mesh.cross(up).normalized()).scaled( CHAR_SCALE )
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							get_node("Armature").set_transform(Transform(m3,mesh_xform.origin))
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
							if (not jumping and jump_attempt):
 | 
				
			||||||
 | 
								vv = 7.0
 | 
				
			||||||
 | 
								jumping = true		
 | 
				
			||||||
 | 
								get_node("sfx").play("jump")
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (vv>0):
 | 
				
			||||||
 | 
								anim=ANIM_AIR_UP
 | 
				
			||||||
 | 
							else:
 | 
				
			||||||
 | 
								anim=ANIM_AIR_DOWN
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
							var hs
 | 
				
			||||||
 | 
							if (dir.length()>0.1):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								hv += target_dir * (accel * 0.2) * delta
 | 
				
			||||||
 | 
								if (hv.length() > max_speed):
 | 
				
			||||||
 | 
									hv = hv.normalized() * max_speed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (air_idle_deaccel):
 | 
				
			||||||
 | 
									hspeed = hspeed - (deaccel * 0.2) * delta
 | 
				
			||||||
 | 
									if (hspeed<0):
 | 
				
			||||||
 | 
										hspeed=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									hv = hdir*hspeed
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						if (jumping and vv < 0):
 | 
				
			||||||
 | 
							jumping=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						lv = hv+up*vv
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (onfloor):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							movement_dir = lv
 | 
				
			||||||
 | 
							#lv += floor_velocity
 | 
				
			||||||
 | 
							last_floor_velocity = floor_velocity
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (on_floor) :
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								#if (keep_jump_inertia):
 | 
				
			||||||
 | 
								#	lv += last_floor_velocity
 | 
				
			||||||
 | 
								pass
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							last_floor_velocity = Vector3()
 | 
				
			||||||
 | 
							movement_dir = lv
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						on_floor = onfloor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						state.set_linear_velocity(lv)
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (shoot_blend>0):
 | 
				
			||||||
 | 
							shoot_blend -= delta * SHOOT_SCALE
 | 
				
			||||||
 | 
							if (shoot_blend<0):
 | 
				
			||||||
 | 
								shoot_blend=0
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (shoot_attempt and not prev_shoot):
 | 
				
			||||||
 | 
							shoot_blend = SHOOT_TIME		
 | 
				
			||||||
 | 
							var bullet = preload("res://bullet.scn").instance()
 | 
				
			||||||
 | 
							bullet.set_transform( get_node("Armature/bullet").get_global_transform().orthonormalized() )
 | 
				
			||||||
 | 
							get_parent().add_child( bullet )
 | 
				
			||||||
 | 
							bullet.set_linear_velocity( get_node("Armature/bullet").get_global_transform().basis[2].normalized() * 20 )
 | 
				
			||||||
 | 
							PS.body_add_collision_exception( bullet.get_rid(), get_rid() ) #add it to bullet
 | 
				
			||||||
 | 
							get_node("sfx").play("shoot")
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						prev_shoot = shoot_attempt
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (onfloor):
 | 
				
			||||||
 | 
							get_node("AnimationTreePlayer").blend2_node_set_amount("walk",hspeed / max_speed)
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						get_node("AnimationTreePlayer").transition_node_set_current("state",anim)
 | 
				
			||||||
 | 
						get_node("AnimationTreePlayer").blend2_node_set_amount("gun",min(shoot_blend,1.0))
 | 
				
			||||||
 | 
					#	state.set_angular_velocity(Vector3())	
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _ready():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Initalization here
 | 
				
			||||||
 | 
						get_node("AnimationTreePlayer").set_active(true)
 | 
				
			||||||
 | 
						pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										73
									
								
								samples/GDScript/pong.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								samples/GDScript/pong.gd
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					extends Node2D
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# member variables here, example:
 | 
				
			||||||
 | 
					# var a=2
 | 
				
			||||||
 | 
					# var b="textvar"
 | 
				
			||||||
 | 
					const INITIAL_BALL_SPEED = 80
 | 
				
			||||||
 | 
					var ball_speed = INITIAL_BALL_SPEED
 | 
				
			||||||
 | 
					var screen_size = Vector2(640,400)
 | 
				
			||||||
 | 
					#default ball direction
 | 
				
			||||||
 | 
					var direction = Vector2(-1,0)
 | 
				
			||||||
 | 
					var pad_size = Vector2(8,32)
 | 
				
			||||||
 | 
					const PAD_SPEED = 150
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _process(delta):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# get ball positio and pad rectangles
 | 
				
			||||||
 | 
						var ball_pos = get_node("ball").get_pos()
 | 
				
			||||||
 | 
						var left_rect = Rect2( get_node("left").get_pos() - pad_size*0.5, pad_size )
 | 
				
			||||||
 | 
						var right_rect = Rect2( get_node("right").get_pos() - pad_size*0.5, pad_size )
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						#integrate new ball postion
 | 
				
			||||||
 | 
						ball_pos+=direction*ball_speed*delta
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						#flip when touching roof or floor
 | 
				
			||||||
 | 
						if ( (ball_pos.y<0 and direction.y <0) or (ball_pos.y>screen_size.y and direction.y>0)):
 | 
				
			||||||
 | 
							direction.y = -direction.y
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						#flip, change direction and increase speed when touching pads	
 | 
				
			||||||
 | 
						if ( (left_rect.has_point(ball_pos) and direction.x < 0) or (right_rect.has_point(ball_pos) and direction.x > 0)):
 | 
				
			||||||
 | 
							direction.x=-direction.x
 | 
				
			||||||
 | 
							ball_speed*=1.1
 | 
				
			||||||
 | 
							direction.y=randf()*2.0-1
 | 
				
			||||||
 | 
							direction = direction.normalized()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#check gameover
 | 
				
			||||||
 | 
						if (ball_pos.x<0 or ball_pos.x>screen_size.x):
 | 
				
			||||||
 | 
							ball_pos=screen_size*0.5
 | 
				
			||||||
 | 
							ball_speed=INITIAL_BALL_SPEED
 | 
				
			||||||
 | 
							direction=Vector2(-1,0)
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
											
 | 
				
			||||||
 | 
						get_node("ball").set_pos(ball_pos)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#move left pad	
 | 
				
			||||||
 | 
						var left_pos = get_node("left").get_pos()
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (left_pos.y > 0 and Input.is_action_pressed("left_move_up")):
 | 
				
			||||||
 | 
							left_pos.y+=-PAD_SPEED*delta
 | 
				
			||||||
 | 
						if (left_pos.y < screen_size.y and Input.is_action_pressed("left_move_down")):
 | 
				
			||||||
 | 
							left_pos.y+=PAD_SPEED*delta
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						get_node("left").set_pos(left_pos)
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						#move right pad	
 | 
				
			||||||
 | 
						var right_pos = get_node("right").get_pos()
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (right_pos.y > 0 and Input.is_action_pressed("right_move_up")):
 | 
				
			||||||
 | 
							right_pos.y+=-PAD_SPEED*delta
 | 
				
			||||||
 | 
						if (right_pos.y < screen_size.y and Input.is_action_pressed("right_move_down")):
 | 
				
			||||||
 | 
							right_pos.y+=PAD_SPEED*delta
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						get_node("right").set_pos(right_pos)
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _ready():
 | 
				
			||||||
 | 
						screen_size = get_viewport_rect().size # get actual size
 | 
				
			||||||
 | 
						pad_size = get_node("left").get_texture().get_size()
 | 
				
			||||||
 | 
						set_process(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										21
									
								
								samples/Graph Modeling Language/sample.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								samples/Graph Modeling Language/sample.gml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					graph
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  directed 0
 | 
				
			||||||
 | 
					  node
 | 
				
			||||||
 | 
					  [
 | 
				
			||||||
 | 
					    id 0
 | 
				
			||||||
 | 
					    label "Node 1"
 | 
				
			||||||
 | 
					    value 100
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					  node
 | 
				
			||||||
 | 
					  [
 | 
				
			||||||
 | 
					    id 1
 | 
				
			||||||
 | 
					    label "Node 2"
 | 
				
			||||||
 | 
					    value 200
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					  edge
 | 
				
			||||||
 | 
					  [
 | 
				
			||||||
 | 
					    source 1
 | 
				
			||||||
 | 
					    target 0
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										13
									
								
								samples/Groff/sample.4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/Groff/sample.4
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					.TH FOO 1
 | 
				
			||||||
 | 
					.SH NAME
 | 
				
			||||||
 | 
					foo \- bar
 | 
				
			||||||
 | 
					.SH SYNOPSIS
 | 
				
			||||||
 | 
					.B foo
 | 
				
			||||||
 | 
					.I bar
 | 
				
			||||||
 | 
					.SH DESCRIPTION
 | 
				
			||||||
 | 
					Foo bar
 | 
				
			||||||
 | 
					.BR baz
 | 
				
			||||||
 | 
					quux.
 | 
				
			||||||
 | 
					.PP
 | 
				
			||||||
 | 
					.B Foo
 | 
				
			||||||
 | 
					bar baz.
 | 
				
			||||||
							
								
								
									
										12
									
								
								samples/JavaScript/jsbuild.jsb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								samples/JavaScript/jsbuild.jsb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					jsb.library('mylibrary', jsb.STATIC_LIBRARY, function(libObject) {
 | 
				
			||||||
 | 
					    libObject.outputName = 'mylibrary';
 | 
				
			||||||
 | 
					    libObject.cflags = [ '-Wall' ];
 | 
				
			||||||
 | 
					    libObject.ldflags = [ '-pthread' ];
 | 
				
			||||||
 | 
					    libObject.includePaths = [ 'src/include' ];
 | 
				
			||||||
 | 
					    libObject.sources = [ 
 | 
				
			||||||
 | 
					        'src/main.cpp',
 | 
				
			||||||
 | 
					        'src/app.cpp'
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jsb.build();
 | 
				
			||||||
							
								
								
									
										193
									
								
								samples/Pascal/custforms.pp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								samples/Pascal/custforms.pp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,193 @@
 | 
				
			|||||||
 | 
					unit custforms;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{$mode objfpc}{$H+}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uses
 | 
				
			||||||
 | 
					  Classes, SysUtils, Forms;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  { TCustomFormDescr }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  TCustomFormDescr = Class
 | 
				
			||||||
 | 
					  private
 | 
				
			||||||
 | 
					    FAuthor: String;
 | 
				
			||||||
 | 
					    FCaption: String;
 | 
				
			||||||
 | 
					    FCategory: String;
 | 
				
			||||||
 | 
					    FDescription: String;
 | 
				
			||||||
 | 
					    FFormClass: TFormClass;
 | 
				
			||||||
 | 
					    FLazPackage: String;
 | 
				
			||||||
 | 
					    FUnitName: String;
 | 
				
			||||||
 | 
					  public
 | 
				
			||||||
 | 
					    Constructor Create(AFormClass : TFormClass; const APackage: string);
 | 
				
			||||||
 | 
					    Constructor Create(AFormClass : TFormClass; Const ACaption,ADescription,AUnit,APackage : String);
 | 
				
			||||||
 | 
					    Property FormClass : TFormClass Read FFormClass Write FFormClass;
 | 
				
			||||||
 | 
					    Property Caption : String Read FCaption Write FCaption;
 | 
				
			||||||
 | 
					    Property Description : String Read FDescription Write FDescription;
 | 
				
			||||||
 | 
					    Property UnitName : String Read FUnitName Write FUnitName;
 | 
				
			||||||
 | 
					    Property Category : String Read FCategory Write FCategory;
 | 
				
			||||||
 | 
					    Property Author : String Read FAuthor Write FAuthor;
 | 
				
			||||||
 | 
					    Property LazPackage : String Read FLazPackage Write FLazPackage;
 | 
				
			||||||
 | 
					  end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Procedure RegisterCustomForm(Descr : TCustomFormDescr);
 | 
				
			||||||
 | 
					Procedure RegisterCustomForm(AFormClass : TFormClass; const APackage: string);
 | 
				
			||||||
 | 
					Procedure RegisterCustomForm(AFormClass : TFormClass; Const AUnitName, APackage : String);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Procedure Register;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					implementation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uses ProjectIntf,NewItemIntf,contnrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Const
 | 
				
			||||||
 | 
					  SAppFrameWork = 'Custom forms';
 | 
				
			||||||
 | 
					  SInstanceOf   = 'Create a new instance of %s';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ TCustomFormDescr }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					constructor TCustomFormDescr.Create(AFormClass: TFormClass;
 | 
				
			||||||
 | 
					  const APackage: string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Var
 | 
				
			||||||
 | 
					  N,U : String;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  N:=AFormClass.ClassName;
 | 
				
			||||||
 | 
					  U:=N;
 | 
				
			||||||
 | 
					  If (Upcase(U[1])='T') then
 | 
				
			||||||
 | 
					    Delete(U,1,1);
 | 
				
			||||||
 | 
					  Create(AFormClass,N,Format(SInstanceOf,[N]),U,APackage);
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					constructor TCustomFormDescr.Create(AFormClass: TFormClass;
 | 
				
			||||||
 | 
					  const ACaption, ADescription, AUnit, APackage: String);
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  FFormClass:=AFormClass;
 | 
				
			||||||
 | 
					  FCaption:=ACaption;
 | 
				
			||||||
 | 
					  FDescription:=ADescription;
 | 
				
			||||||
 | 
					  FUnitName:=AUnit;
 | 
				
			||||||
 | 
					  FCategory:=SAppFrameWork;
 | 
				
			||||||
 | 
					  FLazPackage:=APackage;
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Registration code.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Type
 | 
				
			||||||
 | 
					  { TCustomFormFileDescriptor }
 | 
				
			||||||
 | 
					  TCustomFormFileDescriptor = Class(TFileDescPascalUnitWithResource)
 | 
				
			||||||
 | 
					  private
 | 
				
			||||||
 | 
					    FFormDescr: TCustomFormDescr;
 | 
				
			||||||
 | 
					  Public
 | 
				
			||||||
 | 
					    Constructor Create(ADescr : TCustomFormDescr);
 | 
				
			||||||
 | 
					    Property FormDescr : TCustomFormDescr Read FFormDescr;
 | 
				
			||||||
 | 
					    Function GetLocalizedName : String; override;
 | 
				
			||||||
 | 
					    Function GetLocalizedDescription : String; override;
 | 
				
			||||||
 | 
					    Function GetInterfaceUsesSection : String; override;
 | 
				
			||||||
 | 
					  end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ TCustomFormFileDescriptor }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					constructor TCustomFormFileDescriptor.Create(ADescr: TCustomFormDescr);
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  Inherited Create;
 | 
				
			||||||
 | 
					  FFormDescr:=ADescr;
 | 
				
			||||||
 | 
					  ResourceClass:=FFormDescr.FFormClass;
 | 
				
			||||||
 | 
					  Name:=FFormDescr.Caption;
 | 
				
			||||||
 | 
					  RequiredPackages:=ADescr.LazPackage;
 | 
				
			||||||
 | 
					  //Writeln('TCustomFormFileDescriptor.Create RequiredPackages=',RequiredPackages);
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function TCustomFormFileDescriptor.GetLocalizedName: String;
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  Result:=FFormDescr.Caption;
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function TCustomFormFileDescriptor.GetLocalizedDescription: String;
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  Result:=FFormDescr.Description;
 | 
				
			||||||
 | 
					  If (FFormDescr.Author<>'') then
 | 
				
			||||||
 | 
					    Result:=Result+LineEnding+'By '+FFormDescr.Author;
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function TCustomFormFileDescriptor.GetInterfaceUsesSection: String;
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  Result:=inherited GetInterfaceUsesSection;
 | 
				
			||||||
 | 
					  Result:=Result+',Forms,'+FFormDescr.UnitName;
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Var
 | 
				
			||||||
 | 
					  CustomFormList : TObjectList;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Procedure RegisterCustomForm(Descr : TCustomFormDescr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  CustomFormList.Add(Descr);
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Procedure RegisterCustomForm(AFormClass : TFormClass; const APackage: string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  RegisterCustomForm(TCustomFormDescr.Create(AFormClass,APackage));
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Procedure RegisterCustomForm(AFormClass : TFormClass; Const AUnitName, APackage : String);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Var
 | 
				
			||||||
 | 
					  D : TCustomFormDescr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  D:=TCustomFormDescr.Create(AFormClass,APackage);
 | 
				
			||||||
 | 
					  D.UnitName:=AUnitName;
 | 
				
			||||||
 | 
					  RegisterCustomForm(D);
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Procedure Register;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Var
 | 
				
			||||||
 | 
					  L : TStringList;
 | 
				
			||||||
 | 
					  I : Integer;
 | 
				
			||||||
 | 
					  D : TCustomFormDescr;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  L:=TStringList.Create;
 | 
				
			||||||
 | 
					  Try
 | 
				
			||||||
 | 
					    L.Sorted:=True;
 | 
				
			||||||
 | 
					    L.Duplicates:=dupIgnore;
 | 
				
			||||||
 | 
					    For I:=0 to CustomFormList.Count-1 do
 | 
				
			||||||
 | 
					      L.Add(TCustomFormDescr(CustomFormList[i]).Category);
 | 
				
			||||||
 | 
					    For I:=0 to L.Count-1 do
 | 
				
			||||||
 | 
					    begin
 | 
				
			||||||
 | 
					      RegisterNewItemCategory(TNewIDEItemCategory.Create(L[i]));
 | 
				
			||||||
 | 
					    end;
 | 
				
			||||||
 | 
					  Finally
 | 
				
			||||||
 | 
					    L.Free;
 | 
				
			||||||
 | 
					  end;
 | 
				
			||||||
 | 
					  For I:=0 to CustomFormList.Count-1 do
 | 
				
			||||||
 | 
					    begin
 | 
				
			||||||
 | 
					    D:=TCustomFormDescr(CustomFormList[i]);
 | 
				
			||||||
 | 
					    RegisterProjectFileDescriptor(TCustomFormFileDescriptor.Create(D),D.Category);
 | 
				
			||||||
 | 
					    end;
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Procedure InitCustomForms;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  CustomFormList:=TObjectList.Create;
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Procedure DoneCustomForms;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  FreeAndNil(CustomFormList);
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Initialization
 | 
				
			||||||
 | 
					  InitCustomForms;
 | 
				
			||||||
 | 
					Finalization
 | 
				
			||||||
 | 
					  DoneCustomForms;
 | 
				
			||||||
 | 
					end.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										51
									
								
								samples/Pascal/gtkextra.pp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								samples/Pascal/gtkextra.pp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					{ $Id$ }
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					 gtkextra.pp  -  GTK(2) widgetset - additional gdk/gtk functions
 | 
				
			||||||
 | 
					 ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 This unit contains missing gdk/gtk functions and defines for certain 
 | 
				
			||||||
 | 
					 versions of gtk or fpc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 @created(Sun Jan 28th WET 2006)
 | 
				
			||||||
 | 
					 @lastmod($Date$)
 | 
				
			||||||
 | 
					 @author(Marc Weustink <marc@@dommelstein.nl>)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 *****************************************************************************
 | 
				
			||||||
 | 
					  This file is part of the Lazarus Component Library (LCL)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  See the file COPYING.modifiedLGPL.txt, included in this distribution,
 | 
				
			||||||
 | 
					  for details about the license.
 | 
				
			||||||
 | 
					 *****************************************************************************
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unit GtkExtra;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{$mode objfpc}{$H+}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{$I gtkdefines.inc}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{$ifdef gtk1}
 | 
				
			||||||
 | 
					{$I gtk1extrah.inc}
 | 
				
			||||||
 | 
					{$endif}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{$ifdef gtk2}
 | 
				
			||||||
 | 
					{$I gtk2extrah.inc}
 | 
				
			||||||
 | 
					{$endif}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					implementation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{$ifdef gtk1}
 | 
				
			||||||
 | 
					{$I gtk1extra.inc}
 | 
				
			||||||
 | 
					{$endif}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{$ifdef gtk2}
 | 
				
			||||||
 | 
					{$I gtk2extra.inc}
 | 
				
			||||||
 | 
					{$endif}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					end.
 | 
				
			||||||
							
								
								
									
										68
									
								
								samples/Prolog/logic-problem.pro
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								samples/Prolog/logic-problem.pro
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,68 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Question 1.1
 | 
				
			||||||
 | 
					 * combiner(+Buddies, -Pairs)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					combiner([], []).
 | 
				
			||||||
 | 
					combiner([First|Buddies], Pairs):-
 | 
				
			||||||
 | 
						make_pairs(First, Buddies, Pairs1),
 | 
				
			||||||
 | 
						combiner(Buddies, Pairs2),
 | 
				
			||||||
 | 
						concat(Pairs1, Pairs2, Pairs).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * make_pairs(+Buddy, +Buddies, -Pairs)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					make_pairs(Buddy, [], []).
 | 
				
			||||||
 | 
					make_pairs(Buddy, [First|Buddies], [(Buddy, First)|Pairs]):-
 | 
				
			||||||
 | 
						make_pairs(Buddy, Buddies, Pairs).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * concat(+X, +Y, ?T)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					concat([], Y, Y).
 | 
				
			||||||
 | 
					concat([P|R], Y, [P|T]):-
 | 
				
			||||||
 | 
						concat(R, Y, T).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Question 1.2
 | 
				
			||||||
 | 
					 * extraire(+AllPossiblePairs, +NbPairs, -Tp, -RemainingPairs)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					extraire(AllPossiblePairs, 0, [], AllPossiblePairs).
 | 
				
			||||||
 | 
					extraire([PossiblePair|AllPossiblePairs], NbPairs, [PossiblePair|Tp], NewRemainingPairs):-
 | 
				
			||||||
 | 
						NbPairs > 0,
 | 
				
			||||||
 | 
						NewNbPairs is NbPairs - 1,
 | 
				
			||||||
 | 
						extraire(AllPossiblePairs, NewNbPairs, Tp, RemainingPairs),
 | 
				
			||||||
 | 
						not(pair_in_array(PossiblePair, Tp)),
 | 
				
			||||||
 | 
						delete_pair(RemainingPairs, PossiblePair, NewRemainingPairs).
 | 
				
			||||||
 | 
					extraire([PossiblePair|AllPossiblePairs], NbPairs, Tp, [PossiblePair|RemainingPairs]):-
 | 
				
			||||||
 | 
						NbPairs > 0,
 | 
				
			||||||
 | 
						extraire(AllPossiblePairs, NbPairs, Tp, RemainingPairs),
 | 
				
			||||||
 | 
						pair_in_array(PossiblePair, Tp).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * delete_pair(+Pairs, +Pair, -PairsWithoutPair)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					delete_pair([], _, []).
 | 
				
			||||||
 | 
					delete_pair([Pair|Pairs], Pair, Pairs):-!.
 | 
				
			||||||
 | 
					delete_pair([FirstPair|Pairs], Pair, [FirstPair|PairsWithoutPair]):-
 | 
				
			||||||
 | 
						delete_pair(Pairs, Pair, PairsWithoutPair).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * pair_in_array(+Pair, +Pairs)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					pair_in_array((A, B), [(C, D)|Pairs]):-
 | 
				
			||||||
 | 
						(A == C ; B == D ; A == D ; B == C),
 | 
				
			||||||
 | 
						!.
 | 
				
			||||||
 | 
					pair_in_array(Pair, [FirstPair|Pairs]):-
 | 
				
			||||||
 | 
						pair_in_array(Pair, Pairs).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Question 1.3
 | 
				
			||||||
 | 
					 * les_tps(+Buddies, -Tps)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					les_tps(Buddies, Tps):-
 | 
				
			||||||
 | 
						combiner(Buddies, PossiblePairs),
 | 
				
			||||||
 | 
						length(Buddies, NbBuddies),
 | 
				
			||||||
 | 
						NbPairs is integer(NbBuddies / 2),
 | 
				
			||||||
 | 
						findall(Tp, extraire(PossiblePairs, NbPairs, Tp, _), Tps).
 | 
				
			||||||
							
								
								
									
										26
									
								
								samples/Puppet/expiringhost.pp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								samples/Puppet/expiringhost.pp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					define example::expiringhost($ip, $timestamp) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Calculate the age of this resource by comparing 'now' against $timestamp
 | 
				
			||||||
 | 
					  $age = inline_template("<%= require 'time'; Time.now - Time.parse(timestamp) %>")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Max age, in seconds.
 | 
				
			||||||
 | 
					  $maxage = 60
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if $age > $maxage {
 | 
				
			||||||
 | 
					    $expired = true
 | 
				
			||||||
 | 
					    notice("Expiring resource $class[$name] due to age > $maxage (actual: $age)")
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    $expired = false
 | 
				
			||||||
 | 
					    notice("Found recently-active $class[$name] (age: $age)")
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # I set target to a /tmp path so you can run this example as non-root.
 | 
				
			||||||
 | 
					  # In production, you probabyl won't set target as it defaults to /etc/hosts
 | 
				
			||||||
 | 
					  # (or wherever puppet thinks your platform wants it)
 | 
				
			||||||
 | 
					  host {
 | 
				
			||||||
 | 
					    $name:
 | 
				
			||||||
 | 
					      ip => $ip,
 | 
				
			||||||
 | 
					      target => "/tmp/expiring-hosts-example-output",
 | 
				
			||||||
 | 
					      ensure => $expired ? { true => absent, false => present };
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										26
									
								
								samples/Puppet/stages-example.pp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								samples/Puppet/stages-example.pp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					class foo {
 | 
				
			||||||
 | 
					  notify {
 | 
				
			||||||
 | 
					    "foo": ;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class bar {
 | 
				
			||||||
 | 
					  notify {
 | 
				
			||||||
 | 
					    "bar": ;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					node default {
 | 
				
			||||||
 | 
					  stage {
 | 
				
			||||||
 | 
					    "one": ;
 | 
				
			||||||
 | 
					    "two": ;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  class {
 | 
				
			||||||
 | 
					    "foo": stage => "one";
 | 
				
			||||||
 | 
					    "bar": stage => "two";
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Stage["one"] -> Stage["two"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										22
									
								
								samples/Puppet/unmanaged-notify-puppet25.pp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								samples/Puppet/unmanaged-notify-puppet25.pp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					# Manually manage /tmp/original
 | 
				
			||||||
 | 
					# Each puppet run will copy it to /tmp/flag if there's a change and notify
 | 
				
			||||||
 | 
					# the exec when it changes.
 | 
				
			||||||
 | 
					# 
 | 
				
			||||||
 | 
					# The idea here is you might need (in some case) to manually manage a file outside
 | 
				
			||||||
 | 
					# of puppet (in this case, "/tmp/original"). Using this example, you can make puppet
 | 
				
			||||||
 | 
					# signal other parts of your catalog based on changes to that file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					file {
 | 
				
			||||||
 | 
					  # This will, when different, copy /tmp/original to /tmp/flag and notify our
 | 
				
			||||||
 | 
					  # exec.
 | 
				
			||||||
 | 
					  "/tmp/flag":
 | 
				
			||||||
 | 
					    source => "file:///tmp/original",
 | 
				
			||||||
 | 
					    notify => Exec["hello world"];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exec {
 | 
				
			||||||
 | 
					  "hello world":
 | 
				
			||||||
 | 
					    command => "/bin/echo hello world",
 | 
				
			||||||
 | 
					    refreshonly => true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -262,6 +262,10 @@ class TestBlob < Test::Unit::TestCase
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert Linguist::Generated.generated?("node_modules/grunt/lib/grunt.js", nil)
 | 
					    assert Linguist::Generated.generated?("node_modules/grunt/lib/grunt.js", nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Godep saved dependencies
 | 
				
			||||||
 | 
					    assert blob("Godeps/Godeps.json").generated?
 | 
				
			||||||
 | 
					    assert blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").generated?
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def test_vendored
 | 
					  def test_vendored
 | 
				
			||||||
@@ -279,6 +283,10 @@ class TestBlob < Test::Unit::TestCase
 | 
				
			|||||||
    assert blob("app/bower_components/custom/custom.js").vendored?
 | 
					    assert blob("app/bower_components/custom/custom.js").vendored?
 | 
				
			||||||
    assert blob("vendor/assets/bower_components/custom/custom.js").vendored?
 | 
					    assert blob("vendor/assets/bower_components/custom/custom.js").vendored?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Go dependencies
 | 
				
			||||||
 | 
					    assert !blob("Godeps/Godeps.json").vendored?
 | 
				
			||||||
 | 
					    assert blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").vendored?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Rails vendor/
 | 
					    # Rails vendor/
 | 
				
			||||||
    assert blob("vendor/plugins/will_paginate/lib/will_paginate.rb").vendored?
 | 
					    assert blob("vendor/plugins/will_paginate/lib/will_paginate.rb").vendored?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -437,6 +445,12 @@ class TestBlob < Test::Unit::TestCase
 | 
				
			|||||||
    assert blob("octicons.css").vendored?
 | 
					    assert blob("octicons.css").vendored?
 | 
				
			||||||
    assert blob("public/octicons.min.css").vendored?
 | 
					    assert blob("public/octicons.min.css").vendored?
 | 
				
			||||||
    assert blob("public/octicons/sprockets-octicons.scss").vendored?
 | 
					    assert blob("public/octicons/sprockets-octicons.scss").vendored?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Typesafe Activator
 | 
				
			||||||
 | 
					    assert blob("activator").vendored?
 | 
				
			||||||
 | 
					    assert blob("activator.bat").vendored?
 | 
				
			||||||
 | 
					    assert blob("subproject/activator").vendored?
 | 
				
			||||||
 | 
					    assert blob("subproject/activator.bat").vendored?
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def test_language
 | 
					  def test_language
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,12 +44,12 @@ class TestClassifier < Test::Unit::TestCase
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def test_instance_classify_empty
 | 
					  def test_instance_classify_empty
 | 
				
			||||||
    results = Classifier.classify(Samples::DATA, "")
 | 
					    results = Classifier.classify(Samples.cache, "")
 | 
				
			||||||
    assert results.first[1] < 0.5, results.first.inspect
 | 
					    assert results.first[1] < 0.5, results.first.inspect
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def test_instance_classify_nil
 | 
					  def test_instance_classify_nil
 | 
				
			||||||
    assert_equal [], Classifier.classify(Samples::DATA, nil)
 | 
					    assert_equal [], Classifier.classify(Samples.cache, nil)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def test_classify_ambiguous_languages
 | 
					  def test_classify_ambiguous_languages
 | 
				
			||||||
@@ -58,7 +58,7 @@ class TestClassifier < Test::Unit::TestCase
 | 
				
			|||||||
      languages = Language.find_by_filename(sample[:path]).map(&:name)
 | 
					      languages = Language.find_by_filename(sample[:path]).map(&:name)
 | 
				
			||||||
      next unless languages.length > 1
 | 
					      next unless languages.length > 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      results = Classifier.classify(Samples::DATA, File.read(sample[:path]), languages)
 | 
					      results = Classifier.classify(Samples.cache, File.read(sample[:path]), languages)
 | 
				
			||||||
      assert_equal language.name, results.first[0], "#{sample[:path]}\n#{results.inspect}"
 | 
					      assert_equal language.name, results.first[0], "#{sample[:path]}\n#{results.inspect}"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -65,6 +65,18 @@ class TestHeuristcs < Test::Unit::TestCase
 | 
				
			|||||||
    assert_equal Language["ECL"], results.first
 | 
					    assert_equal Language["ECL"], results.first
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def test_pro_prolog_by_heuristics
 | 
				
			||||||
 | 
					    languages = ["IDL", "Prolog"]
 | 
				
			||||||
 | 
					    results = Heuristics.disambiguate_pro(fixture("Prolog/logic-problem.pro"), languages)
 | 
				
			||||||
 | 
					    assert_equal Language["Prolog"], results.first
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def test_pro_idl_by_heuristics
 | 
				
			||||||
 | 
					    languages = ["IDL", "Prolog"]
 | 
				
			||||||
 | 
					    results = Heuristics.disambiguate_pro(fixture("IDL/mg_acosh.pro"), languages)
 | 
				
			||||||
 | 
					    assert_equal Language["IDL"], results.first
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def test_ts_typescript_by_heuristics
 | 
					  def test_ts_typescript_by_heuristics
 | 
				
			||||||
    languages = ["TypeScript", "XML"]
 | 
					    languages = ["TypeScript", "XML"]
 | 
				
			||||||
    results = Heuristics.disambiguate_ts(fixture("TypeScript/classes.ts"), languages)
 | 
					    results = Heuristics.disambiguate_ts(fixture("TypeScript/classes.ts"), languages)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
require 'linguist/repository'
 | 
					require 'linguist/repository'
 | 
				
			||||||
 | 
					require 'linguist/lazy_blob'
 | 
				
			||||||
require 'test/unit'
 | 
					require 'test/unit'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestRepository < Test::Unit::TestCase
 | 
					class TestRepository < Test::Unit::TestCase
 | 
				
			||||||
@@ -47,4 +47,45 @@ class TestRepository < Test::Unit::TestCase
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    assert_equal linguist_repo.cache, new_repo.cache
 | 
					    assert_equal linguist_repo.cache, new_repo.cache
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def test_repo_git_attributes
 | 
				
			||||||
 | 
					    # See https://github.com/github/linguist/blob/351c1cc8fd57340839bdb400d7812332af80e9bd/.gitattributes
 | 
				
			||||||
 | 
					    #
 | 
				
			||||||
 | 
					    # It looks like this:
 | 
				
			||||||
 | 
					    # Gemfile linguist-vendored=true
 | 
				
			||||||
 | 
					    # lib/linguist.rb linguist-language=Java
 | 
				
			||||||
 | 
					    # test/*.rb linguist-language=Java
 | 
				
			||||||
 | 
					    # Rakefile linguist-generated
 | 
				
			||||||
 | 
					    # test/fixtures/* linguist-vendored=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    attr_commit = '351c1cc8fd57340839bdb400d7812332af80e9bd'
 | 
				
			||||||
 | 
					    repo = linguist_repo(attr_commit)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert repo.breakdown_by_file.has_key?("Java")
 | 
				
			||||||
 | 
					    assert repo.breakdown_by_file["Java"].include?("lib/linguist.rb")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert repo.breakdown_by_file.has_key?("Ruby")
 | 
				
			||||||
 | 
					    assert !repo.breakdown_by_file["Ruby"].empty?
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def test_linguist_override_vendored?
 | 
				
			||||||
 | 
					    attr_commit = '351c1cc8fd57340839bdb400d7812332af80e9bd'
 | 
				
			||||||
 | 
					    repo = linguist_repo(attr_commit).read_index
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override_vendored = Linguist::LazyBlob.new(rugged_repository, attr_commit, 'Gemfile')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # overridden .gitattributes
 | 
				
			||||||
 | 
					    assert override_vendored.vendored?
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def test_linguist_override_unvendored?
 | 
				
			||||||
 | 
					    attr_commit = '351c1cc8fd57340839bdb400d7812332af80e9bd'
 | 
				
			||||||
 | 
					    repo = linguist_repo(attr_commit).read_index
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # lib/linguist/vendor.yml defines this as vendored.
 | 
				
			||||||
 | 
					    override_unvendored = Linguist::LazyBlob.new(rugged_repository, attr_commit, 'test/fixtures/foo.rb')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # overridden .gitattributes
 | 
				
			||||||
 | 
					    assert !override_unvendored.vendored?
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@ class TestSamples < Test::Unit::TestCase
 | 
				
			|||||||
  include Linguist
 | 
					  include Linguist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def test_up_to_date
 | 
					  def test_up_to_date
 | 
				
			||||||
    assert serialized = Samples::DATA
 | 
					    assert serialized = Samples.cache
 | 
				
			||||||
    assert latest = Samples.data
 | 
					    assert latest = Samples.data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Just warn, it shouldn't scare people off by breaking the build.
 | 
					    # Just warn, it shouldn't scare people off by breaking the build.
 | 
				
			||||||
@@ -29,7 +29,7 @@ class TestSamples < Test::Unit::TestCase
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def test_verify
 | 
					  def test_verify
 | 
				
			||||||
    assert data = Samples::DATA
 | 
					    assert data = Samples.cache
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert_equal data['languages_total'], data['languages'].inject(0) { |n, (_, c)| n += c }
 | 
					    assert_equal data['languages_total'], data['languages'].inject(0) { |n, (_, c)| n += c }
 | 
				
			||||||
    assert_equal data['tokens_total'], data['language_tokens'].inject(0) { |n, (_, c)| n += c }
 | 
					    assert_equal data['tokens_total'], data['language_tokens'].inject(0) { |n, (_, c)| n += c }
 | 
				
			||||||
@@ -38,7 +38,7 @@ class TestSamples < Test::Unit::TestCase
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  # Check that there aren't samples with extensions that aren't explicitly defined in languages.yml
 | 
					  # Check that there aren't samples with extensions that aren't explicitly defined in languages.yml
 | 
				
			||||||
  def test_parity
 | 
					  def test_parity
 | 
				
			||||||
    extensions = Samples::DATA['extnames']
 | 
					    extensions = Samples.cache['extnames']
 | 
				
			||||||
    languages_yml = File.expand_path("../../lib/linguist/languages.yml", __FILE__)
 | 
					    languages_yml = File.expand_path("../../lib/linguist/languages.yml", __FILE__)
 | 
				
			||||||
    languages = YAML.load_file(languages_yml)
 | 
					    languages = YAML.load_file(languages_yml)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user