Skip to content

Commit

Permalink
Issue #136: bugfix plus tests. throw error when class cateogyr or met…
Browse files Browse the repository at this point in the history
…hod category are not consistent with the package name
  • Loading branch information
dalehenrich committed Jan 31, 2015
1 parent f8065d7 commit 56d6e56
Show file tree
Hide file tree
Showing 31 changed files with 227 additions and 54 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
utilities
addClassDefinitionFrom: classPropertiesDict comment: classComment
| typeSymbolOrArray |
| typeSymbolOrArray categoryName className |
typeSymbolOrArray := classPropertiesDict at: 'type' ifAbsent: [ 'normal' ].
typeSymbolOrArray isArray
ifTrue: [
Expand All @@ -10,15 +10,17 @@ addClassDefinitionFrom: classPropertiesDict comment: classComment
ifTrue: [ each collect: [ :ea | ea asSymbol ] ]
ifFalse: [ each asSymbol ] ] ]
ifFalse: [ typeSymbolOrArray := typeSymbolOrArray asSymbol ].
className := classPropertiesDict at: 'name'.
categoryName := classPropertiesDict
at: 'category'
ifAbsent: [ self packageNameFromPackageDirectory ].
self validateClassCategory: categoryName for: className.
definitions
add:
(MCClassDefinition
name: (classPropertiesDict at: 'name')
name: className
superclassName: (classPropertiesDict at: 'super')
category:
(classPropertiesDict
at: 'category'
ifAbsent: [ self packageNameFromPackageDirectory ])
category: categoryName
instVarNames: (classPropertiesDict at: 'instvars' ifAbsent: [ #() ])
classVarNames: (classPropertiesDict at: 'classvars' ifAbsent: [ #() ])
poolDictionaryNames: (classPropertiesDict at: 'pools' ifAbsent: [ #() ])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@ addExtensionClassAndMethodDefinitionsFromEntry: classEntry
classPropertiesDict := MCFileTreeJsonParser
parse: fileStream contents decodeFromUTF8 ] ].
methodPropertiesDict := Dictionary new.
(entries
detect: [ :entry | self isMethodPropertyFile: entry ]
ifNone: [ ])
(entries detect: [ :entry | self isMethodPropertyFile: entry ] ifNone: [ ])
ifNotNil: [ :propertyEntry |
propertyEntry
readStreamDo: [ :fileStream |
Expand All @@ -23,3 +21,4 @@ addExtensionClassAndMethodDefinitionsFromEntry: classEntry
addMethodDefinitionsForClass: (classPropertiesDict at: 'name')
methodProperties: methodPropertiesDict
in: entries
extensionMethod: true
Original file line number Diff line number Diff line change
@@ -1,39 +1,7 @@
utilities
addMethodDefinitionsForClass: className methodProperties: methodProperties in: entries
entries
do: [ :entry |
| classIsMeta |
classIsMeta := false.
entry name = 'class'
ifTrue: [ classIsMeta := true ].
(entry name = 'instance' or: [ entry name = 'class' ])
ifTrue: [
((self fileUtils directoryFromEntry: entry) entries
select: [ :each | each name endsWith: '.st' ])
do: [ :methodEntry |
methodEntry
readStreamDo: [ :fileStream |
| category source timestamp selector |
category := fileStream nextLine decodeFromUTF8.
category := category copyFrom: 1 to: category size - 1. "remove newline"
source := fileStream upToEnd decodeFromUTF8.
selector := self methodSelectorFor: source.
timestamp := methodProperties
at:
(classIsMeta
ifTrue: [ 'class' ]
ifFalse: [ 'instance' ])
ifPresent: [ :map | map at: selector asString ifAbsent: [ ] ]. "Issue 33: https://github.com/dalehenrich/filetree/issues/33"
timestamp
ifNil: [
timestamp := self info author , ' ' , self info date mmddyyyy , ' '
, self info time print24 ].
definitions
add:
(MCMethodDefinition
className: className
classIsMeta: classIsMeta
selector: selector
category: category
timeStamp: timestamp
source: source) ] ] ] ]
^ self
addMethodDefinitionsForClass: className
methodProperties: methodProperties
in: entries
extensionMethod: false
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
utilities
addMethodDefinitionsForClass: className methodProperties: methodProperties in: entries extensionMethod: extensionMethod
entries
do: [ :entry |
| classIsMeta |
classIsMeta := false.
entry name = 'class'
ifTrue: [ classIsMeta := true ].
(entry name = 'instance' or: [ entry name = 'class' ])
ifTrue: [
((self fileUtils directoryFromEntry: entry) entries
select: [ :each | each name endsWith: '.st' ])
do: [ :methodEntry |
methodEntry
readStreamDo: [ :fileStream |
| category source timestamp selector |
category := fileStream nextLine decodeFromUTF8.
category := category copyFrom: 1 to: category size - 1. "remove newline"
source := fileStream upToEnd decodeFromUTF8.
selector := self methodSelectorFor: source.
timestamp := methodProperties
at:
(classIsMeta
ifTrue: [ 'class' ]
ifFalse: [ 'instance' ])
ifPresent: [ :map | map at: selector asString ifAbsent: [ ] ]. "Issue 33: https://github.com/dalehenrich/filetree/issues/33"
timestamp
ifNil: [
timestamp := self info author , ' ' , self info date mmddyyyy , ' '
, self info time print24 ].
extensionMethod
ifTrue: [ self validateExtensionMethodCategory: category for: className selector: selector ].
definitions
add:
(MCMethodDefinition
className: className
classIsMeta: classIsMeta
selector: selector
category: category
timeStamp: timestamp
source: source) ] ] ] ]
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
validation
validateClassCategory: categoryName for: className
"https://github.com/dalehenrich/filetree/issues/136"

"class category must match the package name ... guard against manual editing mistakes"

| prefix |
prefix := self packageNameFromPackageDirectory.
(self verifyCategory: categoryName matches: prefix)
ifTrue: [ ^ self ].
self
error:
'Class category name ' , categoryName printString , ' for the class '
, className printString , ' is inconsistent with the package name '
, prefix printString
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
validation
validateExtensionMethodCategory: categoryName for: className selector: selector
"https://github.com/dalehenrich/filetree/issues/136"

"method category must match the package name for extension methods... guard against manual editing mistakes"

"extracted from PackageInfo>>isForeignClassExtension:"

| prefix prefixSize catSize |
prefix := '*' , self packageNameFromPackageDirectory asLowercase.
categoryName
ifNotNil: [
(categoryName isEmpty not
and: [
categoryName first = $*
and: [ self verifyCategory: categoryName matches: prefix ] ])
ifTrue: [ ^ self ] ].
self
error:
'Method protocol ' , categoryName printString , ' for the maethod '
, selector printString , ' in class ' , className printString
, ' is inconsistent with the package name ' , prefix printString
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
validation
verifyCategory: categoryName matches: prefix
"https://github.com/dalehenrich/filetree/issues/136"

"copied from PackageInfo>>category:matches:"

| prefixSize catSize |
categoryName ifNil: [ ^ false ].
catSize := categoryName size.
prefixSize := prefix size.
catSize < prefixSize
ifTrue: [ ^ false ].
(categoryName findString: prefix startingAt: 1 caseSensitive: false) = 1
ifFalse: [ ^ false ].
^ (categoryName at: prefix size + 1 ifAbsent: [ ^ true ]) = $-
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,18 @@
"instance" : {
"addClassAndMethodDefinitionsFromDirectory:" : "dkh 4/4/2012 10:27",
"addClassAndMethodDefinitionsFromEntry:" : "dkh 8/10/2012 13:48",
"addClassDefinitionFrom:comment:" : "dkh 6/27/2012 14:18",
"addExtensionClassAndMethodDefinitionsFromEntry:" : "dkh 8/10/2012 14:00",
"addMethodDefinitionsForClass:methodProperties:in:" : "dkh 8/10/2012 14:01",
"addClassDefinitionFrom:comment:" : "dkh 01/31/2015 06:51",
"addExtensionClassAndMethodDefinitionsFromEntry:" : "dkh 01/31/2015 06:56",
"addMethodDefinitionsForClass:methodProperties:in:" : "dkh 01/31/2015 06:55",
"addMethodDefinitionsForClass:methodProperties:in:extensionMethod:" : "dkh 01/31/2015 06:56",
"basicVersion" : "dkh 6/27/2012 20:19",
"isMethodPropertyFile:" : "dkh 6/16/2013 12:47:20",
"isPropertyFile:" : "dkh 6/16/2013 12:47:20",
"loadDefinitions" : "dkh 5/23/2013 21:05",
"loadPackage" : "dkh 6/27/2012 20:21",
"loadVersionInfo" : "08/08/2013 15:01",
"methodSelectorFor:" : "ChristopheDemarey 5/31/2013 23:28",
"packageNameFromPackageDirectory" : "dkh 8/10/2012 14:55" } }
"packageNameFromPackageDirectory" : "dkh 8/10/2012 14:55",
"validateClassCategory:for:" : "dkh 01/31/2015 07:06",
"validateExtensionMethodCategory:for:selector:" : "dkh 01/31/2015 07:34",
"verifyCategory:matches:" : "dkh 01/31/2015 07:05" } }

Large diffs are not rendered by default.

Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
running
tearDownPackagesList
^ #('Issue136-1' 'Issue136-2')
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
tests
testClassError
| packageName gofer hitError description |
packageName := 'Issue136-1'.
{packageName} do: [ :pn | self deny: (self hasPackage: pn) ].
gofer := Gofer new
disablePackageCache;
repository: (self getTestRepository: 'issue136');
package: packageName;
yourself.
hitError := false.
[ gofer load ]
on: Error
do: [ :ex |
hitError := (description := ex description)
endsWith:
'Class category name ''Issue97'' for the class ''CypressMockIssue97'' is inconsistent with the package name ''Issue136-1''' ].
self assert: hitError description: description
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
tests
testExtensionMethodError
| packageName gofer hitError description |
packageName := 'Issue136-2'.
{packageName} do: [ :pn | self deny: (self hasPackage: pn) ].
gofer := Gofer new
disablePackageCache;
repository: (self getTestRepository: 'issue136');
package: packageName;
yourself.
hitError := false.
[ gofer load ]
on: Error
do: [ :ex |
hitError := (description := ex description)
endsWith:
'Method protocol ''*Issue97'' for the maethod ''isCypressMockIssue97'' in class ''Object'' is inconsistent with the package name ''*issue136-2''' ].
self assert: hitError description: description
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"class" : {
},
"instance" : {
"tearDownPackagesList" : "dkh 01/31/2015 07:31",
"testClassError" : "dkh 01/31/2015 07:46",
"testExtensionMethodError" : "dkh 01/31/2015 07:48" } }
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"category" : "MonticelloFileTree-Tests",
"classinstvars" : [
],
"classvars" : [
],
"commentStamp" : "dkh 01/31/2015 07:22",
"instvars" : [
],
"name" : "MCFileTreeIssue136Test",
"pools" : [
],
"super" : "MCFileTreeGenericLoaderTest",
"type" : "normal" }
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"class" : {
},
"instance" : {
"tearDownPackagesList" : " 08/01/2013 18:35",
"testLoad" : " 08/01/2013 18:46" } }
"tearDownPackagesList" : "08/01/2013 18:35",
"testLoad" : "08/01/2013 18:46" } }

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions tests/testRepositories/issue136/.filetree
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{"packageExtension" : ".package",
"propertyFileExtension" : ".json" }
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This mock contains basic class and instance method selectors
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
accessing
current: anObject
current := anObject
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
accessing
current
^current
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
initialization
initialize
self current: self new
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
accessing
extra
"extra method"
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
initialization
initialize
super initialize.
self name: 'Unknown'
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
accessing
name: aString
name := aString
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
accessing
name
^name
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"category" : "Issue97",
"classinstvars" : [
"current" ],
"classvars" : [
"Something" ],
"instvars" : [
"name" ],
"name" : "CypressMockIssue97",
"pools" : [
],
"super" : "Object" }
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
*Issue97
isCypressMockIssue97

^false
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{
"name" : "Object" }
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{
}

0 comments on commit 56d6e56

Please sign in to comment.