Development/GetInvolved/DeveloperStepByStep/javapython/tr

    From The Document Foundation Wiki


    Java birim testlerini Python için dönüştürmek

    Unittestlerimizin kurulumunu basitleştirmek için Java tabanlı bütün unittestleri python tabanlı testlere dönüştürmeye karar verildi.

    UNO arayüzü(LibreOffice için evrensel arayüz) hakkında bilgi edinmek isteyen geliştiriciler, bir kaç yama göndermeyi tavsiye ettiler.

    Onları dönüştürme sırasında tuzaklar ile karşılaşıyoruz. Bu sayfada bazı konularda ortak yardım sağlanmaya çalışıldı. Özel konularda yardım için lütfen bizimle iletişime geçin freenode #libreoffice-dev IRC:// üzerinden veya email yoluyla.

    Birim testlerin yerini bulmak için

    Tüm testler <module>/qa/* dizini altında bulunabilir.

    Bu başarılı bir yama örneğidir: gerrit patch

    İlgili yapılandırma dosyaları

    Burada değiştirmeniz gereken iki tane yapılandırma dosyası bulunuyor:

    • <module>/qa/Junittest_<module>_<foo>.mk Bu dosyada dönüştürdüğünüz java dosyası için referansı silmeyi unutmayın.
    • <module>/qa/PythonTest_<module>_<foo>.mk Normalde iki yerde yeni dosya eklemeye ihtiyacınız var.

    Java dosyasını sil

    • <module>/qa/*/<foo>.java

    Python dosyasını ekle

    • <module>/qa/python/<foo>.py

    Kodu çevirmek için ipuçları

    Aşağıdakiler tipik çeviri problemlerinin listesi:

    Güçlü yazılmış dillere karşı (java) dinamik olarak yazılan diller (python)

    Aşağıdaki yapıya dinamik olarak yazılmış diller için çoğunlukla ihtiyacınız olmayacak Python veya StarBasic gibi, bu yalnızca statik olarak yazılmış diller içindir Java ve C++ gibi.

    Tipik Java yapısı:

     m_xMsf = UnoRuntime.queryInterface(
              XMultiServiceFactory.class,
              connection.getComponentContext().getServiceManager());
    

    Genelde UNO içinde arabirimler için referanslar üzerinde fonksiyon çağrımı ile iletişim kuruluyor, referanslar servisler veya uygulamalar için değildir.

    Björn LibreOffice konferansında bu konu hakkında konuşma yaptı, lütfen bu konferansın ilk beş dakikasını izleyin. conference video.

    Diğer Java Örneği:

       XTextCursor xParaCrsr = xText.createTextCursor();
       XTextRange xParaCrsrAsRange = UnoRuntime.queryInterface(
                                         XTextRange.class, xParaCrsr);
                                         xText.insertControlCharacter(xParaCrsrAsRange,
                                           com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, false);
    

    İlk satırda:

       XTextCursor xParaCrsr = xText.createTextCursor();
    

    Belgelere göre: doc

    com::sun::star::text::XTextCursor.createTextCursor() Verilen text içeriğinde gezinip kullanılabilecek, TextCursor servisinden yeni bir örnek dönüyor.

    Bu da demek oluyor ki, com::sun::star::text::TextCursor servisinin com::sun::star::text:XTextCursor arayüzü için size bir referans verir. Not, Servis ve arayüz arasında bir fark olduğunu da unutmayın.

    Buna rağmen buradan: XSimpleText

    Biliyoruz ki insertControlCharacter(..) için com::sun::star::text::XTextRange referansını ilk parametre olarak vermeliyiz, ancak com::sun::star::text::XTextCursor bunu referans vermiyoruz, farkları budur.

    createTextCursor(..)'nın belgelerinden biliyoruz ki, com::sun::star::text::XTextRange referansı com::sun::star::text::TextCursor servisini tutuyor ve buradan görebilirsiniz: TextCursor text bu com::sun::star::text::TextCursor servisi ile genişleyen com::sun::star::text::TextRange servisi: TextCursor text bu uygulanan com::sun::star::text::XTextRange arayüzü: textrange

    Bu oldukça kafa karıştırıcı olabilir ama adım adım denediğimizde daha mantıklı olabilir. Birçok UNO belgesi var ve başı ile sonunun eşleşmesi her zaman kolay değildir.

    Bu yüzden:

    - Biz ...text::TextCursor servisi için ...text::XTextCursor referansına sahibiz

    - Biz biliyoruz ...text::TextCursor servisi de ...text::XTextRange arayüzüne uygulanıyor, buna ihtiyacımız var.

    Böylece(Javada) bizim tuttuğumuz com::sun::star::text::XTextCursor için bizim referansımız dışında com::sun::star::text::XTextRange arayüzü için de referans almaya ihtiyacımız var:

       XTextRange xParaCrsrAsRange = UnoRuntime.queryInterface(
                  XTextRange.class, xParaCrsr);
    

    Bununla diyor ki, xParaCrsrAsRange şimdi com::sun::star::text::XTextCursor'ın com::sun::star::text::XTextRange arayüzüne refarans gösterilecek. Böylece biz insertControlCharacter(..) ile çağırabiliriz.


       xText.insertControlCharacter(xParaCrsrAsRange,
            com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, false);
    

    Dinamik olarak yazılan diller örneğin Python ve StarBasic gibi bunlar nasıl çalışıyorlar? Siz orada sadece bir referans tutuyorsunuz, onun için statik yazım ile bağlı olmayan. Böylece kafa karıştırıcı bir dönüşüm yapmadan, onun arkasındaki servis tarafından uygulanan arabirimlerden herhangi birini kullanabilirsin. Eğer bunu yaparsanız:

       XTextCursor xParaCrsr = xText.createTextCursor();
    

    Javada, bir dönüşüm olmadan sadece XTextCursor olarak kullanabilirsin. Eğer bunu yaparsanız:

       xParaCrsr = xText.createTextCursor()
    

    Pythonda, bu şekilde XTextCursor, XWordCursor, XSentenceCursor, XParagraphCursor, XPropertySet, XPropertyState, XMultiPropertyStates, XDocumentInsertable, XSortable bunlara kadar kullanabilirsiniz. Ve böylece basitçe Java kodu için Python eşdeğeri:

     xParaCrsr = xText.createTextCursor()
     xText.insertControlCharacter(xParaCrsr, PARAGRAPH_BREAK, False)
    

    Çünkü tüm dönüşümlerde ve hatta xParaCrsrAsRange değişkeni için de hiç gerek yok. Yani, Python (veya StarBasic) için queryInterface() kullanmaya ihtiyacımız olmayacak